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…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
