SQLite 授权文件 auth.c
代码剖析该文件包含了实现sliqte3_set_authorizer函数的代码。对于SQLite库来说,该功能 是可选的。嵌入式系统不需要该功能,可以通过预编译宏-DSQLITE_OMIT_AUTHORIZATION=1 来禁用该选项。实际上在VS的预编译选项中,添加SQLITE_OMIT_AUTHORIZATION即可!!
如果定义了SQLITE_OMIT_AUTHORIZATION宏,就会忽略该文件的所有代码 如下介绍两个重量级的函数: int sqlite3_set_authorizer( sqlite3 *db, int(*xAuth)(void*,int,const char*,const char*),SimSun;">void *pArg ) 设置或者清空访问授权函数 sqlite3_set_authorizer函数会将注册进来的授权函数的指针,传递给 数据库的句柄结构体sqlite3*db,并且也将该函数的第三个参数保存到句柄当中 千万不要想当然,句柄就是一个指针,可以指向一个结构体的指针。 实际上在这里有一个值得考虑的问题:如何防止死锁,一个锁她的最大范围 如何控制,在什么地方才需要真正的加锁!! 学习如何使用C语言,实现面向对象的编程思想,如何组织函数的处理结构 第三和第四个参数分别是当前正在访问的表名和列名,认证函数只能返回SQLITE_OK,SQLITE_DENY SQLITE_IGNORE.如果返回SQLITE_OK,sans-serif;">表示允许执行访问操作。SQLITE_DENY意味着SQL语句不会被执 行,sqlite3_exec函数将返回一个错误信息,SQLITE_IGNORE语句将被解析,但是尝试读 取,将返回空集合,尝试写将被忽略!!
/* 该函数被SQLite调用去执行注册进来的授权函数 根据给定的参数执行一个认证检测。返回值可以是SQLITE_OK或者SQLITE_IGNORE或者 SQLITE_DENY,如果返回SQLITE_DENY,pParse会携带修改的错误信息返回。 */ int sqlite3AuthCheck( Parse *pParse, int code, const char *zArg1, const char *zArg2, const char *zArg3 ){ sqlite3 *db = pParse->db; int rc; /* Don't do any authorization checks if the database is initialising ** or if the parser is being invoked from within sqlite3_declare_vtab. */ if( db->init.busy || IN_DECLARE_VTAB ){ return SQLITE_OK; } if( db->xAuth==0 ){ return SQLITE_OK; } rc = db->xAuth(db->pAuthArg,code,zArg1,zArg2,zArg3,pParse->zAuthContext #ifdef SQLITE_USER_AUTHENTICATION ,db->auth.zAuthUser #endif ); if( rc==SQLITE_DENY ){ sqlite3ErrorMsg(pParse,"not authorized"); pParse->rc = SQLITE_AUTH; }else if( rc!=SQLITE_OK && rc!=SQLITE_IGNORE ){ rc = SQLITE_DENY; sqliteAuthBadReturnCode(pParse); } return rc; } 如下的函数并没有知道调用的过程: /*如下的函数例程,并不知道在什么地方被调用,并且不清楚认证信息是 如何通过函数进行传递的,从哪里来,并且到哪里去 */ /* 认证信息进栈。该例程被调用后,认证回调函数的zArg3参数被赋值为zContext, 直到她被弹出。如果pParse为空,该例程取消操作返回。 */ void sqlite3AuthContextPush /* 弹出之前通过sqlite3AuthContextPush函数进栈的认证信息 */ void sqlite3AuthContextPop(AuthContext *pContext) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |