按关键词阅读: 嵌入式数据库
该函数用于注册/删除用户自定义函数 。
自定义函数传递参数有两种方式 , 第一种是在注册时用pUserData传入 , 第二种是在调用已经注册函数时传入参数 。
void (*func)(sqlite3_context*,int,sqlite3_value*);
用户自定义函数的格式 , 第二个参数是自定函数的参数个数 , 第三个函数是自定义函数的值 。
void *sqlite3_user_data(sqlite3_context*);
返回用户注册 。
20、函数时传入的参数void *pUserData 。
int sqlite3_value_type(sqlite3_value*);
用来说明sqlite3_value的数据类型,比如用户自已定义的回调函数的第二个参数的数据类型 。
sqlite3_value_XXXX(sqlite3_value*);
用来返回sqlite3_value所表示的准确值 。
sqlite3_result_XXXX(sqlite3_context*, .);
用来设置返回值为某一数值的准确拷贝 。
对上面的内容更详细的介绍将放在利用自定义接口编程的部分进行说明 。
对聚合函数及排序函数的接口介绍也推后介绍,SQLite的自定义 。
21、函数编程接口,注册自定义函数的接口 int sqlite3_create_function( sqlite3 *, /数据库句柄 const char *zFunctionName, /自定义函数的名子 int nArg, /参数个数 , -1表示任意个数的参数 int eTextRep, /函数接受的参数数据类型 void *pUserData, /在函数实现中用sqlite_user_data()得到 void (*xFunc)(sqlite3_context*,int,sqlite3_value*), /回调函数 , 针对简单函数,xStep=NULL, xFinalNULL void (*xS 。
22、tep)(sqlite3_context*,int,sqlite3_value*), /针对聚集函数,xFun=NULL void (*xFinal)(sqlite3_context*) /针对聚集函数,xFun=NULL );
int sqlite3_create_function16(,自定义函数注册流程,上面的图表说明 , 无论是用户自定义的函数 , 还是sqlite内建的函数都利用callback的方式进行注册 , 用户自定义的函数编写的方式完全可以参照func.c中内建函数的实现方式来实现,SQLite内建简单函数分析,功能:返回传入的第一个参数的byte数 参数:argc=1,表示只能传入一个 。
23、参数 返回值:回调函数的返回值void,但是调用注册函数会返回整数值 static void lengthFunc( sqlite3_context *context, int argc, sqlite3_value *argv) int len;
switch( sqlite3_value_type(argv0) )/第一个参数的类型 case SQLITE_BLOB: case SQLITE_INTEGER: case SQLITE_FLOAT: sqlite3_result_int(context, sqlite3_value_bytes(argv0);
/统计的bytes数 break 。
24、;
case SQLITE_TEXT: const unsigned char *z = sqlite3_value_text(argv0);
for(len=0;
*z;
z+) if( (0 xc0,用户自定义简单函数,下面我们实现两个自定义的简单函数: 第一个例子在注册函数时 , 将用户的数据传入 , 然后调用自定义函数时 , 返回传入的值 。
在下面的例子中 , 将传入的数据插入到数据库中 。
第二个例子在注册函数后 , 在查询语句中对自定义函数中进行查询 , 然后将查询的结果进行修正 , 从202.12.0.32变成http:/202.12.0.32的形式返回 。
例一、 void get_key_func( sqli 。
25、te3_context * ctx, int dummy1, sqlite3_value * dummy2 ) sqlite3_result_int( ctx, *(int *)sqlite3_user_data( ctx ) ) ;
sqlite3_create_function( db-db, get_key, -1, SQLITE_ANY, 上面实现了自定义函数并且将其进行注册 , 在注册时将db-key做为用户数据传入 , 每次插入数据前 , 对db-key的值进行修改 , get_key_func()就会返回新的数据 , 然后将其插入到数据库中 。
更为详细的例子将在实际应用部分进行讲解,用户自定义简单函 。
26、数,例二、 void host2url_func( sqlite3_context * ctx, int argc, sqlite3_value * argv ) if( argc != 1 ) return;
char *httpurl=NULL;
switch( sqlite3_value_type( argv 0 ) ) case SQLITE_NULL: sqlite3_result_text( ctx, “NULL”, 4, SQLITE_STATIC );
/如果没有传入 , 返回零 break;
case SQLITE_TEXT: httpurl = ( char * ) mallo 。
27、c(strlen( sqlite3_value_text( argv 0 ) ) + 8 );
/分配内存 if ( httpurl = 0 ) return;
sprintf( httpurl, “http:/%s”, sqlite3_value_text( argv 0 ) );
sqlite3_result_text( ctx, httpurl, strlen( httpurl ) , SQLITE_TRANSIENT );
/设置返回值 free( httpurl );
/释放内存 httpurl = NULL;
break;
default: sqlite3_result_text(。
28、context, “about:blank”, 11, SQLITE_STATIC );
break;
sqlite3_create_function( db, “geturl”, 1, SQLITE_ANY, NULL, host2url_func, NULL, NULL ) ;
/注册函数 $r = sqlite_exec($db, SELECT geturl(url) FROM host_table;
, callback, 0, /查询,用户自定义简单函数,SQLite的自定义聚合函数接口,自定义聚合函数接口 在聚合函数的定义过程中 ,在SQLite的自定义简单函数接口一节定义的函数都可 。
29、以使用 , 除此之外 , 还有一些函数可以使用: sqlite3_aggregate_context( sqlite3_context *, int nBytes );
来源:(未知)
【学习资料】网址:/a/2021/0321/0021740501.html
标题:嵌入式数据库简介|嵌入式数据库简介( 三 )