SQLite第八课 auth.c授权文件解析

SQLite第八课 auth.c授权文件解析,第1张

概述代码剖析 该文件包含了实现sliqte3_set_authorizer函数的代码。对于SQLite库来说,该功能 是可选的。嵌入式系统不需要该功能,可以通过预编译宏-DSQLITE_OMIT_AUTHORIZATION=1 来禁用该选项。实际上在VS的预编译选项中,添加SQLITE_OMIT_AUTHORIZATION即可!!   如果定义了SQLITE_OMIT_AUTHORIZATION宏,就 代码剖析

该文件包含了实现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,255);"> const char *zArg1,255);"> const char *zArg2,255);"> 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 ){

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,

直到她被d出。如果pParse为空,该例程取消 *** 作返回。

voID sqlite3AuthContextPush



d出之前通过sqlite3AuthContextPush函数进栈的认证信息

voID sqlite3AuthContextPop(AuthContext *pContext)

总结

以上是内存溢出为你收集整理的SQLite第八课 auth.c授权文件解析全部内容,希望文章能够帮你解决SQLite第八课 auth.c授权文件解析所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1162692.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存