返回> 网站首页 

sqlcipher编译

yoours2026-05-25 19:47:17 阅读 30

简介一边听听音乐,一边写写文章。

一、Perl

    https://strawberryperl.com/releases.html


二、openssl

perl Configure VC-WIN32 --prefix=“你的安装位置” // 编译32位

perl Configure VC-WIN64A --prefix=“你的安装位置” // 编译64位

nmake

nmake install


三、sqlcipher

    1. 生成sqlite3.c

nmake /f Makefile.msc sqlite3.c

    2. 动态库

cl -I"F:\\compile\\install\\include" sqlite3.c -DSQLITE_API=__declspec(dllexport) -DSQLCIPHER_CRYPTO_OPENSSL -DSQLITE_TEMP_STORE=2 -DSQLITE_THREADSAFE=1 -DSQLITE_HAS_CODEC -DSQLITE_EXTRA_INIT=sqlcipher_extra_init -DSQLITE_EXTRA_SHUTDOWN=sqlcipher_extra_shutdown -DHAVE_STDINT_H /MT -link -dll -out:sqlcipher.dll -LIBPATH:"F:\compile\install\lib" libcrypto.lib

    3. 静态库

(1)cl -I"E:\\openssl\\include" sqlite3.c -DSQLCIPHER_CRYPTO_OPENSSL -DSQLITE_TEMP_STORE=2 -DSQLITE_THREADSAFE=1 -DSQLITE_HAS_CODEC -DSQLITE_EXTRA_INIT=sqlcipher_extra_init -DSQLITE_EXTRA_SHUTDOWN=sqlcipher_extra_shutdown -DHAVE_STDINT_H /MT

(2)lib /out:libsqlcipher.lib sqlite3.obj

四、示例

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include "sqlite3.h" // SQLCipher扩展的头文件


#define DATABASE_NAME "encrypted.db"

#define DATABASE_KEY "your_secret_key"


// 数据库操作错误处理宏

#define CHECK_SQLITE(rc, db, msg) \

    if (rc != SQLITE_OK) { \

        fprintf(stderr, "[ERROR] %s: %s\n", msg, sqlite3_errmsg(db)); \

        sqlite3_close(db); \

        exit(1); \

    }


int callback_select(void* data, int argc, char** argv, char** col_name) {

    // 处理SELECT查询结果...

    return 0;

}


int main()

{

    sqlite3* db = NULL;

    char* errMsg = NULL;


    // 1. 打开数据库(若文件不存在则创建)

    int rc = sqlite3_open(DATABASE_NAME, &db);

    CHECK_SQLITE(rc, db, "Can't open database");


    // 2. 对数据库进行加密[reference:9]

    rc = sqlite3_key(db, DATABASE_KEY, strlen(DATABASE_KEY));

    CHECK_SQLITE(rc, db, "Can't set encryption key");


    // 3. 执行SQL操作(建表、插入、查询)

    const char* sqlCreate = "CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);";

    rc = sqlite3_exec(db, sqlCreate, 0, 0, &errMsg);

    CHECK_SQLITE(rc, db, "Can't create table");


    const char* sqlInsert = "INSERT INTO users (name, age) VALUES ('张三', 28);";

    rc = sqlite3_exec(db, sqlInsert, 0, 0, &errMsg);

    CHECK_SQLITE(rc, db, "Can't insert data");


    const char* sqlSelect = "SELECT * FROM users;";

    rc = sqlite3_exec(db, sqlSelect, callback_select, NULL, &errMsg);

    CHECK_SQLITE(rc, db, "Can't select data");


    // 4. 修改数据库密码(必须先提供旧密码)[reference:10]

    rc = sqlite3_rekey(db, "new_secret_key", strlen("new_secret_key"));

    CHECK_SQLITE(rc, db, "Can't rekey database");


    // 5. 关闭数据库连接

    sqlite3_close(db);

    return 0;

}


微信小程序扫码登陆

文章评论

30人参与,0条评论