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

news2024/12/25 9:16:12

 返回目录:SQLite—免费开源数据库系列文章目录 

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

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

43.sqlite3_preupdate_hook

sqlite3_preupdate_hook函数用于注册一个回调函数,当执行UPDATE、INSERT、DELETE操作时,此回调函数会在每一行变更之前被调用。该函数的原型如下:

void sqlite3_preupdate_hook(
  sqlite3 *db,
  void *pArg,
  int iCmd,
  char const *zDb,
  char const *zName,
  sqlite3_int64 arg1,
  sqlite3_int64 arg2,
  int arg3
);

该函数的参数说明如下:

- db: 数据库连接句柄。
- pArg: 提供给回调函数使用的用户指针。
- iCmd: 修改命令类型,值为SQLITE_INSERT、SQLITE_UPDATE或SQLITE_DELETE。
- zDb和zName: 数据库名和表名。
- arg1、arg2和arg3: 提供详细信息的附加参数。

下面是一个示例,在执行UPDATE、INSERT、DELETE操作之前,输出被更改的列的值:

#include <sqlite3.h>
#include <stdio.h>
static void preupdate_callback(
    sqlite3 *db,  // 数据库连接句柄
    void *pArg,   // 用户指针
    int iCmd,     // 修改命令类型
    char const *zDb,  // 数据库名
    char const *zName, // 表名
    sqlite3_int64 arg1,  // 行ID
    sqlite3_int64 arg2,  // 新行ID
    int arg3             // 列ID
) {
    if (iCmd == SQLITE_UPDATE) {
        printf("UPDATE table %s.%s: (id=%lld) %d -> %d\n", zDb, zName, arg1,
            *((int*)arg2 + arg3), *((int*)arg1 + arg3));
    } else if (iCmd == SQLITE_INSERT) {
        printf("INSERT table %s.%s: (id=%lld)\n", zDb, zName, arg1);
    } else if (iCmd == SQLITE_DELETE) {
        printf("DELETE table %s.%s: (id=%lld)\n", zDb, zName, arg1);
    }
}
int main() {
    sqlite3 *db;
    sqlite3_open(":memory:", &db);
    sqlite3_exec(db, "CREATE TABLE test (id INTEGER PRIMARY KEY, value TEXT)", NULL, NULL, NULL);
    sqlite3_preupdate_hook(db, preupdate_callback, NULL);
    sqlite3_exec(db, "INSERT INTO test (id, value) VALUES (1, 'hello')", NULL, NULL, NULL);
    sqlite3_exec(db, "UPDATE test SET value = 'world' WHERE id = 1", NULL, NULL, NULL);
    sqlite3_exec(db, "DELETE FROM test WHERE id = 1", NULL, NULL, NULL);
    sqlite3_close(db);
    return 0;
}

输出结果为:

INSERT table main.test: (id=1)
UPDATE table main.test: (id=1) hello -> world
DELETE table main.test: (id=1)

44.sqlite3_preupdate_new

sqlite3_preupdate_new函数用于向UPDATE事件中添加一个新的行。通常情况下,UPDATE事件会更新一个已经存在的行,但有时候需要添加一行新的数据,并以此替换原来的行。例如,当更新一行数据时,如果该行数据不存在,有时需要新增一行数据。

该函数的原型如下:

int sqlite3_preupdate_new(
  sqlite3 *db,
  int op,
  const char *zDb,
  const char *zName,
  sqlite_int64 iKey
);

该函数的参数说明如下:

- db: 数据库连接句柄。
- op: 操作类型,取值为SQLITE_INSERT或SQLITE_UPDATE。
- zDb和zName: 数据库名和表名。
- iKey: 新行的主键值。

该函数必须在sqlite3_preupdate_hook回调函数中调用,并在调用sqlite3_preupdate_step()之前被调用。下面是一个示例,该示例在UPDATE事件中新增一个行数据:

#include <sqlite3.h>
#include <stdio.h>
static void preupdate_callback(
    sqlite3 *db,  // 数据库连接句柄
    void *pArg,   // 用户指针
    int iCmd,     // 修改命令类型
    char const *zDb,  // 数据库名
    char const *zName, // 表名
    sqlite3_int64 arg1,  // 行ID
    sqlite3_int64 arg2,  // 新行ID
    int arg3             // 列ID
) {
    if (iCmd == SQLITE_UPDATE) {
        const char *value = "new value";
        sqlite3_preupdate_new(db, SQLITE_INSERT, zDb, zName, arg2);
        sqlite3_preupdate_set(db, value);
        sqlite3_preupdate_column_name(db, "value");
    }
}
int main() {
    sqlite3 *db;
    sqlite3_open(":memory:", &db);
    sqlite3_exec(db, "CREATE TABLE test (id INTEGER PRIMARY KEY, value TEXT)", NULL, NULL, NULL);
    sqlite3_preupdate_hook(db, preupdate_callback, NULL);
    sqlite3_exec(db, "UPDATE test SET value = 'world' WHERE id = 1", NULL, NULL, NULL);
    sqlite3_close(db);
    return 0;
}

该示例实现了当UPDATE语句在表test中更新主键值为1的数据时,如果该行数据不存在,则新增一行数据,并将value列的值设置为"new value"。

注意:在调用sqlite3_preupdate_new()函数之后,必须通过sqlite3_preupdate_set()设置新插入行的数据,这样才能正常插入数据。

45.sqlite3_preupdate_old

sqlite3_preupdate_old函数用于获取UPDATE事件中的旧行数据。当执行UPDATE语句时,旧行数据需要在sqlite3_preupdate_hook回调函数中使用,例如用于记录更改日志或在更新前对比新旧数据等。

该函数的原型如下:

const void *sqlite3_preupdate_old(
  sqlite3 *db,
  int op,
  const char *zDb,
  const char *zName,
  sqlite_int64 iKey
);

该函数的参数说明如下:

- db: 数据库连接句柄。
- op: 操作类型,取值为SQLITE_INSERT或SQLITE_UPDATE。
- zDb和zName: 数据库名和表名。
- iKey: 主键值。

该函数必须在sqlite3_preupdate_hook回调函数中调用,并在调用sqlite3_preupdate_step()之前被调用。返回值是一个指向旧行数据的指针,如果该行不存在,则返回NULL。

下面是一个示例,该示例在UPDATE事件中获取旧行数据并输出:

#include <sqlite3.h>
#include <stdio.h>
static void preupdate_callback(
    sqlite3 *db,  // 数据库连接句柄
    void *pArg,   // 用户指针
    int iCmd,     // 修改命令类型
    char const *zDb,  // 数据库名
    char const *zName, // 表名
    sqlite3_int64 arg1,  // 行ID
    sqlite3_int64 arg2,  // 新行ID
    int arg3             // 列ID
) {
    if (iCmd == SQLITE_UPDATE) {
        const void *old_data = sqlite3_preupdate_old(db, SQLITE_UPDATE, zDb, zName, arg1);
        if (old_data) {
            printf("old data: id=%lld, value=%s\n", arg1, (const char*)sqlite3_value_text((sqlite3_value*)old_data + 1));
        } else {
            printf("old data not found: id=%lld\n", arg1);
        }
    }
}
int main() {
    sqlite3 *db;
    sqlite3_open(":memory:", &db);
    sqlite3_exec(db, "CREATE TABLE test (id INTEGER PRIMARY KEY, value TEXT)", NULL, NULL, NULL);
    sqlite3_preupdate_hook(db, preupdate_callback, NULL);
    sqlite3_exec(db, "INSERT INTO test (id, value) VALUES (1, 'hello')", NULL, NULL, NULL);
    sqlite3_exec(db, "UPDATE test SET value = 'world' WHERE id = 1", NULL, NULL, NULL);
    sqlite3_exec(db, "DELETE FROM test WHERE id = 1", NULL, NULL, NULL);
    sqlite3_close(db);
    return 0;
}

该示例在UPDATE事件中获取id为1的旧行数据,并输出id和value的值。如果旧行数据不存在,则输出"old data not found"。需要注意的是,在sqlite3_value_text()函数中传入的参数是一个指向sqlite3_value结构体的指针。

46.sqlite3_progress_handler 

sqlite3_progress_handler函数用于安装一个进度回调函数,用于检查长时间运行的语句的运行时间,并防止其耗费太多的CPU。如果在指定的运行时间内没有回调函数,则sqlite3_progress_handler将返回非零值,从而终止长时间运行的语句。

函数原型:
void sqlite3_progress_handler(sqlite3 *db, int iInterval, int(*xCallback)(void*), void *pArg);
函数参数说明:

- db:需要监听的数据库。
- iInterval:回调函数被调用的时间间隔,以毫秒为单位。如果iInterval为0,则将调用回调函数,在执行每个数据库操作之前检查是否需要中止操作。如果iInterval不为0,则在执行每个数据库操作之前等待iInterval毫秒,并且在时间到期时调用回调函数以检查操作是否应继续。
- xCallback:回调函数指针,指向一个返回整数的函数。如果回调函数返回非零值,则长时间运行的语句将被终止。如果回调函数返回零值,则长时间运行的语句将继续运行。
- pArg:传递给回调函数的用户指针。

下面是一个简单的示例:

#include <sqlite3.h>
#include <stdio.h>
#include <unistd.h>

static int progress_callback(void *pArg) {
    printf("progress_callback\n");
    return 0;
}

int main() {
    sqlite3 *db;
    sqlite3_open(":memory:", &db);
    sqlite3_progress_handler(db, 1000, progress_callback, NULL);
    sqlite3_exec(db, "CREATE TABLE test (id INTEGER PRIMARY KEY, value TEXT)", NULL, NULL, NULL);
    sqlite3_exec(db, "INSERT INTO test VALUES (1, 'hello')", NULL, NULL, NULL);
    sleep(2);
    sqlite3_finalize(db);
    return 0;
}
该示例在打开数据库连接后安装了一个回调函数,在操作一个语句时,程序会暂停2秒。在这个暂停的过程中,回调函数每隔1秒钟被调用一次,当到达1秒和2秒时,由于回调函数返回0,长时间运行的操作仍会继续运行。在操作完成之后,关闭数据库连接。

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

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

相关文章

【工具】一键生成动态歌词字幕

那眼神如此熟悉 让人着迷无力抗拒 一次又一次相遇 在眼前却遥不可及 命运总爱淘气 将一切都藏匿 曾有你的回忆 无痕迹 若不是心心相吸 又怎么会一步一步靠近 &#x1f3b5; 董真《思如雪》 下载LRC歌词 https://www.musicenc.com/article/50287.htmlhttp…

Android 系统的启动过程

Android 系统的启动流程&#xff1a; RomBoot&#xff08;只读存储器引导程序&#xff09;&#xff1a;这是设备上电时运行的初始软件。RomBoot执行基本的硬件初始化&#xff0c;确保硬件处于可以运行后续启动阶段的状态。这一阶段非常重要&#xff0c;因为它为整个启动过程奠定…

VMwareWorkstation16与Ubuntu 22.04.6 LTS下载与安装

一、准备工作 VMware Workstation Pro 16官网下载&#xff1a; https://customerconnect.vmware.com/cn/downloads/info/slug/desktop_end_user_computing/vmware_workstation_pro/16_0。下载需要账号登录。 二、安装 双击exe文件稍等一会会弹出安装程序&#xff0c;如图 这…

【Miniconda】基于conda避免运行多个PyTorch项目时发生版本冲突

【Miniconda】基于conda避免运行多个PyTorch项目时发生版本冲突 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到…

高效备考2025年AMC8竞赛:吃透2000-2024年600道真题(免费送题)

我们继续来随机看五道AMC8的真题和解析&#xff0c;根据实践经验&#xff0c;对于想了解或者加AMC8美国数学竞赛的考生来说&#xff0c;吃透AMC8历年真题是备考更加科学、有效的方法之一。 即使不参加AMC8竞赛&#xff0c;吃透了历年真题600道和背后的知识体系&#xff0c;那么…

爬虫学习 Scrapy中间件代理UA随机selenium使用

目录 中间件UA、代理处理---process_requestUA随机 代理处理seleniumscrapy 中间件 控制台操作 (百度只起个名 scrapy startproject mid scrapy genspider baidu baidu.com setting.py内 ROBOTSTXT_OBEY FalseLOG_LEVEL "WARNING"运行 scrapy crawl baidu middle…

数据可视化-ECharts Html项目实战(1)

在之前的文章中&#xff0c;我们学习了如何安装Visual Studio Code并下载插件&#xff0c;想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 安装 Visual Studio…

【IC设计】Verilog线性序列机点灯案例(三)(小梅哥课程)

声明&#xff1a;案例和代码来自小梅哥课程&#xff0c;本人仅对知识点做做笔记&#xff0c;如有学习需要请支持官方正版。 文章目录 该系列目录设计目标设计思路RTL及Testbench代码RTL代码Testbench代码 仿真结果上板视频 该系列目录 Verilog线性序列机点灯案例(一)&#xff…

LangChain: 调研报告

概述 LangChain是一个用于开发由语言模型驱动的应用程序的框架。它允许创建能够连接到上下文源&#xff08;如提示指令、少量示例、内容基础等&#xff09;的应用程序&#xff0c;并且能够进行推理&#xff08;基于提供的上下文如何回答问题、采取何种行动等&#xff09;。提供…

Ps:历史记录画笔工具

历史记录画笔工具 History Brush Tool可通过选择历史记录面板中的一个特定状态作为绘画源&#xff0c;然后使用画笔在图像的特定区域绘制&#xff0c;将这些区域恢复到选定的历史状态。 快捷键&#xff1a;Y 如果对图像进行了广泛的编辑&#xff0c;但希望将图像的一小部分恢复…

Explain 关键字

优质博文&#xff1a;IT-BLOG-CN explain关键字可以模拟优化器执行 SQL 查询语句&#xff0c;从而知道 MySQL 是如何处理 SQL 语句的。分析查询语句或表结构的性能瓶颈。执行语句&#xff1a;explain SQL语句。表头信息如下&#xff1a; 一、ID 参数 select 查询的序列号&…

算法---滑动窗口练习-8(最小覆盖子串)

最小覆盖子串 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;最小覆盖子串 2. 讲解算法原理 滑动窗口哈希表 算法的主要思想是使用滑动窗口的方法。它使用两个哈希表 hash1 和 hash2 来记录字符串 s 和 t 中各个字符的出现次数。其中 hash2 用于记…

MongoDB的安装方法图文详细

官网&#xff1a;www.mongodb.com 选择 Products > Community Edition 就能进入社区版 在这里下载 windows 版对应的安装包 注意&#xff1a;6.0.1 版本的 MongoDB 配置环境变量有问题&#xff0c;并且我不知道怎么解决&#xff0c;如果想要避免出问题&#xff0c;建议使…

武汉灰京文化:直播游戏新时代的游戏宣传方式

随着互联网和科技的迅速发展&#xff0c;游戏产业也日益繁荣。传统的游戏宣传方式逐渐显现出一些不足&#xff0c;传统的广告渠道和媒体报道在一定程度上已经不能满足游戏行业的需求。然而&#xff0c;随着直播平台的兴起&#xff0c;直播游戏成为了一种新的游戏宣传方式&#…

JVM学习-垃圾回收专题

目录 1.如何判断对象可以回收 1.1引用计数法 1.2可达性分析算法 1.3五种引用 1.4拓展&#xff1a;直接内存 2.垃圾回收算法 2.1标记清除算法 2.2标记整理算法 2.3复制 3.分代垃圾回收 3.垃圾回收器 3.1串行垃圾回收器 3.2吞吐量优先垃圾回收器 3.3响应时间优先垃圾回收器…

前端跨平台开发框架:简化多端开发的利器

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

数据可视化-ECharts Html项目实战(2)

在之前的文章中&#xff0c;我们学习了如何创建简单的折线图&#xff0c;条形图&#xff0c;柱形图并实现动态触发&#xff0c;最大最小平均值。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下…

【Hadoop大数据技术】——MapReduce分布式计算框架(学习笔记)

&#x1f4d6; 前言&#xff1a;MapReduce是Hadoop系统核心组件之一&#xff0c;它是一种可用于大数据并行处理的计算模型、框架和平台&#xff0c;主要解决海量数据的计算问题&#xff0c;是目前分布式计算模型中应用较为广泛的一种。 目录 &#x1f552; 1. MapReduce概述&am…

Qt教程 — 3.4 深入了解Qt 控件:Input Widgets部件(3)

目录 1 Input Widgets简介 2 如何使用Input Widgets部件 2.1 Dial 组件-模拟车速表 2.2 QScrollBar组件-创建水平和垂直滚动条 2.3 QSlider组件-创建水平和垂直滑动条 2.4 QKeySequenceEdit组件-捕获键盘快捷键 Input Widgets部件部件较多&#xff0c;将分为三篇文章介绍…

第二十四天-数据可视化Matplotlib

目录 1.介绍 2.使用 1. 安装&#xff1a; 2.创建简单图表 3.图表类型 1.一共分为7类 2.变化 1.折线图 3.分布 ​编辑 1.直方图 2.箱型图 4.关联 1. 散点图&#xff1a; 2.热力图&#xff1a; 5.组成 1.饼图 2.条形图 6.分组 1.簇型散点图 2.分组条形图 3.分…