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.pswp.cn/news/446958.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446958.shtml
英文地址,請注明出處:http://en.pswp.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…