SQLiteC/C++接口详细介绍之sqlite3类(十)
返回目录:SQLite—免费开源数据库系列文章目录
上一篇:SQLiteC/C++接口详细介绍之sqlite3类(九)
下一篇:SQLiteC/C++接口详细介绍之sqlite3类(十一)
30.sqlite3_enable_load_extension:
用于开启或关闭SQLite3扩展库的加载功能。
SQLite3支持各种扩展库,可以通过动态链接库的方式将外部的C/C++函数和代码集成到SQLite3中。但是,为了防止恶意用户在SQLite3中执行外部代码,SQLite3默认情况下是关闭扩展库加载功能的。可以使用sqlite3_enable_load_extension函数来开启这个功能,从而加载和调用扩展库中的函数。
函数原型:
int sqlite3_enable_load_extension(sqlite3* db, int onoff, char** errmsg);
其中,db是一个指向SQLite3数据库实例的指针;onoff参数是一个整数值,用于表示是否允许加载扩展库,1表示允许,0表示禁止;errmsg是一个指向指向存储错误信息的指针的指针。
下面是一个简单的示例,展示如何使用sqlite3_enable_load_extension函数来加载扩展库和执行其中的函数。
#include <sqlite3.h>
#include <stdio.h>
// 全局变量,用于缓存错误信息
char* errmsg;
int main(int argc, char* argv[]) {sqlite3* db;int rc;// 打开数据库rc = sqlite3_open("test.db", &db);if (rc != SQLITE_OK) {printf("Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}// 开启扩展库加载功能rc = sqlite3_enable_load_extension(db, 1, &errmsg);if (rc != SQLITE_OK) {printf("Can't load extension: %s\n", errmsg);sqlite3_free(errmsg);sqlite3_close(db);return 1;}
// 加载扩展库rc = sqlite3_load_extension(db, "./myextension.dll", "myext_init", &errmsg);if (rc != SQLITE_OK) {printf("Can't load extension: %s\n", errmsg);sqlite3_free(errmsg);sqlite3_close(db);return 1;}// 使用扩展库中的函数rc = sqlite3_exec(db, "SELECT myfunc(1, 2)", NULL, NULL, &errmsg);if (rc != SQLITE_OK) {printf("Can't execute function: %s\n", errmsg);sqlite3_free(errmsg);}// 关闭数据库sqlite3_close(db);return 0;
}
在上面的示例代码中,sqlite3_open函数用于打开SQLite3数据库,然后使用sqlite3_enable_load_extension函数开启扩展库加载功能,接着使用sqlite3_load_extension函数加载扩展库。
在成功加载扩展库后,我们可以使用sqlite3_exec函数来执行扩展库中的函数。这里使用的SQL语句是"SELECT myfunc(1, 2)",其中myfunc是扩展库中定义的函数名,该函数接受两个整数参数,返回它们的和。
注意:加载并执行扩展库中的函数需要谨慎处理,为了避免安全隐患,最好将扩展库限制在少数可信用户访问的场合中。
31.sqlite3_extended_result_codes
功能:设置SQLite3返回的结果码是否启用扩展模式。在扩展模式下,SQLite3将返回更详细的错误信息,以帮助开发者更准确地诊断和解决问题。
该函数的具体形式为:
int sqlite3_extended_result_codes(sqlite3 *db, int onoff);
其中,db是一个指向SQLite3数据库实例的指针;onoff参数是一个整数值,用于表示是否启用扩展模式,1表示启用,0表示停止。
当SQLite3返回错误码时,可以使用sqlite3_errcode和sqlite3_errmsg函数来分别获取SQLite3返回的错误码和错误信息。当启用扩展模式后,可以使用sqlite3_extended_errcode和sqlite3_errstr函数分别获取扩展错误码和错误信息。
SQLite3中的错误码通常包括一个主码和一个子码,其中主码表示错误类型,子码表示具体错误原因。扩展错误码将主码和子码用32位整数表示,其中主码占最高8位,子码占最低24位。可以使用sqlite3_errcode函数来获取这个32位扩展错误码。
下面是一个简单的示例,展示如何使用sqlite3_extended_result_codes函数来启用扩展模式和获取扩展错误信息。
#include <sqlite3.h>
#include <stdio.h>
int main(int argc, char* argv[]) {sqlite3* db;int rc;// 打开数据库rc = sqlite3_open("test.db", &db);if (rc != SQLITE_OK) {printf("Can't open database: %s\n", sqlite3_errstr(rc));sqlite3_close(db);return 1;}// 启用扩展模式sqlite3_extended_result_codes(db, 1);// 执行错误的SQL语句rc = sqlite3_exec(db, "SELECT * FROM non_existing_table", NULL, NULL, NULL);if (rc != SQLITE_OK) {printf("SQLite error code (extended): %d\n", sqlite3_extended_errcode(db));printf("SQLite error message: %s\n", sqlite3_errstr(rc));printf("SQLite extended error message: %s\n", sqlite3_errmsg(db));}// 关闭数据库sqlite3_close(db);return 0;
}
在上面的示例代码中,我们首先使用sqlite3_open函数打开SQLite3数据库。然后,使用sqlite3_extended_result_codes函数启用扩展模式,执行一条错误的SQL语句,并使用sqlite3_extended_errcode和sqlite3_errmsg函数来获取扩展错误码和错误信息。
这里使用的SQL语句是"SELECT * FROM non_existing_table",由于表不存在,SQLite3会返回错误码"no such table",这时我们就可以使用上述函数来获取扩展错误码和错误信息,帮助开发者更准确地定位和解决问题。
32.sqlite3_file_control
sqlite3_file_control是SQLite3 C API提供的一个函数,用于设置和查询数据库文件的额外信息和状态。
函数原型:
int sqlite3_file_control(sqlite3 *db, const char *zDbName, int op, void *pArg);
其中,db是一个指向SQLite3数据库实例的指针;zDbName是一个字符串,用于表示数据库文件名,如果是主数据库,则该参数为"main";op是一个整数值,用于表示操作类型;pArg是一个指向操作的参数的指针。
op 参数可以在13种操作选项中进行选择,例如:
- SQLITE_FCNTL_LOCKSTATE:获取数据库文件当前的锁状态;
- SQLITE_FCNTL_SIZE_HINT:设置数据库文件的大小;
- SQLITE_FCNTL_CHUNK_SIZE:设置缓冲区块的大小;
- SQLITE_FCNTL_SYNC_OMITTED:获取数据库文件是否需要强制刷新到磁盘等。
不同的操作选项需要不同的参数类型和结构体,可以参考SQLite3文档中的具体说明进行使用。一般来说,这些操作选项的参数和用法都非常贴近文件系统的操作。
下面是一个简单的示例,展示如何使用sqlite3_file_control函数来查询数据库文件的锁状态。
#include <sqlite3.h>
#include <stdio.h>
int main(int argc, char* argv[]) {sqlite3* db;int rc;// 打开数据库rc = sqlite3_open("test.db", &db);if (rc != SQLITE_OK) {printf("Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}// 获取数据库文件的锁状态int lock_state;rc = sqlite3_file_control(db, "main", SQLITE_FCNTL_LOCKSTATE, &lock_state);if (rc != SQLITE_OK) {printf("Can't get lock state: %s\n", sqlite3_errmsg(db));} else {printf("Lock state: %d\n", lock_state);}// 关闭数据库sqlite3_close(db);return 0;
}
在示例代码中,我们使用sqlite3_open函数打开数据库,然后使用sqlite3_file_control函数来查询数据库文件的锁状态。这里使用的操作选项是SQLITE_FCNTL_LOCKSTATE,获取的参数是一个整数值,表示数据库文件的锁状态。
如果rc返回值不为SQLITE_OK,则表示操作失败,可以使用sqlite3_errmsg函数来获取错误信息;否则,获取到的数据库文件的锁状态可以使用printf函数输出到控制台上。
注意:使用sqlite3_file_control函数对数据库进行操作时,需要非常小心,遵循SQLite3文档所规定的参数和用法,以避免操作错误,影响数据库的正常运行。
相关文章:

SQLiteC/C++接口详细介绍之sqlite3类(十)
返回目录:SQLite—免费开源数据库系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(九) 下一篇:SQLiteC/C接口详细介绍之sqlite3类(十一) 30.sqlite3_enable_load_extension&#x…...
Vue中nextTick一文详解
什么是 nextTick? 在 Vue 中,当我们修改数据时,Vue 会自动更新视图。但是,由于 JavaScript 的事件循环机制,我们无法立即得知视图更新完成的时机。这时候,我们就需要使用 nextTick 来获取视图更新完成后的…...

爱奇艺 CTR 场景下的 GPU 推理性能优化
01 背景介绍 GPU 目前大量应用在了爱奇艺深度学习平台上。GPU 拥有成百上千个处理核心,能够并行的执行大量指令,非常适合用来做深度学习相关的计算。在 CV(计算机视觉),NLP(自然语言处理)的模型…...

详解MySql索引
目录 一 、概念 二、使用场景 三、索引使用 四、索引存在问题 五、命中索引问题 六、索引执行原理 一 、概念 索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。暂时可以理解成C语言的指针,文章后面详解 二、使用场景 数据量较大,且…...
struct 和 union 的区别?
struct和union的分对应点总结 存储方式: struct:struct中的每个成员都拥有独立的内存空间。一个struct变量的总长度是其所有成员的长度之和,且通常会根据编译器的内存对齐规则进行适当调整。union:union中的所有成员共享同一段内…...

Linux - 安装 Jenkins(详细教程)
目录 前言一、简介二、安装前准备三、下载与安装四、配置镜像地址五、启动与关闭六、常用插件的安装 前言 虽然说网上有很多关于 Jenkins 安装的教程,但是大部分都不够详细,或者是需要搭配 docker 或者 k8s 等进行安装,对于新手小白而已&…...

【JAVA】JAVA方法的学习和创造
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| 💫个人格言:“没有罗马,那就自己创造罗马~” 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不…...

Rust写一个wasm入门并在rspack和vite项目中使用(一)
rust打包wasm文档 文档地址 安装cargo-generate cargo install cargo-generate 安装过程中有问题的话手动安装cargo-generate下载地址 根据自己的系统下载压缩包,然后解压到用户/.cargo/bind目录下,将解压后的文件放到该目录下即可。 创建wasm项目 …...
HTTP和HTTPS的区别,HTTPS加密原理是?
HTTP和HTTPS都是网络传输协议,主要用于浏览器和服务器之间的数据传输,但它们在数据传输的安全性、加密方式、端口等方面有所不同。 数据传输的安全性:HTTP是明文传输,数据不加密,容易被黑客窃听、篡改或者伪造&#x…...

基于Spring Boot+Vue的校园二手交易平台
目录 一、 绪论1.1 开发背景1.2 系统开发平台1.3 系统开发环境 二、需求分析2.1 问题分析2.2 系统可行性分析2.2.1 技术可行性2.2.2 操作可行性 2.3 系统需求分析2.3.1 学生功能需求2.3.2 管理员功能需求2.3.3游客功能需求 三、系统设计3.1 功能结构图3.2 E-R模型3.3 数据库设计…...
什么是软件开发?软件开发阶段划分是什么?并以LabVIEW为例进行说明
软件开发是一种创建、设计、编码、测试和维护应用程序、框架或其他软件组件的过程。它涉及从理解需求到设计、实现、测试、部署和最终维护的全过程。软件开发可以用来创建新的软件应用、系统软件、游戏、或开发网络应用等。 软件开发过程通常可以分为以下几个阶段:…...

PTAL1-006 连续因子
c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…...

【Java】容器|Set、List、Map及常用API
目录 一、概述 二、List 1、List的常用API 2、ArrayList 3、List遍历 三、Set 1、Set的常用方法: 2、HashSet 3、遍历集合: 四、Map 1、Map常用API 2、HashMap 3、遍历Map 五、迭代器 一、概述 在Java中所有的容器都属于Collection接口下的内容 1…...

Navicat 面试题及答案整理,最新面试题
Navicat 在数据库管理中的主要用途有哪些? Navicat 是一款数据库管理工具,其主要用途包括: 1、多数据库支持: Navicat 支持多种数据库连接,包括 MySQL、Oracle、PostgreSQL、SQLite、SQL Server 等,方便用…...

android studio 连接mumu模拟器调试
1、打开mumu模拟器 2、在Android Studio 中 控制台 cd 到 sdk 目录下 platform-tools 文件夹,有一个adb.exe 可运行程序 一般指令: adb connect 127.0.0.1:7555 但是这个执行在window环境下可能会报错 解决方法是在 adb 之前加 ".\", 问题…...

四连通与八连通的区别 -- 图例讲解
概念 四连通区域:指从某个点出发,只能通过上、下、左、右四个方向的运动到达区域内的其他点,且不能跨越区域的边界。 八连通区域:除了上、下、左、右四个方向,还可以沿对角线方向(左上、右上、左下、右下…...

关于分布式微服务数据源加密配置以及取巧方案(含自定义加密配置)
文章目录 前言Spring Cloud 第一代1、创建config server项目并加入加解密key2、启动项目,进行数据加密3、实际项目中的测试server Spring Cloud Alibaba低版本架构不支持,取巧实现无加密配置,联调环境问题加密数据源配置原理探究自定义加密解…...

快速了解JavaScript
1.1 javaScript 历史 创始人 布兰登 艾奇 生于1961年 在1995设计LiveScript后改名为JavaScript 1.2 javaScript 是什么类型的语言 JavaScript是一种在客户端运行的脚本语言(不需要编译,由js引擎逐行解释执行) 1.3 JavaScript可以做什么 …...

【安全类书籍-3】XSS跨站脚剖析与防御
目录 内容简介 作用 下载地址 内容简介 这本书涵盖以下几点: XSS攻击原理:解释XSS是如何利用Web应用未能有效过滤用户输入的缺陷,将恶意脚本注入到网页中,当其他用户访问时被执行,实现攻击者的目的,例如窃取用户会话凭证、实施钓鱼攻击等。 XSS分类:分为存储型XSS(…...
http postman
地址 : https://oaqas.lingyiitech.com:9800/auth-api/openapi/dingtalk-oa/topapi/message/corpconversation/asyncsend_v2?token40216bf0ceea8e56b778d537b20f5d23 https://oaqas.lingyiitech.com:9800/auth-api/openapi/dingtalk-oa/topapi/message/corpconve…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...