SQLite sqlite3_set_authorizer调用例程

sqlite3_set_authorizer

大部分的参考资料,都是写明了注册授权函数这几个简单的字面意思而已,在实际上,可以将一个如下面格式的my_authorizer函数注册sqlite语句的解释执行语句当中,并且最先被执行,就像是一个钩子,对sql语句进行一些访问的控制,类似于网络数据包的netfilter。

如下是一个简单的例子:

#include<iostream>
#include"sqlite/sqlite3.h"
usingnamespacestd;

/*
该注册的回调函数禁止用户删除任何的表,实际上,第三个参数
会传递进来当前操作的表的名称,可以通过和该值进行匹配,是否
需要对该表进行操作,当然由于pszString是一个无符号整型,如果
有多个参数想传递进来,可以设置sqlite3_set_authorizer的第三个
参数为结构体,然后通过将pszString进行类型的强制转换,返回
sqlITE_OK,表示继续执行,返回sqlITE_DENY表示拒绝执行
*/
intmy_authorizer(void*pszString,intnCode,/*当前sql解析模块正在执行的操作码*/
constchar*psz1,/*由sql解析模块传递进来当前操作的数据库表,由操作码决定是否为空*/
constchar*psz2,constchar*psz3,constchar*psz4)
{
intnNotPermitCode=*(int*)pszString;
if(nNotPermitCode==11)
{
printf("cannotexecutedrop\n");
returnsqlITE_DENY;
}
returnsqlITE_OK;
}

intmain()
{
intrc=0;
sqlite3*db=NULL;
char*pdbName="test0.db";
char*pszErrMsg=NULL;

rc=sqlite3_open_v2(pdbName,&db,sqlITE_OPEN_READWRITE|sqlITE_OPEN_CREATE,NULL);


char*pszCreateTb1="createvirtualtablegeo_test1usingrtree_i32(id,minx,maxx)";
rc=sqlite3_exec(db,pszCreateTb1,&pszErrMsg);

char*pszInsertsql1="insertintogeo_test1values(1,400,400)";
rc=sqlite3_exec(db,pszInsertsql1,&pszErrMsg);

char*pszDropTable="droptablegeo_test1";

/*
授权动作编码(AuthorizerActionCodes)
摘自:https://www.sqlite.org/c3ref/c_alter_table.html
每一种授权操作码都会传递不同的参数给授权注册函数,详细参考
网址。11是删除数据库表的授权操作码,当调用授权注册函数的时候
第三个字符串将获得当前被操作的表的名称。
*/
intnNotPermitCode=11;
/*
第三个参数是传递给授权注册函数的参数值
*/
sqlite3_set_authorizer(db,my_authorizer,&nNotPermitCode);

sqlite3_stmt*statement;

rc=sqlite3_prepare_v2(db,pszDropTable,-1,&statement,NULL);
/*
单步调试到perr的错误信息:noauthored,表示无权操作
*/
constchar*pszErr=sqlite3_errmsg(db);


sqlite3_close(db);


return0;
}

相关文章

安装 在Windows上安装SQLite。 访问官网下载下Precompliled Binaries for Windows的两个压缩包。 创建s...
一、安装 下载地址:http://www.sqlite.org/download.html 将Precompiled Binaries for Windows下的包下...
实例: 会员信息管理 功能:1.查看数据库 2.清空数据库 3.增加会员 4.删除会员 5.更新会员 6.查找会员  ...
关于SQLite SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的在读写效率、消耗总量、延迟时间和整...