SQLiteC/C++接口详细介绍之sqlite3类(十五)

news2024/12/22 17:23:15

 返回目录: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等等。
- 后面的参数zDb,zPtr1,zPtr2,zPtr3指向与用户访问有关的数据库、表、列或者索引的名称。这四个参数不一定全部被用到,取决于具体的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++;                                                      // 计数器加1
    sqlite3_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);   // 设置最后插入的行ID
    sqlite3_exec(db, "INSERT INTO test (id, value) VALUES (11, 'hello')", NULL, NULL, NULL);
    rowid = sqlite3_last_insert_rowid(db);      // 获取最后插入的行ID
    printf("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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1521191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Preprocessing数据预处理】之Scaler

在机器学习中&#xff0c;特征缩放是训练模型前数据预处理阶段的一个关键步骤。不同的缩放器被用来规范化或标准化特征。这里简要概述了您提到的几种缩放器&#xff1a; StandardScaler StandardScaler 通过去除均值并缩放至单位方差来标准化特征。这种缩放器假设特征分布是正…

Seata 2.x 系列【9】事务会话存储模式

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Seata 版本 2.0.0 本系列Spring Boot 版本 3.2.0 本系列Spring Cloud 版本 2023.0.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 概述2. 存储模…

虚拟机网络链接

在虚拟网络设置中找到如下界面&#xff1a; "子网 IP" 192.168.79.0/24 表示一个局域网络&#xff0c;它有254个可能的IP地址可供分配&#xff08;192.168.79.1到192.168.79.254&#xff09;&#xff0c;255.255.255.0 是子网掩码&#xff0c;定义了网络和主机部分。…

MySQL--深入理解MVCC机制原理

什么是MVCC&#xff1f; MVCC全称 Multi-Version Concurrency Control&#xff0c;即多版本并发控制&#xff0c;维持一个数据的多个版本&#xff0c;主要是为了提升数据库的并发访问性能&#xff0c;用更高性能的方式去处理数据库读写冲突问题&#xff0c;实现无锁并发。 什…

Cartwheel——文本生成3D动作或动画的工具

一个强大的文本转3D动画平台,用户只需通过输入文字提示即可生成视频、游戏、电影、广告、社交或VR项目所需的3D动画角色。 Cartwheel 是一个功能强大的文本到动画平台。只需键入即可为您的视频、游戏、电影、广告、社交或 VR 项目制作角色动画 定位: 定位于为用户提供简单…

Unity类银河恶魔城学习记录10-11 p99 Aliment visual effects源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili EntityFX.cs using System.Collections; using System.Collections.Gener…

Mysql事务+锁测试 RR行锁升级

Mysql事务锁测试 Mysql5.7 在隔离级别RR下&#xff0c;添加写锁&#xff0c;锁住一行数据&#xff0c;写锁是排它锁&#xff0c;不允许其它的读写、 另外开启一个连接&#xff0c;进行写操作&#xff0c;发现执行没有成功&#xff0c;在等待锁 查询事务表&#xff0c;有两个事…

openssl3.2 - note - Decoders and Encoders with OpenSSL

文章目录 openssl3.2 - note - Decoders and Encoders with OpenSSL概述笔记编码器/解码器的调用链OSSL_STORE 编码器/解码器的名称和属性OSSL_FUNC_decoder_freectx_fnOSSL_FUNC_encoder_encode_fn官方文档END openssl3.2 - note - Decoders and Encoders with OpenSSL 概述 …

大数据Doris(六十八):基于Doris on ES的架构实现总结

文章目录 基于Doris on ES的架构实现总结 一、Mem Join架构遗留的核心问题 二、Doris

河南大学大数据平台技术实验报告二

大数据平台技术课程实验报告 实验二&#xff1a;HDFS操作实践 姓名&#xff1a;杨馥瑞 学号&#xff1a;2212080042 专业&#xff1a;数据科学与大数据技术 年级&#xff1a;2022级 主讲教师&#xff1a;林英豪 实验时间&#xff1a;2024年3月15日3点 至 2024年3月15日4点40 …

力扣经典题:分割平衡字符串

大佬的代码非常简洁 int balancedStringSplit(char * s){short i0,count0,sign0;while(s[i]){signs[i]L?sign1:sign-1;if(sign0) count;}return count; }

安装gpu-torch(已经成功)

### &#xff01;&#xff01;&#xff01;直接使用pip安装&#xff0c;不要使用conda安装&#xff0c;使用conda安装总是会安装成CPU版本。 1.第一次尝试 之前按照官网安装pytorch的命令进行安装&#xff0c;结果安装出来是cpu版本的&#xff0c;试过https://blog.csdn.net/…

【日常记录】【CSS】css下划线动画

文章目录 1、效果2、思路3、代码 1、效果 2、思路 整体可以用 背景来做线&#xff1a;可以用 渐变 配合 background-size 、 background-position 、background-repeat正向动画&#xff1a;可以不断追加 background-size x 轴的大小来控制&#xff0c;当鼠标移入的时候&#x…

【应急响应靶场web2】

文章目录 前言 一、应急响应 1、背景 2、webshell查杀 3、日志排查 1&#xff09;apache日志 2&#xff09;nginx日志 3&#xff09;ftp日志 4、隐藏账户 5、文件筛选 二、漏洞复现 总结 前言 靶场来源&#xff1a;知攻善防实验室 一、应急响应 1、背景 小李在某…

【算法训练营】周测1

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 如果需要答案代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 考题11-1 题目描述 有一个初始时为空的序列&#xff0c;你的任务是维护这个…

SpringBoot(异常处理)

SpringBoot&#xff08;异常处理&#xff09; 1.基本介绍 2.debug异常处理机制 1.找到 DefaultErrorViewResolver 2.下断点 3.debug启动&#xff0c;浏览器输出一个不存在的页面 4.第一次查找 error/404 1.查看目前要找的视图名 2.准备去查找资源 3.准备从四个默认存放静态资…

使用 FastAPI APIRouter 构建高效的 API

FastAPI 是一个现代的、高性能的 Python Web 框架&#xff0c;它提供了 APIRouter 来帮助组织和管理路由。APIRouter 是一个可用于组织和分组路由的类&#xff0c;使得代码结构更加清晰和可维护。本文将介绍 FastAPI APIRouter 的用法&#xff0c;包括实践案例以及在 IDE 编辑器…

【商业|数据科学主题会议推荐】2024年商业分析与数据科学国际学术会议(ICBADS 2024)

【商业|数据科学主题会议推荐】2024年商业分析与数据科学国际学术会议&#xff08;ICBADS 2024) 征稿主题 &#xff08;以下主题包括但不限于&#xff09; 多媒体决策 决策理论与决策科学 数字市场设计与运营 降维 电子商务 道德决策 财务分析 群体决策与软件 医疗保…

podman proxy 【podman 代理】

文章目录 方法1: 为当前用户设置环境变量方法2&#xff1a;为 Podman 服务设置配置文件方法3: 为单个 Podman 命令设置代理方法四: 配置 http-proxy.conf 方法1: 为当前用户设置环境变量 您可以为当前用户设置 HTTP_PROXY 和 HTTPS_PROXY 环境变量,Podman 将自动读取这些环境变…

C语言从入门到熟悉------第四阶段

指针 地址和指针的概念 要明白什么是指针&#xff0c;必须先要弄清楚数据在内存中是如何存储的&#xff0c;又是如何被读取的。如果在程序中定义了一个变量&#xff0c;在对程序进行编译时&#xff0c;系统就会为这个变量分配内存单元。编译系统根据程序中定义的变量类型分配…