门户网站制作公司,制作网页整体规划方案,手机制作网页,怎么做好网站搜索引擎优化返回目录#xff1a;SQLite—免费开源数据库系列文章目录
上一篇#xff1a;SQLiteC/C接口详细介绍之sqlite3类#xff08;十四#xff09;
下一篇#xff1a;SQLiteC/C接口详细介绍之sqlite3类#xff08;十六#xff09; 47.sqlite3_set_authorizer
用法#xff… 返回目录SQLite—免费开源数据库系列文章目录
上一篇SQLiteC/C接口详细介绍之sqlite3类十四
下一篇SQLiteC/C接口详细介绍之sqlite3类十六 47.sqlite3_set_authorizer
用法在SQLite的访问控制中注册一个授权回调函数用于限制或禁止某些SQL语句的执行。
函数原型如下
int sqlite3_set_authorizer(sqlite3*,int (*xAuth)(void*,int,const char*,const char*,const char*,const char*),void* pUserData
);
- 第一个参数是数据库连接的指针 - 第二个参数是一个回调函数指针该回调函数是访问授权的核心用于审批或拒绝SQL语句的执行 - 第三个参数是用户带的指针该指针可以在回调函数中使用
回调函数的原型如下
int my_authorizer_callback(void* pArg, int eCode, const char* zDb, const char* zPtr1, const char* zPtr2, const char* zPtr3);
- 第一个参数是user-data指针 - 第二个参数是一个SQLITE_AUTH_*常量指示某个SQL语句属于何种类型操作比如是SELECT、INSERT等等。 - 后面的参数zDbzPtr1zPtr2zPtr3指向与用户访问有关的数据库、表、列或者索引的名称。这四个参数不一定全部被用到取决于具体的SQL语句类型。
返回值如下
- 如果回调函数返回SQLITE_DENY则表示不允许执行这条SQL语句。 - 如果回调函数返回SQLITE_IGNORE则表示通过SQL语句的执行但是不允许修改具体的数据库数据。 - 如果回调函数返回SQLITE_OK则表示允许执行这条SQL语句。
下面是一个简单的示例回调函数阻止DROP TABLE、DROP VIEW和DELETE语句的执行
#include sqlite3.h
#include stdio.h
int authorizer_callback(void* pArg, int eCode, const char* zDb, const char* zPtr1, const char* zPtr2, const char* zPtr3) {if (eCode SQLITE_DROP_TABLE || eCode SQLITE_DROP_VIEW || eCode SQLITE_DELETE) {printf(Unauthorized Operation\n);return SQLITE_DENY;}return SQLITE_OK;
}
int main() {sqlite3 *db;sqlite3_open(:memory:, db);sqlite3_set_authorizer(db, authorizer_callback, NULL);sqlite3_exec(db, CREATE TABLE test (id INTEGER PRIMARY KEY, value TEXT), NULL, NULL, NULL);sqlite3_exec(db, INSERT INTO test VALUES (1, hello), NULL, NULL, NULL);sqlite3_exec(db, DELETE FROM test WHERE id 1, NULL, NULL, NULL);sqlite3_exec(db, DROP TABLE test, NULL, NULL, NULL);sqlite3_close(db);return 0;
}
当执行DROP TABLE、DROP VIEW和DELETE语句时回调函数将阻止执行并输出Unauthorized Operation。需要注意的是要在执行SQL语句之前设置授权回调函数否则将无法生效。
48.sqlite3_set_clientdata
sqlite3_set_clientdata函数用于在SQLite的会话中为客户端数据设置指针该指针可以在SQLite操作期间使用并永久存储。这个指针通常被用于存储客户端上下文数据比如在回调函数中访问。
函数原型如下
void sqlite3_set_clientdata(sqlite3_context*, void*);
函数使用较为简单第一个参数是指向sqlite3_context结构体的指针这个指针通常由回调函数提供。第二个参数是一个void类型的指针这个指针将与sqlite3_context结构体关联。
下面是一个示例展示如何在sqlite3_create_function()回调函数中使用sqlite3_set_clientdata()来存储客户端上下文数据
#include sqlite3.h
#include stdio.h
static void my_function(sqlite3_context *context,int argc,sqlite3_value **argv
) {int count (int)(intptr_t)sqlite3_get_auxdata(context, 0); // 从上下文中获取计数器count; // 计数器加1sqlite3_set_auxdata(context, 0, (void*)(intptr_t)count); // 将计数器放回上下文中sqlite3_result_int(context, count); // 返回计数器值
}
int main() {sqlite3 *db;sqlite3_open(:memory:, db);sqlite3_create_function(db, my_function, -1, SQLITE_ANY, NULL, my_function, NULL, NULL);void *pUserData malloc(sizeof(int));*(int*)pUserData 0;sqlite3_set_auxdata(db, 0, pUserData); // 将计数器存储在数据库连接中sqlite3_context *context sqlite3_malloc(sizeof(sqlite3_context));sqlite3_set_clientdata(context, db); // 将数据库连接与上下文关联sqlite3_exec(db, SELECT my_function(), NULL, NULL, NULL);sqlite3_exec(db, SELECT my_function(), NULL, NULL, NULL);int count (int)(intptr_t)sqlite3_get_auxdata(db, 0);printf(function called %d times\n, count);sqlite3_close(db);return 0;
}
该示例通过sqlite3_set_auxdata()函数在数据库连接中存储一个计数器。每次调用my_function()回调函数时它将自加该计数器并返回该计数器。用sqlite3_set_clientdata()函数将上下文与数据库连接关联。最后从数据库连接中获取计数器并输出结果。
49.sqlite3_set_last_insert_rowid
sqlite3_set_last_insert_rowid函数用于手动设置最后插入的行ID。通常情况下SQLite会自动维护最后插入的行ID无需手动设置。但是有时候可能需要在想要插入的ID不是递增的情况下手动指定插入行ID。
函数原型如下
void sqlite3_set_last_insert_rowid(sqlite3*, sqlite3_int64);
第一个参数是指向sqlite3结构体的指针第二个参数是一个sqlite3_int64类型的整数代表要设置的最后插入的行ID。
下面是一个示例展示如何手动设置最后插入的行ID
#include sqlite3.h
#include stdio.h
int main() {sqlite3 *db;sqlite3_open(:memory:, db);sqlite3_exec(db, CREATE TABLE test (id INTEGER PRIMARY KEY, value TEXT), NULL, NULL, NULL);sqlite3_int64 rowid 10;sqlite3_set_last_insert_rowid(db, rowid); // 设置最后插入的行IDsqlite3_exec(db, INSERT INTO test (id, value) VALUES (11, hello), NULL, NULL, NULL);rowid sqlite3_last_insert_rowid(db); // 获取最后插入的行IDprintf(last_insert_rowid %lld\n, rowid);sqlite3_close(db);return 0;
}
在该示例中我们使用sqlite3_set_last_insert_rowid()函数手动设置了最后插入的行ID为10然后插入一条ID为11的数据。最后我们获取最后插入的行ID并将其输出。输出结果为last_insert_rowid 10。