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

​​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类(十)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;九&#xff09; 下一篇&#xff1a;​​SQLiteC/C接口详细介绍之sqlite3类&#xff08;十一&#xff09; 30.sqlite3_enable_load_extension&#x…...

Vue中nextTick一文详解

什么是 nextTick&#xff1f; 在 Vue 中&#xff0c;当我们修改数据时&#xff0c;Vue 会自动更新视图。但是&#xff0c;由于 JavaScript 的事件循环机制&#xff0c;我们无法立即得知视图更新完成的时机。这时候&#xff0c;我们就需要使用 nextTick 来获取视图更新完成后的…...

爱奇艺 CTR 场景下的 GPU 推理性能优化

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

详解MySql索引

目录 一 、概念 二、使用场景 三、索引使用 四、索引存在问题 五、命中索引问题 六、索引执行原理 一 、概念 索引是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。暂时可以理解成C语言的指针,文章后面详解 二、使用场景 数据量较大&#xff0c;且…...

struct 和 union 的区别?

struct和union的分对应点总结 存储方式&#xff1a; struct&#xff1a;struct中的每个成员都拥有独立的内存空间。一个struct变量的总长度是其所有成员的长度之和&#xff0c;且通常会根据编译器的内存对齐规则进行适当调整。union&#xff1a;union中的所有成员共享同一段内…...

Linux - 安装 Jenkins(详细教程)

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

【JAVA】JAVA方法的学习和创造

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

Rust写一个wasm入门并在rspack和vite项目中使用(一)

rust打包wasm文档 文档地址 安装cargo-generate cargo install cargo-generate 安装过程中有问题的话手动安装cargo-generate下载地址 根据自己的系统下载压缩包&#xff0c;然后解压到用户/.cargo/bind目录下&#xff0c;将解压后的文件放到该目录下即可。 创建wasm项目 …...

HTTP和HTTPS的区别,HTTPS加密原理是?

HTTP和HTTPS都是网络传输协议&#xff0c;主要用于浏览器和服务器之间的数据传输&#xff0c;但它们在数据传输的安全性、加密方式、端口等方面有所不同。 数据传输的安全性&#xff1a;HTTP是明文传输&#xff0c;数据不加密&#xff0c;容易被黑客窃听、篡改或者伪造&#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为例进行说明

软件开发是一种创建、设计、编码、测试和维护应用程序、框架或其他软件组件的过程。它涉及从理解需求到设计、实现、测试、部署和最终维护的全过程。软件开发可以用来创建新的软件应用、系统软件、游戏、或开发网络应用等。 软件开发过程通常可以分为以下几个阶段&#xff1a;…...

PTAL1-006 连续因子

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

【Java】容器|Set、List、Map及常用API

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

Navicat 面试题及答案整理,最新面试题

Navicat 在数据库管理中的主要用途有哪些&#xff1f; Navicat 是一款数据库管理工具&#xff0c;其主要用途包括&#xff1a; 1、多数据库支持&#xff1a; Navicat 支持多种数据库连接&#xff0c;包括 MySQL、Oracle、PostgreSQL、SQLite、SQL Server 等&#xff0c;方便用…...

android studio 连接mumu模拟器调试

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

四连通与八连通的区别 -- 图例讲解

概念 四连通区域&#xff1a;指从某个点出发&#xff0c;只能通过上、下、左、右四个方向的运动到达区域内的其他点&#xff0c;且不能跨越区域的边界。 八连通区域&#xff1a;除了上、下、左、右四个方向&#xff0c;还可以沿对角线方向&#xff08;左上、右上、左下、右下…...

关于分布式微服务数据源加密配置以及取巧方案(含自定义加密配置)

文章目录 前言Spring Cloud 第一代1、创建config server项目并加入加解密key2、启动项目&#xff0c;进行数据加密3、实际项目中的测试server Spring Cloud Alibaba低版本架构不支持&#xff0c;取巧实现无加密配置&#xff0c;联调环境问题加密数据源配置原理探究自定义加密解…...

快速了解JavaScript

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

【安全类书籍-3】XSS跨站脚剖析与防御

目录 内容简介 作用 下载地址 内容简介 这本书涵盖以下几点: XSS攻击原理:解释XSS是如何利用Web应用未能有效过滤用户输入的缺陷,将恶意脚本注入到网页中,当其他用户访问时被执行,实现攻击者的目的,例如窃取用户会话凭证、实施钓鱼攻击等。 XSS分类:分为存储型XSS(…...

http postman

地址 &#xff1a; 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远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; 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大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

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

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

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...