SQLite第四課sqlite3_set_authoriz

例子說明
?可以將一個如下面格式的my_authorizer函數(shù),注冊到SQLite語句的解釋執(zhí)行語句當(dāng)中,并且最先被執(zhí)行,就像是一個鉤子,對sql語句進行一些訪問的控制,類似于網(wǎng)絡(luò)數(shù)據(jù)包的netfilter。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:空間域名、虛擬主機、營銷軟件、網(wǎng)站建設(shè)、橋西網(wǎng)站維護、網(wǎng)站推廣。

代碼
#include <iostream>
#include "sqlite/sqlite3.h"
using namespace std;
?
/*
該注冊的回調(diào)函數(shù),禁止用戶刪除任何的表,實際上,第三個參數(shù)
會傳遞進來當(dāng)前操作的表的名稱,可以通過和該值進行匹配,是否
需要對該表進行操作,當(dāng)然由于pszString是一個無符號整型,如果
有多個參數(shù)想傳遞進來,可以設(shè)置sqlite3_set_authorizer的第三個
參數(shù)為結(jié)構(gòu)體,然后通過將pszString進行類型的強制轉(zhuǎn)換,返回
SQLITE_OK,表示繼續(xù)執(zhí)行,返回SQLITE_DENY表示拒絕執(zhí)行
*/
int my_authorizer(void* pszString,
????????????????? int nCode,/*當(dāng)前SQL解析模塊正在執(zhí)行的操作碼*/
????????????????? const char* psz1,/*由SQL解析模塊傳遞進來當(dāng)前操作的數(shù)據(jù)庫表,由操作碼決定是否為空*/
????????????????? const char* psz2,
????????????????? const char* psz3,
????????????????? const char* psz4)
{
? int nNotPermitCode = *(int*)pszString;
? if (nNotPermitCode == 11)
? {
??? printf("can not execute drop\n");
??? return SQLITE_DENY;
? }?
? return SQLITE_OK;
}
int main()
{
? int rc = 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 = "create virtual table geo_test1 using rtree_i32(id, minx, maxx)";
? rc = sqlite3_exec(db,pszCreateTb1, 0, 0, &pszErrMsg);
?
? char* pszInsertsql1 = "insert into geo_test1 values(1, 400, 400)";
? rc = sqlite3_exec(db,pszInsertsql1, 0, 0, &pszErrMsg);
?
? char* pszDropTable = "drop table geo_test1";
?
? /*
? 授權(quán)動作編碼(Authorizer Action Codes)
? 摘自:https://www.sqlite.org/c3ref/c_alter_table.html
? 每一種授權(quán)操作碼都會傳遞不同的參數(shù)給授權(quán)注冊函數(shù),詳細(xì)參考
? 網(wǎng)址。11是刪除數(shù)據(jù)庫表的授權(quán)操作碼,當(dāng)調(diào)用授權(quán)注冊函數(shù)的時候
? 第三個字符串將獲得當(dāng)前被操作的表的名稱。
? */
? int nNotPermitCode = 11;
? //第三個參數(shù)是傳遞給授權(quán)注冊函數(shù)的參數(shù)值
? sqlite3_set_authorizer(db, my_authorizer, &nNotPermitCode);
? sqlite3_stmt* statement;
?
? rc = sqlite3_prepare_v2(db, pszDropTable, -1, &statement, NULL);

? //單步調(diào)試到perr的錯誤信息:no authored,表示無權(quán)操作
? const char* pszErr = sqlite3_errmsg(db);
? sqlite3_close(db);
? return 0;
}

原理分析
該文件包含了實現(xiàn)sliqte3_set_authorizer函數(shù)的代碼。對于SQLite庫來說,該功能
是可選的。嵌入式系統(tǒng)不需要該功能,可以通過預(yù)編譯宏-DSQLITE_OMIT_AUTHORIZATION=1
來禁用該選項。實際上在VS的預(yù)編譯選項中,添加SQLITE_OMIT_AUTHORIZATION即可!!
?
如果定義了SQLITE_OMIT_AUTHORIZATION宏,就會忽略該文件的所有代碼
?
如下介紹兩個重量級的函數(shù):
int sqlite3_set_authorizer
(
?sqlite3 *db,
? int(*xAuth)(void*,int,const char*,const char*,const char*,const char*),
?void *pArg
)
設(shè)置或者清空訪問授權(quán)函數(shù)
sqlite3_set_authorizer函數(shù)會將注冊進來的授權(quán)函數(shù)的指針,傳遞給
數(shù)據(jù)庫的句柄結(jié)構(gòu)體sqlite3*db,并且也將該函數(shù)的第三個參數(shù)保存到句柄當(dāng)中
千萬不要想當(dāng)然,句柄就是一個指針,可以指向一個結(jié)構(gòu)體的指針。
實際上在這里有一個值得考慮的問題:如何防止死鎖,一個鎖她的最大范圍
如何控制,在什么地方才需要真正的加鎖??!
學(xué)習(xí)如何使用C語言,實現(xiàn)面向?qū)ο蟮木幊趟枷?,如何組織函數(shù)的處理結(jié)構(gòu)
?
第三和第四個參數(shù)分別是當(dāng)前正在訪問的表名和列名,認(rèn)證函數(shù)只能返回SQLITE_OK,SQLITE_DENY
SQLITE_IGNORE.如果返回SQLITE_OK,表示允許執(zhí)行訪問操作。SQLITE_DENY意味著SQL語句不會被執(zhí)
行,sqlite3_exec函數(shù)將返回一個錯誤信息,SQLITE_IGNORE意味著SQL語句將被解析,但是嘗試讀
取,將返回空集合,嘗試寫將被忽略??!
?

/*
該函數(shù)被SQLite調(diào)用去執(zhí)行注冊進來的授權(quán)函數(shù)
根據(jù)給定的參數(shù)執(zhí)行一個認(rèn)證檢測。返回值可以是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;
}

網(wǎng)頁標(biāo)題:SQLite第四課sqlite3_set_authoriz
標(biāo)題路徑:http://bm7419.com/article44/pceiee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)響應(yīng)式網(wǎng)站、自適應(yīng)網(wǎng)站、虛擬主機企業(yè)網(wǎng)站制作、網(wǎng)站維護

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化