当前位置: 首页 > 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;抗干…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...