一直在網上搜wxSqlite3的文檔,但是總找不到能真正解決問題的,就是一個簡單的編譯wxSqlite3自帶的示例也出了老多問題,后來卻發現,其實wxSqlite3的readme中已經有了詳細的方法,哦,就在眼皮子底下!為了避免再一次的遺忘,就在這里暫作一個記錄吧。
截至記錄時間,wxSqlite3的版本號為2.1.1,Sqlite3的版本為3.7.6.2,這兩個都可以直接在網上下載,
wxSqlite3的站點http://wxcode.sourceforge.net/components/wxsqlite3;
http://sourceforge.net/projects/wxcode/files/Components/wxSQLite3/
http://sourceforge.net/projects/wxsqlite/?source=directory
Sqlite3的站點http://www.sqlite.org/;
其中wxSqlite3自帶了已編譯的Sqlite3.7.6.1的DLL,當然,我的目的是自己編譯靜態的Lib,所以只能自己下來重新編譯了。當然,我要的Lib是要帶加密功能的,呵呵。
wxSQLite3 is a C++ wrapper around the public domain SQLite 3.x database and is specifically designed for use in programs based on the wxWidgets library.
wxSQLite3 does not try to hide the underlying database, in contrary almost all special features of the current SQLite version 3.7.10 are supported, like for example the creation of user defined scalar or aggregate functions. Since SQLite stores strings in UTF-8 encoding, the wxSQLite3 methods provide automatic conversion between wxStrings and UTF-8 strings. This works best for the Unicode builds of wxWidgets. In ANSI builds the current locale conversion object (wxConvCurrent) is used for conversion to/from UTF-8. Special care has to be taken if external administration tools are used to modify the database contents, since not all of these tools operate in Unicode resp. UTF-8 mode.
Since version 1.7.0 optional support for key based database encryption (128 bit AES) is also included. Starting with version 1.9.6 of wxSQLite3 the encryption extension is compatible with the SQLite amalgamation source and includes the extension functions module. Support for 256 bit AES encryption has been added in version 1.9.8.
從wxSqlite3 1.9.6開始,它的加密擴展就已經從C++轉為純C語言實現,因此現在可以直接編譯SQLite amalgamation source distribution實現了。只需要編譯文件sqlite3secure.c即可,其已經include了所有需要的源文件。當然C++版本的文件也在codec目錄(\sqlite3\secure\src\codec-c)中,但作者強烈的不推薦用它。
嘮了這么多,現在正式開始。
1、下載sqlite-amalgamation-XXXXXX.zip,它已經包含了所有的源文件,也不需要另外的輔助工具了,解壓到某一目錄,如Sqlite3。
2、如果你下的sqlite-amalgamation-XXXXXX.zip沒有makefile,那就自己做一個project吧,在VS2008里新建一個空工程,只加入sqlite3secure.c文件到工程即可,修改其中的#include "sqlite.c"的sqlite.c文件路徑為上一步解壓的文件的路徑。
3、在配置屬性中設置配置類型為靜態庫(.Lib),添加預處理 SQLITE_HAS_CODEC=1 CODEC_TYPE=CODEC_TYPE_AES128 SQLITE_CORE THREADSAFE SQLITE_SECURE_DELETE SQLITE_SOUNDEX SQLITE_ENABLE_COLUMN_METADATA
4、編譯生成Lib文件。 5、將生成的Lib文件取代wxsqlite3-2.1.1\sqlite3\lib中的sqlite3.lib文件,然后編譯wxSqlite3為靜態庫,別忘了設置USE_DYNAMIC_SQLITE3_LOAD=0。
》》》》》》》》》》》》》》》》》》》》
Delphi使用wxsqlite加密Sqlite數據庫
提起桌面數據庫,Sqlite誰都知道,但對於它的加密一直困擾着很多人,而delphi的加密使用范 例更少。在網上混了兩天,查找了一些Sqlite加密的相關資料,也知道了wxsqlite這個東西,它是一個sqlite3.dll的嵌入擴展,重要的 是里面加入了對Sqlite的AES 128bit-256bit加密擴展,而且用的是Sqlite預留的函數接口,這意味着什么呢?UniDAC從3.5.14版本以后加入了對 encrypted sqlite的支持,這功能支持 SEE/CEROD這樣使用預留接口開發的加密功能的第三方擴展,也就是說wxsqlite同樣能被UniDAC所支持,這意味着你就不用再去改 UniDAC的源代碼了,wxsqlite可以在我這下載http://download.csdn.net/source/3215472
下面說說具體的使用方法,下載后你可以在sqlite3/secure目錄下找到AES128和AES256兩個文件夾,分別包含兩種加密類型擴展的庫文件,找到sqlite3.dll,然后放到你要調用的路徑,然后下面是我隨便Copy修改后的delphi的源碼:
unit main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, DB, MemDS, DBAccess; type TSQLiteDB = Pointer; Tsqlite3=Pointer; TForm4 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; const {$IF Defined(MSWINDOWS)} SQLiteDLL = 'sqlite3.dll'; {$ELSEIF Defined(DARWIN)} SQLiteDLL = 'libsqlite3.dylib'; {$linklib libsqlite3} {$ELSEIF Defined(UNIX)} SQLiteDLL = 'sqlite3.so'; {$IFEND} var Form4: TForm4; db: TSQLiteDB; function SQLite3_Open(filename: PAnsiChar; var db: TSQLiteDB): integer; cdecl; external SQLiteDLL name 'sqlite3_open'; function sqlite3_key ( pDb: Tsqlite3; // Database handle pKey: PAnsiChar; // Database PassWord (UTF-8) nKey: Integer // Database sizeofpassword ): integer; cdecl; external SQLiteDLL name 'sqlite3_key'; function sqlite3_rekey ( pDb: Tsqlite3; // Database handle pKey: PAnsiChar; // Database PassWord (UTF-8) nKey: Integer // Database sizeofpassword ): integer; cdecl; external SQLiteDLL name 'sqlite3_rekey'; implementation {$R *.dfm} procedure TForm4.FormCreate(Sender: TObject); begin SQLite3_Open('ak.db',db); //打開數據庫 SQLite3_key(db,'cba',3); //設置密碼 SQLite3_rekey(db,'abc',3); //更改密碼 end; end.
不過我下載的最新版本的wxsqlite里已經編譯好的sqlite3.dll中,sqlite3_key函數好像是空的,不起作用,后來查了查,是自己 在使用UniDAC時直接鏈接了,所以我直接試着調用了sqlite3_rekey實現了對數據庫的加密,加密后的數據庫再用記事本打開時已經是亂碼了, 然后用數據庫工具查看時會提示“數據庫已經加密”。要更改密碼的話首先得把所有多余的鏈接斷掉,然后先Open數據庫,再用sqlite3_key設置用 來操作數據庫的原密碼,這樣獲得操作權之后就能用sqlite3_rekey設置新的密碼了。 接下來說說UniDAC里怎么鏈接加密后的數據庫。上面說了,UniDAC3.5.14以后的版本加入了Sqlite的encryption功能,所以在 添加鏈接的時候你在specificOption項里可以將option項中的encryptionkey參數設置為你的數據庫密碼,這樣鏈接數據庫后你 就可以隨意操作了。 有時間再把這些東西整整,做個直接加密的工具,以后就能非常方便的加密自己的數據庫了!
********************************************************************************************
SQLITE支持跨平台、跨語言,是做桌面產品比較合適的輕量級開源文件數據庫,最新版本是3.7.15,下載位置:http://www.sqlite.org/sqlite-amalgamation-3071500.zip,非商業版本不提供加密功能,但有相應的第三方開源類庫已經實現了加密功能。通常的方案是在C++下使用加密SQLITE庫,.NET語言使用時進行封裝,.NET下的SQLITE加密方式是不兼容的。 wxSQLite3除了封裝SQLITE以外,還實現了一個SQLITE加密版本,wxSQLite3的最新版本是3.0.1,支持SQLITE 3.7.14.1。
首先下載wxSQLite3:http://sourceforge.net/projects/wxcode/files/Components/wxSQLite3/wxsqlite3-3.0.1.zip/download
解壓后獲取wxsqlite3-3.0.1\sqlite3\secure\src下所有文件。
新建C++ SDK DLL工程SQLITE3,加入預處理: SQLITE_HAS_CODEC=1 CODEC_TYPE=CODEC_TYPE_AES128 SQLITE_CORE THREADSAFE SQLITE_SECURE_DELETE SQLITE_SOUNDEX SQLITE_ENABLE_COLUMN_METADATA 只把sqlite3secure.c包含在工程中,不使用預編譯頭。 在sqlite3.c及sqlite3secure.c文件頭部加入: #ifndef SQLITE_API #define SQLITE_API __declspec(dllexport) #endif #ifndef SQLITE_HAS_CODEC #define SQLITE_HAS_CODEC #endif 在sqlite3.h頭部加入(根據使用方法不同,此步驟並非必要): #ifndef SQLITE_API #define SQLITE_API __declspec(dllimport) #endif #ifndef SQLITE_HAS_CODEC #define SQLITE_HAS_CODEC #endif 使用方引用sqlite3.h及sqlite3.lib int result=0; sqlite3 *db=NULL; result=sqlite3_open("c:\test.db",&db); result=sqlite3_key(db,"abcd",3); //使用密碼,第一次為設置密碼 //result=sqlite3_rekey(db,NULL,0); //清空密碼 result=sqlite3_exec(db,"PRAGMA synchronous = OFF",0,0,0); //提高性能 result=sqlite3_exec(db,"PRAGMA cache_size = 8000",0,0,0); //加大緩存 result=sqlite3_exec(db,"PRAGMA count_changes = 1",0,0,0); //返回改變記錄數 result=sqlite3_exec(db,"PRAGMA case_sensitive_like = 1",0,0,0); //支持中文LIKE查詢 result=sqlite3_exec(db,"CREATE TABLE [MyTable] ([ID] INTEGER PRIMARY KEY NOT NULL,[MyText] TEXT NULL)",0,0,0);