sqlite3的backup和restore函数的使用

参考代码

  • 第一段
  • 这个亲测可以使用
#include <sqlite3.h>
#include <iostream>
/*
** Perform an online backup of database pDb to the database file named
** by zFilename. This function copies 5 database pages from pDb to
** zFilename, then unlocks pDb and sleeps for 250 ms, then repeats the
** process until the entire database is backed up.
**
** The third argument passed to this function must be a pointer to a progress
** function. After each set of 5 pages is backed up, the progress function
** is invoked with two integer parameters: the number of pages left to
** copy, and the total number of pages in the source file. This information
** may be used, for example, to update a GUI progress bar.
**
** While this function is running, another thread may use the database pDb, or
** another process may access the underlying database file via a separate
** connection.
**
** If the backup process is successfully completed, SQLITE_OK is returned.
** Otherwise, if an error occurs, an SQLite error code is returned.
** 官网地址:https://sqlite.org/backup.html
*/int backupDb(sqlite3 *pDb,               /* Database to back up */const char *zFilename      /* Name of file to back up to */
//    void(*xProgress)(int, int)  /* Progress function to invoke */
){int rc;                     /* Function return code */sqlite3 *pFile;             /* Database connection opened on zFilename */sqlite3_backup *pBackup;    /* Backup handle used to copy data *//* Open the database file identified by zFilename. */rc = sqlite3_open(zFilename, &pFile);if( rc==SQLITE_OK ){/* Open the sqlite3_backup object used to accomplish the transfer */pBackup = sqlite3_backup_init(pFile, "main", pDb, "main");if( pBackup ){/* Each iteration of this loop copies 5 database pages from database** pDb to the backup database. If the return value of backup_step()** indicates that there are still further pages to copy, sleep for** 250 ms before repeating. */do {rc = sqlite3_backup_step(pBackup, 5);
//        xProgress(sqlite3_backup_remaining(pBackup);sqlite3_backup_pagecount(pBackup);
//        );if( rc==SQLITE_OK || rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){sqlite3_sleep(250);}} while( rc==SQLITE_OK || rc==SQLITE_BUSY || rc==SQLITE_LOCKED );/* Release resources allocated by backup_init(). */(void)sqlite3_backup_finish(pBackup);}rc = sqlite3_errcode(pFile);}/* Close the database connection opened on database file zFilename** and return the result of this function. */(void)sqlite3_close(pFile);return rc;
}
  • 第二段
  • 这个使用不顺利,不知道是不是打开的方式不对
#pragma once#include <sqlite3.h>
namespace hsm {
namespace common {/*** @brief 备份和恢复数据库数据* @param pInMemory 指向内存数据库的指针* @param zFilename 指向文件数据库目录的字符串指针* @param isSave 0:从文件数据库恢复到内存数据库*               1:从内存数据库备份到文件数据库* @return 状态码*/
int backup_or_restore(sqlite3 *pInMemory,const char* zFilename,int isSave){int rc;sqlite3 *pFile;sqlite3_backup *pBackup;sqlite3 *pTo;sqlite3 *pFrom;rc = sqlite3_open(zFilename,&pFile);if (rc == SQLITE_OK){pFrom = (isSave?pInMemory:pFile);pTo = (isSave?pFile:pInMemory);pBackup = sqlite3_backup_init(pTo,"main",pFrom,"main");if (pBackup){(void)sqlite3_backup_step(pBackup,-1);(void)sqlite3_backup_finish(pBackup);}rc = sqlite3_close(pFile);}return rc;
}
} // namespace common
} // namespace hsm

对于backup函数的调用例子

void KeyStorage::backup(const std::string &filename) {sqlite3 *pDB;int rc = sqlite3_open(MGMT_KEY_STORAGE_FILE, &pDB);if( rc==SQLITE_OK ){printf("open test.db OK!\n");rc = backupDb(pDB, MGMT_KEY_STORAGE_FILE);if( rc==SQLITE_OK ){printf("backupDb new.db OK!\n");} else {printf("backupDb new.db error!\n");}} else {printf("open test.db error!\n");}
}

参考链接

  • https://sqlite.org/backup.html

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

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

相关文章

Java提高篇 —— Java三大特性之继承

一、前言 在《Think in java》中有这样一句话&#xff1a;复用代码是Java众多引人注目的功能之一。但要想成为极具革命性的语言&#xff0c;仅仅能够复制代码并对加以改变是不够的&#xff0c;它还必须能够做更多的事情。在这句话中最引人注目的是“复用代码”,尽可能的复用代码…

Java提高篇 —— Java三大特性之多态

一、前言 面向对象编程有三大特性&#xff1a;封装、继承、多态。 封装&#xff1a;隐藏了类的内部实现机制&#xff0c;可以在不影响使用的情况下改变类的内部结构&#xff0c;同时也保护了数据。对外界而已它的内部细节是隐藏的&#xff0c;暴露给外界的只是它的访问方法。 继…

光盘刻录制作Ubuntu等操作系统的启动盘

前提条件 软媒刻录 空白光盘&#xff08;至少4.7G&#xff09;电脑&#xff08;最好使用外置的光驱&#xff09;系统镜像&#xff08;ISO格式&#xff09; 具体操作 打开软媒魔方选择光盘刻录按照标红的进行选择选择镜像->选择或者拖拽都可以选择刻录机->如果使用外部刻…

Java提高篇 —— 抽象类与接口

一、前言 接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。 抽象类与接口是java语言中对抽象概念进行定义的两种机制&#xff0c;正是由于他们的存在才赋予java强大的面向对象的能力。他们两者之间对抽象概念的支持有很大的相似&#xff0c;甚至可以互换&…

C++ const相关内容学习

const 作用 修饰变量&#xff0c;说明变量不可以被修改修饰指针&#xff0c;分为指向常量的指针&#xff08;pointer to const&#xff09;和自身是常量的指针&#xff08;常量指针&#xff0c;const pointer&#xff09;修饰引用&#xff0c;指向常量的引用&#xff08;refe…

Java提高篇 —— Java浅拷贝和深拷贝

一、前言 我们知道在Java中存在这个接口Cloneable&#xff0c;实现该接口的类都会具备被拷贝的能力&#xff0c;同时拷贝是在内存中进行&#xff0c;在性能方面比我们直接通过new生成对象来的快&#xff0c;特别是在大对象的生成上&#xff0c;使得性能的提升非常明显。然而我们…

openssl里面AES算法主要函数的参数的介绍

注意事项 使用API的时候&#xff0c;需要特别小心数据长度&#xff0c;一般没有指定长度的参数&#xff0c;默认都是16&#xff08;AES_BLOCK_SIZE&#xff09;个字节。输出数据的长度一般都是16字节的倍数&#xff0c;否则会出现数组越界访问。以下API中&#xff0c;encrypt表…

Java提高篇 —— Java内部类详解

一、简介 内部类是一个非常有用的特性但又比较难理解使用的特性。 内部类我们从外面看是非常容易理解的&#xff0c;无非就是在一个类的内部在定义一个类。 public class OuterClass {private String name ;private int age;public String getName() {return name;}public voi…

Ubuntu修改界面的大小

命令 xrandr 就会显示ubuntu支持的屏幕比例使用命令 xrandr --size 1680x1050 切换屏幕大小

Java提高篇 —— String缓冲池

一、String缓冲池 首先我们要明确&#xff0c;String并不是基本数据类型&#xff0c;而是一个对象&#xff0c;并且是不可变的对象。查看源码就会发现String类为final型的&#xff08;当然也不可被继承&#xff09;&#xff0c;而且通过查看JDK文档会发现几乎每一个修改String对…

C++最新使用开源openssl实现输入是文件,输出是文件的AES加解密的代码

AES.h头文件 #include <cstring> #include <fstream> #include <iostream> #include <openssl/aes.h>//AES文件加密函数 int aes_encrypt_file(const std::string &original_backup_file_path,const std::string &encrypted_file_path,const …

Java基础 —— JVM内存模型与垃圾回收

目录一、概述二、运行时数据区方法区运行时常量池堆栈本地方法栈程序计数器三、对象访问四、垃圾回收如何定义垃圾1、引用计数法2、可达性分析垃圾回收方法1、Mark-Sweep标记-清除算法2、Copying复制算法3、Mark-Compact标记-整理算法4、Generational Collection 分代收集垃圾收…

Report Design

ERP_ENT_STD-CSDN博客

规范化流程化提交自己代码到远程gitlab服务器

流程 进入到build目录使用make命令进行编译 make -j 6&#xff0c;前提是cmake命令已经执行../format.py rungit add .. 添加文件git checkout -b xxx 创建xxx分支&#xff0c;其中xxx是分支名字git branch 查看分支git commit -m "[chy/backup] modify parameters for…

Java提高篇 ——Java注解

目录一、注解注解的定义注解的应用元注解RetentionDocumentedTargetInheritedRepeatable注解的属性Java 预置的注解DeprecatedOverrideSuppressWarningsSafeVarargsFunctionalInterface二、注解的提取三、注解与反射四、注解的使用场景五、亲手自定义注解完成某个目的六、注解应…

linux使用openssl查看文件的md5数值

代码 #include <stdio.h> #include <openssl/md5.h>std::string get_file_md5(const char *path){unsigned char digest [MD5_DIGEST_LENGTH];std::ifstream file(path, std::ios::in | std::ios::binary); //打开文件MD5_CTX md5_ctx;MD5_Init(&md5_ctx);cha…

Android 性能优化四个方面总结

目录一、四个方面二、卡顿优化1、Android系统显示原理2、卡顿根本原因3、性能分析工具&#xff08;1&#xff09;Profile GPU Rendering&#xff08;2&#xff09;TraceView&#xff08;3&#xff09;Systrace UI 性能分析4、优化建议&#xff08;1&#xff09;布局优化&#x…

pycharm/clion/idea等产品多含代码左移右移操作

左移 选中多行代码后&#xff0c;按下Tab键&#xff0c;一次缩进四个字符 右移 鼠标选中多行代码后&#xff0c;同时按住shiftTab键&#xff0c;一次左移四个字符

Android 开源框架选择

目录一、前言二、APP的整体架构三、技术选型的考量点四、日志记录能力五、JSON解析能力1、gson2、jackson3、Fastjson4、LoganSquare六、数据库操作能力1、ActiveAndroid2、ormlite3、greenDAO4、Realm七、网络通信能力1、android-async-http2、OkHttp3、Volley4、Retrofit八、…

使用opensll的md5对于string进行加密

代码 #include <openssl/md5.h>#include <sstream> #include <iomanip> #include <iostream>void get_string_md5(const std::string& await_md5_string) {unsigned char md5[MD5_DIGEST_LENGTH];MD5(reinterpret_cast<unsigned const char*&g…