wxsqlite3 的使用, sqlite3 加密库 编译和测试

发布时间 2023-04-09 10:18:20作者: XGZ21

 

编译库文件:
1. 用VS2010 建立一个控制台工程sqlite3,选项为静态库,不包含预编译头。
2. 把 wxsqlite3-4.5.1.zip\wxsqlite3-4.5.1\sqlite3secure\src 下所有的文件复制到工程的工作目录
3. 把sqlite3.h和sqlite3secure.c加入工程
4. 工程配置属性 AllConfigurations,C/C++, 预处理, 预处理定义, 中加入
SQLITE_ENABLE_RTREE
SQLITE_ENABLE_COLUMN_METADATA
SQLITE_HAS_CODEC=1
SQLITE3ENCRYPT_EXPORTS
SQLITE_ENABLE_FTS3
SQLITE_ENABLE_FTS3_PARENTHESIS
SQLITE_SECURE_DELETE
SQLITE_SOUNDEX
CODEC_TYPE=CODEC_TYPE_AES256
5. BatchBuild 编译出2个版本的静态库,奇怪release版本居然比debug大一些
6. 把sqlite3.h和sqlite3.lib 复制出来备用。

测试程序:
1. 用VS2010 建立一个控制台工程sqlite3test,选项全为默认。
2. 把sqlite3.h和sqlite3.lib 复制复制到工程的工作目录
3. 把sqlite3.h和sqlite3.lib加入工程
4. 工程配置属性 AllConfigurations,C/C++, 预处理, 预处理定义, 中加入上面库编译时用的一堆开关
5. 修改sqlite3test.cpp ,加入头文件,在网上抄一段测试程序

// sqlite3test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include "sqlite3.h"

static int callback(void *NotUsed, int argc, char **argv, char **azColName){
    int i;
    for(i=0; i<argc; i++){
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}

static int callback2(void *data, int argc, char **argv, char **azColName){
    int i;
    fprintf(stderr, "%s: ", (const char*)data);
    for(i=0; i<argc; i++){
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    printf("\n Test begion:\n");

    sqlite3 *db = NULL;
    char *zErrMsg = 0;
    int  rc = 0;
    char *sql = NULL;
    const char* data = "Callback function called";
    
    rc = sqlite3_open("test.db",&db);  //打开数据库,没有则创建  
    printf("\n rc = %d", rc); 

//就是这里加解要调用函数,其他和SQLite3一样操作,先试试操作 rc
= sqlite3_key(db,"password",8); //使用密码,第一次为设置密码,以后为解密,最后是密码长度 printf("\n rc = %d", rc); //rc = sqlite3_rekey(db,NULL,0); //清空密码 //rc = sqlite3_rekey(db,"password2",9); //修改密码 //创建一张表 sql = "CREATE TABLE COMPANY(" \ "ID INT PRIMARY KEY NOT NULL," \ "NAME TEXT NOT NULL," \ "AGE INT NOT NULL," \ "ADDRESS CHAR(50)," \ "SALARY REAL );"; rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); //插入一些记录 sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \ "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " \ "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); " \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \ "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" \ "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" \ "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );"; rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); //查询记录,并在回调函数中打印记录 sql = "SELECT * from COMPANY"; rc = sqlite3_exec(db, sql, callback2, (void*)data, &zErrMsg); if( rc != SQLITE_OK ) { printf("SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { printf("Operation done successfully\n"); } //关闭数据库 sqlite3_close(db); system("pause"); return 0; }

 

测试结果: