数据库

人工制品[f971962e]
登录

人造物品f971962e92ebb0a6e62949463ee454d88fa2:


/*** 2014-11-10****作者不承认此源代码的版权。代替**法律通知,这是一个祝福:****愿你行善而非作恶。**希望你能原谅自己,原谅别人。**愿你自由分享,永不索取多于付出。************************************************************************************此SQLite扩展实现SQL函数eval(),该函数运行**递归SQL语句。*/#包括“sqlite3ext.h”SQLITE_EXTENSION_INIT1数据库#包括<string.h>/***用于累积输出的结构*/结构评估结果{字符*z;/*累计产量*/常量字符*zSep;/*分离器*/int szSep;/*分隔符字符串的大小*/sqlite3_int64 nAlloc;/*为z[]分配的字节数*/sqlite3_int64已使用;/*实际使用的z[]字节数*/};/***从sqlite_exec()回调eval()函数。*/静态int回调(void*pCtx,int argc,char**argv,char**colnames){结构评估结果*p=(结构评估结果*)pCtx;整数i;对于(i=0;i<argc;i++){const char*z=argv[i]?argv[i]:“”;size_t sz=字符串(z);if((sqlite3_int64)sz+p->已使用+p->szSep+1>p->nAlloc){char*zNew(新建);p->nAlloc=p->nAlloc*2+sz+p->szSep+1;/*使用sqlite3_realloc64()会更好,但这是最近的**添加,如果由旧版本加载,将导致segfault**SQLite的*/zNew=p->nAlloc<=0x7fffffff?sqlite3_realloc(p->z,(int)p->nAlloc):0;如果(zNew==0){sqlite3_free(p->z);成员集(p,0,sizeof(*p));返回1;}p->z=z新;}if(p->已使用>0){memcpy(&p->z[p->Used],p->zSep,p->szSep);p->已使用+=p->szSep;}memcpy(&p->z[p->Used],z,sz);p->未使用+=sz;}返回0;}/***eval(X)和eval(X,Y)SQL函数的实现。****计算X中的SQL文本。使用字符串返回结果**Y作为分隔符。如果省略Y,请使用单个空格字符。*/静态void sqlEvalFunc(sqlite3_context*上下文,整型参数,sqlite3_值**argv){常量字符*zSql;sqlite3*db;char*zErr=0;整数rc;结构评估结果x;成员集(&x,0,sizeof(x));x.zSep=“”;zSql=(const char*)sqlite3_value_text(argv[0]);如果(zSql==0)返回;如果(argc>1){x.zSep=(const char*)sqlite3_value_text(argv[1]);如果(x.zSep==0)返回;}x.szSep=(int)字符串(x.zSep);db=sqlite3_context_db_handle(上下文);rc=sqlite3_exec(db,zSql,callback,&x,&zErr);if(rc!=SQLITE_OK){sqlite3_result_error(上下文,zErr,-1);sqlite3_free(zErr);}else如果(x.zSep==0){sqlite3_result_error_nomem(上下文);sqlite3_free(x.z);}其他{sqlite3_result_text(上下文,x.z,(int)x.Used,sqlite3_free);}}#ifdef_WIN32__declspec(dllexport)#结尾int sqlite3_eval_init(sqlite3*db,字符**pzErrMsg,const sqlite3_api_routines*pApi){int rc=SQLITE_OK;SQLITE_EXTENSION_INIT2(pApi);(无效)pzErrMsg;/*未使用的参数*/rc=sqlite3_create_function(数据库,“eval”,1,SQLITE_UTF8,0,sqlEvalFunc,0,0);如果(rc==SQLITE_OK){rc=sqlite3_create_function(数据库,“eval”,2,SQLITE_UTF8,0,sqlEvalFunc,0,0);}返回rc;}