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

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...