当前位置: 首页 > news >正文

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++;                                                      // 计数器加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。

相关文章:

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

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十四&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十六&#xff09; 47.sqlite3_set_authorizer 用法&#xff…...

每日三个JAVA经典面试题(十八)

1.volatile 关键字的作用 在Java中&#xff0c;volatile关键字用于声明变量&#xff0c;以确保该变量的更新对所有线程都是可见的&#xff0c;即当一个线程修改了一个volatile变量的值&#xff0c;这个新值对于其他线程来说是立即得知的。volatile关键字有两个主要作用&#x…...

RPC 和 序列化

RPC 1 RPC调用流程 1.1 clerk客户端调用远程服务 Clerk::PutAppend() raftServerRpcUtil::PutAppend() raftServerRpcUtil是client与kvserver通信的入口&#xff0c; 包含kvserver功能的一对一映射&#xff1a;Get/PutAppend&#xff0c;通过stub对象——raftKVRpcProctoc:…...

【原创】三十分钟实时数据可视化网站前后端教程 Scrapy + Django + React 保姆级教程向

这个本来是想做视频的&#xff0c;所以是以讲稿的形式写的。最后没做视频&#xff0c;但是觉得这篇文还是值得记录一下。真的要多记录&#xff0c;不然一些不常用的东西即使做过几个月又有点陌生了。 文章目录 爬虫 SCRAPYxpath 后端 DJANGO前端 REACT Hello大家好这里是小鱼&a…...

MySQL的备份

为什么要备份&#xff1a; 1.保证重要的数据不丢失 2.数据转移 MySQL数据库备份的方式&#xff1a; 1.直接拷贝物理文件 2.在可视化工具中手动导出 &#xff08;1&#xff09;在想要导出的表或者数据库中&#xff0c;右键&#xff0c;选择备份或导出 使用命令行导出 MyS…...

Linux 磁盘的一生

注意&#xff1a;实验环境都是使用VMware模拟 ​ 磁盘接口类型这里vm中是SCSI&#xff0c;扩展sata,ide(有时间可以看看或者磁盘的历史) ​ 总结&#xff1a;磁盘从有到无—类似于建房子到可以住 ————————————————————————————————————…...

C#配置连接数据库字段

在Web.config文件中 添加如下配置 <!--连接数据库字段--><connectionStrings><add name"sql" connectionString"server.;uidsa;pwd8888;databaseArticleWebSite" /></connectionStrings>...

QCOM和其他常见芯片平台术语缩写

1 QCOM 1.1 General Qualcomm: Quality Communications ALSA DCP&#xff1a;ALSA由DAI、Codec、Platform三部分组成 ALSA TLV&#xff1a;Type-Length-Value Alternative Mode: 替代模式 ANC&#xff1a;Automatic Noise Canceller ASM: Anntena Switch Module AT&#xff1a;…...

css页面布局

CSS属性书写顺序&#xff08;重点&#xff09; 建议遵循以下顺序: 布局定位属性:display / position/ float / clear / visibility / overflow&#xff08;建议display第一个写&#xff0c;毕竟关系到模式) 自身属性:width / height / margin / padding / border / background…...

6、Design Script之列表

Range 在DesignScript中,Range是从起点到终点的一系列数字,使用指定的步距(间距类型),并有以下的初始化方法: start..end..step; start..end..#amount; start..end..~approximate; Range可以是数字的,也可以是字母的。 字母范围因大小写而异。 开始,结束. .#数量范围(…...

Mysql数据库的多实例部署

mysql多实例部署 先进行软件下载 上传二进制格式的mysql软件包 [rootcjy ~]# ls anaconda-ks.cfg mysql-8.0.35-linux-glibc2.28-x86_64.tar.xz配置用户和组并解压二进制程序至/usr/local下 创建用户和组 [rootcjy ~]# useradd -r -s /sbin/nologin -M mysql解压软件至/usr…...

陈巍:Sora大模型技术精要万字详解(上)——原理、关键技术、模型架构详解与应用

​目录 收起 1 Sora的技术特点与原理 1.1 技术特点概述 1.2 时间长度与时序一致性 1.3 真实世界物理状态模拟 1.4 Sora原理 1.4.1扩散模型与单帧图像的生成 1.4.2 Transformer模型与连续视频语义的生成 1.4.3 从文本输入到视频生成 2 Sora的关键技术 2.1 传统文生图技…...

JS原型和原型链的理解

原型链图&#xff0c;图中Parent是构造函数&#xff0c;p1是通过Parent实例化出来的一个对象 前置知识 js中对象和函数的关系&#xff0c;函数其实是对象的一种 函数、构造函数的区别&#xff0c;任何函数都可以作为构造函数&#xff0c;但是并不能将任意函数叫做构造函数&…...

力扣题单(小白友好)

力扣题单 算法小白自用题单,目前对于一些简单的数据结构感觉掌握的还可以,但是力扣很多题还是需要看题解,不够熟练;故整理了一份题单,用于巩固练习; 网上确实有很多对于算法分类讲解的网站,but:有一丢丢选择困难症,每天不知道该刷什么题,再加上网站对于一类题一般就有十几道题目…...

王道c语言ch11-单链表的新建、插入、删除例题

王道c语言ch11-单链表的新建、插入、删除例题 #include <stdio.h> #include <stdlib.h> #define END 33typedef int ElemType;typedef struct LNote {ElemType data;struct LNote *next; } LNote, *LinkList;//头插法 void list_head_insert(LinkList &L) {El…...

蓝桥杯刷题--python-23

2.危险系数 - 蓝桥云课 (lanqiao.cn) n, m map(int, input().split()) map_ [[] for i in range(n 1)] used [0 for i in range(n 1)] used_ [0 for i in range(n 1)] cnt 0 res [] for _ in range(m):u, v map(int, input().split())map_[u].append(v)map_[v].appen…...

蓝桥杯刷题--python-24

0地图 - 蓝桥云课 (lanqiao.cn) from math import * import sys from functools import lru_cache # sys.setrecursionlimit(100000) n, m, k map(int, input().split()) a [input() for i in range(n)] dr [(0, 1), (1, 0)] cnt 0 lru_cache(maxsizeNone) def dfs(x, y, …...

面向对象(C# )

面向对象&#xff08;C# &#xff09; 文章目录 面向对象&#xff08;C# &#xff09;ref 和 out传值调用和引用调用ref 和 out 的使用ref 和 out 的区别 结构体垃圾回收GC封装成员属性索引器静态成员静态类静态构造函数拓展方法运算符重载内部类和分布类 继承里氏替换继承中的…...

Lombok:@Cleanup资源释放利器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、Cleanup介绍 二、使用示例 三、价值阐述 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、Cleanup介绍 Cleanup可以自动管理输…...

IoT 物联网场景中 LoRa + 蓝牙Bluetooth 室内场馆高精定位技术全面解析

基于LoRa蓝牙的室内场景定位技术&#xff0c;蓝牙主要负责位置服务&#xff0c;LoRa主要负责数据传输。 01 LoRa和蓝牙技术 LoRa全称 “Long Rang”&#xff0c;是一种成熟的基于扩频技术的低功耗、超长距离的LPWAN无线通信技术。LoRa主要采用的是窄带扩频技术&#xff0c;抗干…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动&#xff08;如演唱会、马拉松赛事、高考中考等&#xff09;期间&#xff0c;城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例&#xff0c;暖城商圈曾因观众集中离场导致周边…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...