SQLite第九課 sqlite3_set_authorizer案例

來源:互聯網
上載者:User

標籤:sqlite sqlite3_set_authorizer

可以將一個如下面格式的my_authorizer函數,註冊到SQLite語句的解釋執行語句當中,並且最先被執行,就像是一個鉤子,對sql語句進行一些訪問的控制,類似於網路資料包的netfilter。

#include <iostream>

#include "sqlite/sqlite3.h"

using namespace std;

 

/*

該註冊的回呼函數,禁止使用者刪除任何的表,實際上,第三個參數

會傳遞進來當前操作的表的名稱,可以通過和該值進行匹配,是否

需要對該表進行操作,當然由於pszString是一個無符號整型,如果

有多個參數想傳遞進來,可以設定sqlite3_set_authorizer的第三個

參數為結構體,然後通過將pszString進行類型的強制轉換,返回

SQLITE_OK,表示繼續執行,返回SQLITE_DENY表示拒絕執行

*/

int my_authorizer(void* pszString, 

                  int nCode,/*當前SQL解析模組正在執行的作業碼*/

                  const char* psz1,/*由SQL解析模組傳遞進來當前操作的資料庫表,由作業碼決定是否為空白*/

                  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";

 

  /*

  授權動作編碼(Authorizer Action Codes)

  摘自:https://www.sqlite.org/c3ref/c_alter_table.html

  每一種授權作業碼都會傳遞不同的參數給授權註冊函數,詳細參考

  網址。11是刪除資料庫表的授權作業碼,當調用授權註冊函數的時候

  第三個字串將獲得當前被操作的表的名稱。

  */

  int nNotPermitCode = 11;

  /*

  第三個參數是傳遞給授權註冊函數的參數值

  */

  sqlite3_set_authorizer(db, my_authorizer, &nNotPermitCode);

 

  sqlite3_stmt* statement;

 

  rc = sqlite3_prepare_v2(db, pszDropTable, -1, &statement, NULL);

  /*

  單步調試到perr的錯誤資訊:no authored,表示無權操作

  */

  const char* pszErr = sqlite3_errmsg(db);

 

 

  sqlite3_close(db);

   

 

  return 0;

}


SQLite第九課 sqlite3_set_authorizer案例

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.