Fix sqlcipher_export & cipher_migrate when tracing API used

This commit is contained in:
Nick Parker 2017-05-25 13:42:17 -05:00
parent 8f52dde735
commit 8a43a6273a
3 changed files with 37 additions and 0 deletions

View File

@ -610,6 +610,7 @@ void sqlcipher_exportFunc(sqlite3_context *context, int argc, sqlite3_value **ar
int saved_flags; /* Saved value of the db->flags */
int saved_nChange; /* Saved value of db->nChange */
int saved_nTotalChange; /* Saved value of db->nTotalChange */
u8 saved_mTrace; /* Saved value of db->mTrace */
int (*saved_xTrace)(u32,void*,void*,void*); /* Saved db->xTrace */
int rc = SQLITE_OK; /* Return code from service routines */
char *zSql = NULL; /* SQL statements */
@ -619,9 +620,11 @@ void sqlcipher_exportFunc(sqlite3_context *context, int argc, sqlite3_value **ar
saved_nChange = db->nChange;
saved_nTotalChange = db->nTotalChange;
saved_xTrace = db->xTrace;
saved_mTrace = db->mTrace;
db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks | SQLITE_PreferBuiltin;
db->flags &= ~(SQLITE_ForeignKeys | SQLITE_ReverseOrder);
db->xTrace = 0;
db->mTrace = 0;
/* Query the schema of the main database. Create a mirror schema
** in the temporary database.
@ -707,6 +710,7 @@ end_of_export:
db->nChange = saved_nChange;
db->nTotalChange = saved_nTotalChange;
db->xTrace = saved_xTrace;
db->mTrace = saved_mTrace;
sqlite3_free(zSql);

View File

@ -1026,6 +1026,7 @@ int sqlcipher_codec_ctx_migrate(codec_ctx *ctx) {
int saved_flags;
int saved_nChange;
int saved_nTotalChange;
u8 saved_mTrace;
int (*saved_xTrace)(u32,void*,void*,void*); /* Saved db->xTrace */
Db *pDb = 0;
sqlite3 *db = ctx->pBt->db;
@ -1130,9 +1131,11 @@ int sqlcipher_codec_ctx_migrate(codec_ctx *ctx) {
saved_nChange = db->nChange;
saved_nTotalChange = db->nTotalChange;
saved_xTrace = db->xTrace;
saved_mTrace = db->mTrace;
db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks | SQLITE_PreferBuiltin;
db->flags &= ~(SQLITE_ForeignKeys | SQLITE_ReverseOrder);
db->xTrace = 0;
db->mTrace = 0;
pDest = db->aDb[0].pBt;
pDb = &(db->aDb[db->nDb-1]);
@ -1164,6 +1167,7 @@ int sqlcipher_codec_ctx_migrate(codec_ctx *ctx) {
db->nChange = saved_nChange;
db->nTotalChange = saved_nTotalChange;
db->xTrace = saved_xTrace;
db->mTrace = saved_mTrace;
db->autoCommit = 1;
sqlite3BtreeClose(pDb->pBt);
pDb->pBt = 0;

View File

@ -103,6 +103,11 @@ proc cmpFilesChunked {file1 file2 {chunksize 16384}} {
return 0
}
proc trace_proc sql {
global TRACE_OUT
lappend TRACE_OUT [string trim $sql]
}
# The database is initially empty.
# set an hex key create some basic data
# create table and insert operations should work
@ -2318,5 +2323,29 @@ if_built_with_openssl wont-write-database-with-invalid-cipher-2 {
db close
file delete -force test.db
do_test verify-cipher-export-with-trace-configured {
sqlite_orig db plain.db
execsql {
CREATE TABLE t1(a,b);
INSERT INTO t1(a,b) VALUES(1,2);
}
set TRACE_OUT {}
db trace trace_proc
set stmt [sqlite3_prepare db {ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'encrypted';} -1 TAIL]
sqlite3_step $stmt
sqlite3_finalize $stmt
set stmt [sqlite3_prepare db {SELECT sqlcipher_export('encrypted');} -1 TAIL]
sqlite3_step $stmt
sqlite3_finalize $stmt
set stmt [sqlite3_prepare db {DETACH DATABASE encrypted;} -1 TAIL]
sqlite3_step $stmt
sqlite3_finalize $stmt
set TRACE_OUT
} {{ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'encrypted';} {SELECT sqlcipher_export('encrypted');} {DETACH DATABASE encrypted;}}
set TRACE_OUT {}
db close
file delete -force plain.db
file delete -force encrypted.db
sqlite3_test_control_pending_byte $old_pending_byte
finish_test