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

 返回目录: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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

html5使用Websocket

html5使用Websocket 前言1、html5中的websocket2、创建一个 WebSocket 对象3、监听 WebSocket 连接事件4、监听 WebSocket 收到消息事件5、监听 WebSocket 关闭事件6、 监听 WebSocket 出错事件7、发送消息8、整体代码 前言 在即时通讯的交互方式中websocket是一个很使用的方式…

初出茅庐的小李博客之串口屏开发一个音乐控制器UI

串口屏介绍 串口屏通常指的是一种带有串口接口的显示屏&#xff0c;可以通过串口与其他设备进行通信和控制。这种屏幕通常具有独立的控制器和显示功能&#xff0c;可以直接接入主控系统&#xff0c;实现信息的显示和交互。 开发步骤 准备UI素材 准备了100张音量的图标&#x…

麒麟系统Redis7.2哨兵集群部署

redis哨兵集群部署 1、原理 Redis 哨兵模式是指在 Redis 集群中,有一组专门的进程(即哨兵进程)负责监控主节点和从节点的状态,并在发现故障时自动进行故障转移,以保证 Redis 集群的高可用性。 Redis 提供了哨兵的命令,哨兵命令是一个独立的进程,哨兵进程会周期性地向主…

数据结构与算法第八套试卷

1.建立一个长度为n的有序单链表的时间复杂度 0(n^2) 2.哈希算法 key%p&#xff1a;p最好为质数 如果两个关键字的值不等但哈希函数值相等&#xff0c;则称这两个关键字为同义词&#xff08;正确&#xff09;&#xff1b; 3.二分查找 注意&#xff1a; 二分查找是向下查询…

【蓝桥杯单片机】十四届省赛“重难点”解析(附源码)

【蓝桥杯单片机】十四届省赛“重难点”解析 一、题目难点解析二、易出错点提示三、完整代码链接 笔记包括&#xff1a;①题目难点解析、②易出错点提示、③完整代码链接 注&#xff1a;本文提供的所有代码都是使用第十四届竞赛包完成 ⭐----------系列文章链接----------⭐ 【蓝…

C# 当录入错误的时候,右下角弹窗提示错误信息

做一个textbox录入数字的判断&#xff0c;当录入不是数字的时候右下角弹窗提示 右下角弹窗提示 主要代码如下&#xff1a;判断是否为数字的代码&#xff1a; private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { if(e.KeyChar13) …

计算机网络——物理层(编码与调制)

计算机网络——编码与调制 基带信号和宽带信号编码与调制数字数据编码为数字信号非归零编码归零编码反向不归零编码曼彻斯特编码差分曼彻斯特编码4B/5B编码 数字数据调制为模拟信号模拟数据编码为数字信号模拟数据调制为模拟信号 我们之前讲了物理层的一些基础知识和两个准则&a…

音频的录制及播放

在终端安装好pip install pyaudio&#xff0c;在pycharm中敲入录音的代码&#xff0c;然后点击运行可以在10s内进行录音&#xff0c;录音后的音频会保存在与录音代码同一路径项目中&#xff0c;然后再新建项目敲入播放的代码&#xff0c;点击运行&#xff0c;会把录入的录音进行…

关于UE的相机震动CameraShake

创建CameraShake资源 CameraShake配置是个蓝图类&#xff0c;我们选择创建BlueprintClass&#xff0c;父类选择CameraShakeBase即可。 参数调整 目前主要用到了 LocationAmplitudeMultiplier 1 LocationFrequencyMultiplier 10 RotationAmplitudeMultiplier 1 Rotation…

嵌入式系统和物联网常见的开发板介绍

嵌入式系统和物联网&#xff08;IoT&#xff09;领域&#xff0c;开发板是工程师和开发者进行原型设计和项目开发的重要工具。开发板通常集成了微控制器或处理器、内存、输入/输出接口和外设&#xff0c;以便于快速实现功能验证和产品原型。在本教程中&#xff0c;我们将讨论一…

Java设计模式 | 设计模式概述和分类

独孤求败五重境界 利剑&#xff08;“凌厉刚猛&#xff0c;无坚不摧&#xff0c;弱冠前以之与河朔群雄争锋。”&#xff09;软剑&#xff08;“紫薇软剑&#xff0c;三十岁前所用&#xff0c;误伤义士不祥&#xff0c;乃弃之深谷。”&#xff09;重剑&#xff08;“重剑无锋&a…

mybatis源码阅读系列(二)

前言 上一篇文章mybatis源码阅读系列&#xff08;一&#xff09;介绍了mybatis和原生jdbc的区别&#xff0c;并通过代码展示了两者的运行过程和结果&#xff0c;下面让我们继续详细了解下mybatis的执行过程&#xff1b; package com.wyl.mybatis.service;import com.wyl.mybat…

C语言字符函数和字符串函数详解

Hello, 大家好&#xff0c;我是一代&#xff0c;今天给大家带来有关字符函数和字符串函数的有关知识 所属专栏&#xff1a;C语言 创作不易&#xff0c;望得到各位佬们的互三呦 一.字符函数 在C语言中有一些函数是专门为字符设计的&#xff0c;这些函数的使用都需要包含一个头文…

Navicat 面试题及答案整理,最新面试题

Navicat 在数据库管理中的主要用途有哪些&#xff1f; Navicat 是一款数据库管理工具&#xff0c;其主要用途包括&#xff1a; 1、多数据库支持&#xff1a; Navicat 支持多种数据库连接&#xff0c;包括 MySQL、Oracle、PostgreSQL、SQLite、SQL Server 等&#xff0c;方便用…

第二门课:改善深层神经网络<超参数调试、正则化及优化>-超参数调试、Batch正则化和程序框架

文章目录 1 调试处理2 为超参数选择合适的范围3 超参数调试的实践4 归一化网络的激活函数5 将Batch Norm拟合进神经网络6 Batch Norm为什么会奏效&#xff1f;7 测试时的Batch Norm8 SoftMax回归9 训练一个SoftMax分类器10 深度学习框架11 TensorFlow 1 调试处理 需要调试的参…

考研C语言复习进阶(6)

目录 1. 程序的翻译环境和执行环境 2. 详解编译链接 2.1 翻译环境 ​编辑​编辑 2.2 编译本身也分为几个阶段&#xff1a; 2.3 运行环境 3. 预处理详解 3.1 预定义符号 3.2 #define 3.2.1 #define 定义标识符 3.2.2 #define 定义宏 2.2.3 #define 替换规则 3.2.4…

FFmpeg 常用命令汇总

​​​​​​经常用到ffmpeg做一些视频数据的处理转换等&#xff0c;用来做测试&#xff0c;今天总结了一下&#xff0c;参考了网上部分朋友的经验&#xff0c;一起在这里汇总了一下。 1、ffmpeg使用语法 命令格式&#xff1a; ffmpeg -i [输入文件名] [参数选项] -f [格…

软考--软件设计师(磁盘管理的例题)

流水线的理论公式&#xff1a; 单缓冲区&#xff1a;同一时间内只能允许一个进程进行写入读出&#xff0c;所以每个盘块经过缓冲区的时间是&#xff08;155微秒&#xff09;&#xff0c;之后再用1微秒的时间进行处理。在处理的同时&#xff0c;下一个盘块写入缓冲区&#xff0c…

牛客网-SQL大厂面试题-2.平均播放进度大于60%的视频类别

题目&#xff1a;平均播放进度大于60%的视频类别 DROP TABLE IF EXISTS tb_user_video_log, tb_video_info; CREATE TABLE tb_user_video_log (id INT PRIMARY KEY AUTO_INCREMENT COMMENT 自增ID,uid INT NOT NULL COMMENT 用户ID,video_id INT NOT NULL COMMENT 视频ID,start…

perl 用 XML::DOM 解析 Freeplane.mm文件,生成测试用例.csv文件

Perl 官网 www.cpan.org 从 https://strawberryperl.com/ 下载网速太慢了 建议从 https://download.csdn.net/download/qq_36286161/87892419 下载 strawberry-perl-5.32.1.1-64bit.zip 约105MB 解压后安装.msi&#xff0c;装完后有520MB&#xff0c;建议安装在D:盘。 运行 …