博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQLite第八课 auth.c授权文件解析
阅读量:7299 次
发布时间:2019-06-30

本文共 1983 字,大约阅读时间需要 6 分钟。

代码剖析

该文件包含了实现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*,const char*,const char*),

 void *pArg

)

设置或者清空访问授权函数

sqlite3_set_authorizer函数会将注册进来的授权函数的指针,传递给

数据库的句柄结构体sqlite3*db,并且也将该函数的第三个参数保存到句柄当中

千万不要想当然,句柄就是一个指针,可以指向一个结构体的指针。

实际上在这里有一个值得考虑的问题:如何防止死锁,一个锁她的最大范围

如何控制,在什么地方才需要真正的加锁!!

学习如何使用C语言,实现面向对象的编程思想,如何组织函数的处理结构

 

第三和第四个参数分别是当前正在访问的表名和列名,认证函数只能返回SQLITE_OK,SQLITE_DENY

SQLITE_IGNORE.如果返回SQLITE_OK,表示允许执行访问操作。SQLITE_DENY意味着SQL语句不会被执

行,sqlite3_exec函数将返回一个错误信息,SQLITE_IGNORE意味着SQL语句将被解析,但是尝试读

取,将返回空集合,尝试写将被忽略!!

 

/*

该函数被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)

     本文转自fengyuzaitu 51CTO博客,原文链接:
http://blog.51cto.com/fengyuzaitu/1956651
,如需转载请自行联系原作者
你可能感兴趣的文章
【Oracle 12c】最新CUUG OCP-071考试题库(56题)
查看>>
C#使用Xamarin开发可移植移动应用进阶篇(6.使用渲染器针对单个平台自定义控件..很很很很重要..),附源码...
查看>>
实验二
查看>>
简单安装ubuntu
查看>>
20160331javaweb 之JSP page 指令
查看>>
用Ruby批量获取电影的评分与影片信息
查看>>
2019.5.29 区块链论文翻译
查看>>
Centos6.6安装mysql记录
查看>>
OCP读书笔记(5) - 使用RMAN创建备份
查看>>
java的接口和抽象类区别
查看>>
能够提高PHP的性能的一些注意事项
查看>>
020-请你说一说app测试的工具
查看>>
软件测试2019:第五次作业—— 安全测试(含安全测试工具实验)
查看>>
SSM框架搭建总结(2)
查看>>
Python学习(19)正则表达式
查看>>
PHP中空字符串、0、null、empty和false之间的关系
查看>>
【深度学习篇】---CNN和RNN结合与对比,实例讲解
查看>>
201771010126 王燕《面向对象程序设计(Java)》第十二周学习总结
查看>>
XAML实例教程系列 - 资源(Resources)
查看>>
LWIP互联网资料汇总
查看>>