整合sqlite代碼
- 開源的sqlite中沒有實現加密的功能,所以如果需要加密功能,需要自己實現 sqlite3_keysqlite3_rekey 等相關函數
- 不過開源的 wxsqlite3中已經實現了加密,所以只要將這里的代碼整合到qt 中就行,主要是將其實現的 sqlite3_key sqlite3_rekey 等函數添加到 qt 的 sqlite3.c 中
- 這里有一份已經整合好的代碼qt_sqlite_driver.zip
- 直接解壓到 qtbase\src\3rdparty 下就行
- 整合主要的修改如下:
- 修改了 sqlite.pri 編譯配置文件
- 修改了 sqlite\sqlite3.c 文件
- 增加了 sqlite\codec.c(.h) sqlite\rijndael.c(.h) sqlite\sha2.c(.h)
修改qt源碼
-
打開 qtbase\src\sql\kernel\qsqldriver.h,聲明兩個新的接口
1
2
3
4
5
6
7
8
9
10
11/**
* @brief 設置數據庫密碼
* @param key - 密碼
*/
virtual bool setKey(const QString& key);
/**
* @brief 重置數據庫密碼
* @param key - 密碼
*/
virtual bool resetKey(const QString& key); -
打開 qtbase\src\sql\kernel\qsqldriver.cpp,給新增的兩個接口增加一個默認實現
1
2
3
4
5
6
7
8
9bool QSqlDriver::setKey(const QString&)
{
return false;
}
bool QSqlDriver::resetKey(const QString&)
{
return false;
} -
打開 qtbase\src\sql\drivers\sqlite\qsql_sqlite_p.h,繼承那兩個新的接口
1
2
3
4
5
6
7
8
9
10
11/**
* @brief 設置數據庫密碼
* @param key - 密碼
*/
bool setKey(const QString& key);
/**
* @brief 重置數據庫密碼
* @param key - 密碼
*/
bool resetKey(const QString& key); -
打開 qtbase\src\sql\drivers\sqlite\qsql_sqlite_p.cpp,繼承那兩個新的接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21bool QSQLiteDriver::setKey(const QString& key)
{
Q_D(QSQLiteDriver);
if (d->access)
{
return (SQLITE_OK == sqlite3_key(d->access, key.toStdString().c_str(), key.toStdString().size()));
}
return false;
}
bool QSQLiteDriver::resetKey(const QString& key)
{
Q_D(QSQLiteDriver);
if (d->access)
{
return (SQLITE_OK == sqlite3_rekey(d->access, key.toStdString().c_str(), key.toStdString().size()));
}
return false;
}
編譯qt
http://wangjie.rocks/2016/05/10/qt-sqlite-cipher/