wxsqlite3的加密模块单独编译

转自:http://www.javashuo.com/article/p-vzwmjcvk-bp.htmlhtml

wxSqlite3官网:http://wxcode.sourceforge.net/components/wxsqlite3 
github网址:https://github.com/utelle/wxsqlite3
git

 

 

其实就是个编译过程,so easy,只是网上的方法各类,并且不是最新的,因此本身琢磨了。github

一、从sqlite网站下载sqlite-amalgamation-xxx和sqlite-dll-win32-x86-xxxsql

二、从github下载wxsqlite3-xxx数据库

三、使用vs建立win32 dll空项目xcode

四、拷贝wxsqlite3-3.3.0\sqlite3\secure\src\下的全部h、c文件、def文件函数

五、添加sqlite3secure.c、sqlite3.h到工程网站

六、设置预处理定义: SQLITE_HAS_CODEC CODEC_TYPE=CODEC_TYPE_AES128 SQLITE_CORE SQLITE_SECURE_DELETE SQLITE_ENABLE_COLUMN_METADATA SQLITE_ENABLE_RTREE加密

编译静态库须要多添加:USE_DYNAMIC_SQLITE3_LOAD=0spa

七、编译动态库:在配置属性-->连接器-->输入-->模块定义文件 加入sqlite3.def

八、使用引入sqlite3.h和sqlite3userauth.h

若是须要使用最新的sqlite3,请用sqlite-amalgamation-xxx中的h和c文件替换工程对应的文件。

九、 使用注意:

首先打开数据库 sqlite3_open,而后在操做数据库以前执行 sqlite3_key 后就可进行数据库操做,不然会返回错误。
 sqlite3_key是输入密钥,若是数据库已加密必须先执行此函数并输入正确密钥才能进行操做,
 若是数据库没有加密,执行此函数后进行数据库操做反而会出现“此数据库已加密或不是一个数据库文件”的错误。
 sqlite3_rekey是变动密钥或给没有加密的数据库添加密钥或清空密钥,
 变动密钥或清空密钥前必须先正确执行 sqlite3_key。
 在正确执行 sqlite3_rekey 后在 sqlite3_close 关闭数据库以前可正常操做数据库,不须要再执行 sqlite3_key。

ps:sqlite3的新版可能存在不兼容wxsqlite3的状况,建议使用wxsqlite3自带版本,并且它的更新也很快的。

示例代码以下

1、对未加密的数据库加密:
#include "include\sqlite3.h"
#include "include\sqlite3userauth.h"

    sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
    sqlite3* db = nullptr;
    char *errorMsg;
    if(SQLITE_OK == sqlite3_open_v2("../test.db3", &db, SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_READWRITE, nullptr))
    {
        /* encrypt */
        if(SQLITE_OK != sqlite3_rekey(db, "qazwsx!123", 10))
        {
            std::string serr = "sqlite encrypt error:";
            serr += sqlite3_errmsg(db);
        }
    }
    else
    {
        std::string serr = "sqlite open error:";
        serr += sqlite3_errmsg(db);
    }
    sqlite3_close(db);
2、对加密后的数据库清除密码:
#include "include\sqlite3.h"
#include "include\sqlite3userauth.h"

    sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
    sqlite3* db = nullptr;
    char *errorMsg;
    if(SQLITE_OK == sqlite3_open_v2("../test.db3", &db, SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_READWRITE, nullptr))
    {    
        /* decrypt */
        sqlite3_key(db, "qazwsx!123", 10);
        
        /* clear password */
        sqlite3_rekey(db, nullptr, 0);
    }
    else
    {
        std::string serr = "sqlite open error:";
        serr += sqlite3_errmsg(db);
    }
    sqlite3_close(db);
相关文章
相关标签/搜索