SQLITE3 使用总结(六)

(3)用户自定义函数
可以使用以下的方法来创建用户自定义的SQL函数:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
typedef struct sqlite3_value sqlite3_value;
int sqlite3_create_function(
    sqlite3 *,
    const char *zFunctionName,
    int nArg,
    int eTextRep,
    void*,
    void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
    void (*xStep)(sqlite3_context*,int,sqlite3_value**),
    void (*xFinal)(sqlite3_context*)
   );
  
   int sqlite3_create_function16(
    sqlite3*,
    const void *zFunctionName,
    int nArg,
    int eTextRep,
    void*,
    void (*xFunc)(sqlite3_context*,int,sqlite3_value**),
    void (*xStep)(sqlite3_context*,int,sqlite3_value**),
    void (*xFinal)(sqlite3_context*)
   );
   #define SQLITE_UTF8   1
   #define SQLITE_UTF16  2
   #define SQLITE_UTF16BE 3
   #define SQLITE_UTF16LE 4
   #define SQLITE_ANY   5

nArg 参数用来表明自定义函数的参数个数. 如果参数值为0,则表示接受任意个数的参数. 用 eTextRep 参数来表明传入参数的编码形式. 参数值可以是上面的五种预定义值. SQLite3 允许同一个自定义函数有多种不同的编码参数的版本. 数据库引擎会自动选择转换参数编码个数最少的版本使用.
普通的函数只需要设置 xFunc 参数,而把 xStep 和 xFinal 设为NULL. 聚合函数则需要设置 xStep 和 xFinal 参数,然后把 xFunc 设为NULL. 该方法和使用sqlite3_create_aggregate() API一样.
sqlite3_create_function16()和sqlite_create_function()的不同就在于自定义的函数名一个要求是 UTF-16 编码,而另一个则要求是 UTF-8.
请注意自定函数的参数目前使用了sqlite3_value结构体指针替代了SQLite version 2.X中的字符串指针. 下面的函数用来从sqlite3_value结构体中提取数据:

  

?
1
2
3
4
5
6
7
8
9
const void *sqlite3_value_blob(sqlite3_value*);
  int sqlite3_value_bytes(sqlite3_value*);
  int sqlite3_value_bytes16(sqlite3_value*);
  double sqlite3_value_double(sqlite3_value*);
  int sqlite3_value_int(sqlite3_value*);
  long long int sqlite3_value_int64(sqlite3_value*);
  const unsigned char *sqlite3_value_text(sqlite3_value*);
  const void *sqlite3_value_text16(sqlite3_value*);
  int sqlite3_value_type(sqlite3_value*);

上面的函数调用以下的API来获得上下文内容和返回结果:
 
 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void *sqlite3_aggregate_context(sqlite3_context*, int nbyte);
  void *sqlite3_user_data(sqlite3_context*);
  void sqlite3_result_blob(sqlite3_context*, const void*, int n, void(*)(void*));
  void qlite3_result_double(sqlite3_context*, double );
  void sqlite3_result_error(sqlite3_context*, const char *, int );
  void sqlite3_result_error16(sqlite3_context*, const void*, int );
  void sqlite3_result_int(sqlite3_context*, int );
  void sqlite3_result_int64(sqlite3_context*, long long int );
  void sqlite3_result_null(sqlite3_context*);
  void sqlite3_result_text(sqlite3_context*, const char *, int n, void(*)(void*));
void sqlite3_result_text16(sqlite3_context*, const void*, int n, void(*)(void*));
  void sqlite3_result_value(sqlite3_context*, sqlite3_value*);
  void *sqlite3_get_auxdata(sqlite3_context*, int );
  void sqlite3_set_auxdata(sqlite3_context*, int , void*, void (*)(void*));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值