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

news2025/1/8 5:45:27

 快速跳转文章列表:SQLite—系列文章目录

上一篇:SQLiteC/C++接口详细介绍之sqlite3类(三)

下一篇:SQLiteC/C++接口详细介绍之sqlite3类(五)

编写不易,有用的朋友点个赞或加粉一下万分感谢!300名内回关! 

9、跟踪和分析功能相关的sqlite3_profile与sqlite3_trace(注意:这些例程官方已弃用不建议新工程建议用,而用sqlite3_trace_v2()替代

void *sqlite3_trace(sqlite3*,   void(*xTrace)(void*,const char*), void*);
void *sqlite3_profile(sqlite3*,   void(*xProfile)(void*,const char*,sqlite3_uint64), void*);

这些函数注册可用于跟踪和分析SQL语句的执行。
        由sqlite3_trace()注册的回调函数在sqlite3_step()运行SQL语句的各种时间。sqlite3_trace()回调是使用UTF-8渲染的SQL语句文本作为语句首先开始执行。可能会出现其他sqlite3_trace()回调输入每个触发的子程序。触发器的回调包含标识触发器的UTF-8SQL注释。
SQLITE_TRACE_SIZE_LIMIT编译时选项可用于限制sqlite3_trace()输出中绑定参数展开的长度。
调用sqlite3_profile()注册的回调函数当每个SQL语句完成时。配置文件回调包含原始声明文本和挂钟时间的估计值该声明运行了多长时间。配置文件回调时间以纳秒为单位,但当前的实现只能达到毫秒级分辨率,所以六个最不重要时间中的数字是没有意义的。SQLite的未来版本可能会在探查器回调上提供更高的分辨率。调用sqlite3_trace()或sqlite3_trace_v2()将取消配置文件回调。 

        sqlite3trace函数的基本使用方法如下: int sqlite3trace(sqlite3, void(xTrace)(void, const char), void* );  其中,第一个参数为数据库句柄,第二个参数为一个回调函数(callback function),用于处理跟踪信息,第三个参数为一个上下文参数,可选。当SQL查询执行时,SQLite将会对查询中的每一步操作都调用该回调函数,并将相应的跟踪信息作为参数传递给它。
        sqlite3_trace函数的回调函数需要接收两个参数:第一个参数为在SQLite中执行的SQL查询语句的文本,第二个参数为指向查询文本结尾的空指针。我们可以在该回调函数中将获取到的跟踪信息输出到标准错误流、文本文件或其他日志记录器中,以便进一步分析和调试。

        sqlite3profile函数的基本使用方法如下: int sqlite3profile(sqlite3, void(xProfile)(void,const char,sqlite3_uint64), void* );  其中,第一个参数为数据库句柄,第二个参数为回调函数(callback function),用于处理性能分析信息,第三个参数为一个上下文参数,可选。当SQL查询执行时,SQLite将会对查询中的每一步操作的各种信息都调用该回调函数,并将相应的性能分析信息作为参数传递给它。
        sqlite3_profile函数的回调函数需要接收三个参数:第一个参数为查询的文本,第二个参数为指向查询文本结尾的空指针,第三个参数为表示该查询步骤执行所需时间的64位整数,单位是毫秒。我们可以在该回调函数中处理性能分析信息,比如将查询和执行时间保存到文件中或打印到终端上,以便进一步分析和优化程序的性能。
注意:sqlite3_trace、sqlite3profile函数可能会影响预期的性能,因为它会在执行过程中多次回调,所以在不需要跟踪SQL查询的时候,应该将其关闭。 

10、sqlite3_blob_open功能:打开一个已存在于数据库中的BLOB数据(二进制大型对象)

int sqlite3_blob_open(
  sqlite3*,          /*数据库连接*/
  const char *zDb,   /*数据库名,如果直接传NULL,则表示打开默认数据库*/
  const char *zTab,  /*目标表名*/
  const char *zCol,  /*目标列名*/
  sqlite3_int64 iRow,/*对应行的主键值*/
  int flags,         /*标记位*/
  sqlite3_blob** pp  /*BLOB句柄*/
);

其中,参数为数据库名,如果直接传NULL,则表示打开默认数据库;参数表示目标表名,表示目标BLOB列名;表示对应行的主键值;表示标记位,可以为、和等。用来保存指向打开的BLOB数据的句柄。
通过函数打开BLOB数据之后,我们就可以使用和函数来进行读取和写入操作。
注意:在打开BLOB数据时,数据库连接对象必须被正确的初始化并且没有激活的事务。当我们完成所有的读写操作后,需要使用函数调用sqlite3_blob_close()来关闭BLOB数据的句柄。 

此接口打开位于BLOB的句柄在数据库zDb中的行iRow、列zColumn、表zTable中;换言之,将选择的相同BLOB:
SELECTzColumnFROMzDb.zTableWHERErowid=iRow;
参数zDb不是包含数据库的文件名,而是而是数据库的符号名称。对于附加的数据库,这是在ATTACH语句中AS关键字后面显示的名称。对于主数据库文件,数据库名称为“main”。对于TEMP表,数据库名称为“temp”。
如果flags参数不为零,则打开BLOB进行读取和写入访问权限。如果flags参数为零,则为只读访问权限。
成功后,将返回SQLITE_OK并存储新的BLOB句柄在*ppBlob中。否则,将返回错误代码,除非错误code为SQLITE_MISUSE,*ppBlob设置为NULL。这意味着,如果API没有被滥用,在它返回此函数后,在*ppBlob上调用sqlite3_blob_close()始终是安全的。
如果满足以下任一条件,则此函数将失败并显示SQLITE_ERROR:
数据库zDb不存在,
表zTable在数据库zDb中不存在,
TablezTable是一个WITHOUTROWID表,
列zColumn不存在,
表中不存在RowiRow,
行iRow的指定列包含的值不是TEXT或BLOB值,
列zColumn是索引、PRIMARYKEY或UNIQUE的一部分约束,并且正在打开blob进行读/写访问,
启用外键约束,列zColumn是子键定义的一部分,blob是正在打开以进行读/写访问。
除非它返回SQLITE_MISUSE,否则此函数设置可通过sqlite3_errcode()和sqlite3_errmsg()及相关函数访问的数据库连接错误代码和消息。
可以使用sqlite3_blob_read()接口读取sqlite3_blob_open()引用的BLOB,并使用sqlite3_blob_write()进行修改。BLOB句柄可以移动到使用sqlite3_blob_reopen()接口的同一表的不同行。但是,打开BLOB句柄后,无法更改BLOB句柄的列、表或数据库。
如果BLOB句柄指向的行由UPDATE、DELETE或ONCONFLICT修改副作用则BLOB句柄标记为“已过期”。如果更改了行的任何列,甚至是一列,则为真BLOB句柄打开的句柄除外。调用sqlite3_blob_read()和sqlite3_blob_write()过期的BLOB句柄失败,返回代码为SQLITE_ABORT。在BLOB过期之前写入BLOB的更改不会在BLOB过期时回滚。这些变化最终会如果事务继续完成,则提交。
使用sqlite3_blob_bytes()接口确定打开的Blob。Blob的大小可能不会因此而改变接口。使用UPDATESQL命令更改斑点。
sqlite3_bind_zeroblob()和sqlite3_result_zeroblob()接口内置的zeroblobSQL函数可用于创建一个要使用Incremental-blob接口读取或写入的零填充Blob。
注意:为了避免资源泄漏,每个打开的BLOB句柄最终都应通过调用sqlite3_blob_close()释放。

11、sqlite3_db_mutex函数获取绑定到给定数据库连接的互斥锁(mutex)。

SQLite使用互斥锁维护数据库内部的数据一致性和线程安全性,保证同一时刻只有一个线程能够访问某个特定的数据库连接。在多线程程序中使用SQLite进行数据访问时,我们需要首先使用函数获取对应的互斥锁,然后才能使用该数据库连接进行读写操作。
而函数就可以返回与某个数据库连接绑定的互斥锁对象的指针,从而方便我们获取到该数据库连接的互斥锁这个函数的使用方法如下:

sqlite3_mutex* sqlite3_db_mutex(sqlite3* db);

 其中,参数表示要获取互斥锁的数据库连接对象。调用该函数会返回类型的互斥锁对象指针。
注意:使用函数获取到的互斥锁只能保护该数据连接对象本身,而不能保证整个数据库的线程安全性。要保证整个数据库的线程安全性,我们需要使用SQLite提供的全局互斥锁对象(全局互斥锁可以使用函数来分配)。

12、中断长时间运行的查询sqlite3_interrupt与sqlite3_is_interrupted函数

用于发送中断信号(例如SIGINT)给正在执行的SQL查询语句,以立即中止正在进行的操作。该函数可以在多线程或异步I/O等环境中使用,让我们能够更加有效地控制SQL查询的执行。

此函数会导致任何挂起的数据库操作中止,并且尽早返回。此例程通常为为响应用户操作(如按“取消”)而调用或Ctrl-C,用户希望停止长时间的查询操作马上。
从与当前正在运行数据库操作的线程。但它使用数据库连接调用此例程是不安全的在sqlite3_interrupt()返回之前已关闭或可能关闭。
如果SQL操作在以下时间几乎完成sqlite3_interrupt()被调用,那么它可能没有机会被中断,并可能继续完成。
中断的SQL操作将返回SQLITE_INTERRUPT。如果中断的SQL操作是INSERT、UPDATE或DELETE即在显式事务中,然后是整个事务将自动回滚。
sqlite3_interrupt(D)调用一直有效,直到所有当前都在运行数据库连接D上的SQL语句完成。任何新的SQL语句在sqlite3_interrupt()调用之后和运行语句计数达到零时会中断,就好像它们被打断了一样在sqlite3_interrupt()调用之前运行。新的SQL语句在运行语句计数达到零后启动的为不受sqlite3_interrupt()的影响。对sqlite3_interrupt(D)的调用,当没有运行时发生SQL语句是无操作,对SQL语句没有影响在sqlite3_interrupt()调用返回后启动。
sqlite3_is_interrupted(D)接口可用于确定是否或者当前对数据库连接D没有中断。如果中断当前有效,则返回1,否则返回0。 

13.sqlite3_progress_handler函数:

设置一个进度回调函数,当SQL查询语句执行的进度符合某个特定的标准时,就会调用指定的回调函数。这个函数通常用来监测长时间运行的查询,以提供更新或取消查询的功能。用法如下:

void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*);

其中,第一个参数是数据库连接句柄,第二个参数是步长(一个非负整数),每次查询完成这个步数后会调用回调函数。第三个参数指定回调函数的指针,第四个参数是传递给回调函数的参数。
在运行查询时,SQLite会定期调用这个回调函数以检查查询的运行状态。如果“步数”被执行,则回调函数被调用。注意,此函数在大多数情况下尽最大努力会每处理完一个查询就调用一次回调函数,不过在低级别I/O操作时,可能存在队列区块大小等问题。
回调函数应该返回一个非零值,以表示希望取消查询或执行某些其他处理;返回零则表示要继续执行查询(不进行任何其他处理)。

注意:函数不是一个使查询更快完成的手段,而是一个监测工具,用于提供查询的更新或取消功能。对于长时间运行的查询,应该适当地使用这个函数,以避免程序因为长次运行而出现阻塞的情况。

参考文献:

1. C-language Interface Specification for SQLite官方说明文档

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

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

相关文章

详解命令docker run -d --name container_name -e TZ=Asia/Shanghai your_image

docker run 是Docker的主要命令,用于从镜像启动一个新的容器。下面详细解释并举例说明 -d, --name, -e TZ 参数的用法: -d 或 --detach: 这个标志告诉Docker以守护进程(后台)模式运行容器。这意味着当你执行 docker ru…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《适应分布式资源渗透率提高的配电网网元规划方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TextArea)

多行文本输入框组件,当输入的文本内容超过组件宽度时会自动换行显示。 高度未设置时,组件无默认高度,自适应内容高度。宽度未设置时,默认撑满最大宽度。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容&…

【Java设计模式】二十三、解释器模式

文章目录 1、解释器模式2、案例 1、解释器模式 计算一个表达式的值,比如12-34-7,单纯的定义方法或函数很难适配所有,因为数值和运算符可以有无数种组合。 //用于n个整数相加 public static int add(Integer ... arr) {int sum 0;for (Inte…

【spring】@PropertySource 注解学习

PropertySource介绍 PropertySource是Spring框架中的一个注解,主要用于Java配置类中,用于引入额外的属性文件,以便在Spring应用上下文中使用这些属性。 在Spring 3.1引入Java配置后,我们可以通过Configuration注解的类和Bean注解…

数据结构之链式二叉树

当我们初步了解二叉树后 我们就可以进一步去深入学习二叉树了 1.链式二叉树的遍历 这里我们先去定义链式二叉树的结构 分为两个指针 一左一右 他们分别指向左子树和右子树 typedef int BTDataType;typedef struct BinaryTreeNode {BTDataType data;struct BinartTreeNod…

气液分离器的选型介绍

气液分离器在热泵或制冷系统中的基本作用是分离出并保存回气管里的液体以防止压缩机液击。因此,它可以暂时储存多余的制冷剂液体,并且也防止了多余制冷剂流到压缩机曲轴箱造成油的稀释。因为在分离过程中,冷冻油也会被分离出来并积存在底部,所以在气液分离器出口管和底部会…

Mybatis的简介和实现增删改查

第一章:框架的概述 JDBC存在的问题 我们要想研究mybatis就必须知道jdbc所存在的问题,那我那么我们首先来复习一下jdbc操作数据库的大致流程。 1.加载数据库驱动 2.创建并获取数据库连接对象connection 3.通过连接对象获取会话对象statement 4.编写sql…

Docker 系列2【docker安装mysql】【开启远程连接】

文章目录 前言开始步骤1.增加mysql挂载目录2.下载镜像2.启动容器具体步骤4.无法连接5.测试连接 总结 前言 本文开始,默认已经安装docker,如果你还没有完成这个步骤,请查看这一篇文章【docker安装与使用】 开始步骤 1.增加mysql挂载目录 m…

考研模拟面试-答案【攻略】

考研模拟面试-答案【攻略】 前言版权推荐考研模拟面试-答案前面的问题通用问题专业题数据结构计算机网络操作系统数据库网络安全 手写题数据结构操作系统计算机网络 代码题基础代码题其他代码题 后面的问题补充题目 基础代码题答案链栈循环队列1循环队列2哈希表 最后 前言 202…

pytorch升级打怪(三)

数据集合数据加载器 简介加载数据集迭代和可视化数据集为您的文件创建自定义数据集__init____len____getitem__ 准备您的数据以使用DataLoaders进行训练通过DataLoader进行遍载 简介 处理数据样本的代码可能会变得混乱且难以维护;理想情况下,我们希望我…

C++笔记:从零开始一步步手撕高阶数据结构AVL树

文章目录 高度平衡二叉搜索树实现一颗AVL树结点与树的描述——定义类AVL树的插入操作步骤1:按照二叉搜索树的方法插入结点步骤2:自底向上调整平衡因子步骤3:触发旋转操作(AVL树平衡的精髓)右单旋左单旋左右双旋右左双旋…

AtomoVideo:AIGC赋能下的电商视频动效生成

✍🏻 本文作者:凌潼、依竹、桅桔、逾溪 1. 概述 当今电商领域,内容营销的形式正日趋多样化,视频内容以其生动鲜明的视觉体验和迅捷高效的信息传播能力,为商家创造了新的机遇。消费者对视频内容的偏好驱动了视频创意供给…

C语言基础之结构体

文章目录 一、结构体1、结构体概述2、结构体类型的定义方式(1)先定义结构体类型,再定义结构体变量(2)结构体类型、变量同时定义(3)一次性结构体 3、结构体成员的初始化(1)结构体初始化(2)清空结…

linux用git拉取我云端以及git处理冲突

拉取后切换一个跟云端分支(dev)一样的 git branch --set-upstream-toorigin/dev dev 之后就同步了 A在dev分支写了iii,提交 B在dev分支写了hhh,提交,冲突 怎么修改,B把云端的拉下来,随便改改就行

找准方向选CRM客户管理系统!2023年排行榜推荐

本文将为大家带来2023有哪些好用CRM客户管理系统?CRM系统排行榜基于品牌知名度、功能、产品实力、系统稳定性、用户体量等多重因素考量。其中Zoho CRM、红圈CRM等产品市场表现优异入选此次榜单。 1.Zoho CRM 公司成立时间:1996年 Zoho(卓豪…

你为什么是你,而不是别人?认识人格的力量

你为什么是你,而不是别人?让你做自我介绍,你会怎么描述自己呢? 人格心理学是心理学的一门重要分支学科。探求、描述和揭示个体思想、情绪及行为的独特模式,综合个人与环境诸多影响因素,对现实社会中的个人作…

jenkins部署go应用 基于docker-compose

丢弃旧的的构建 github 拉取代码 指定go的编译版本 安装插件 拉取代码是排除指定的配置文件 比如 conf/config.yaml 文件 填写配置文件内容 比如测试环境一些主机信息 等 可以配置里面 构建的时候选择此文件替换开发提交的配置文件。。。。 编写docker-compose 文件 docker…

【PythonCode】力扣Leetcode6~10题Python版

【PythonCode】力扣Leetcode6~10题Python版 前言 力扣Leetcode是一个集学习、刷题、竞赛等功能于一体的编程学习平台,很多计算机相关专业的学生、编程自学者、IT从业者在上面学习和刷题。 在Leetcode上刷题,可以选择各种主流的编程语言,如C、…

渐开线花键不是齿轮?

在和一位小伙伴交流时,他认为齿轮和花键不一样,那花键是不是齿轮呢?老师傅们可以绕开了,我觉得对于一些平时接刚刚接触齿轮,或者很少接触的朋友来说,还是有必要聊一聊这个话题。 首先这个问题并不严谨&…