@@ -906,11 +906,11 @@ const char* sqlcipher_codec_get_cipher_provider(codec_ctx *ctx) {
906
906
}
907
907
908
908
909
- static int sqlcipher_check_connection (const char * filename , char * key , int key_sz , char * sql ) {
909
+ static int sqlcipher_check_connection (const char * filename , char * key , int key_sz , char * sql , int * user_version ) {
910
910
int rc ;
911
911
sqlite3 * db = NULL ;
912
912
sqlite3_stmt * statement = NULL ;
913
- char * query_sqlite_master = "SELECT count(*) FROM sqlite_master ;" ;
913
+ char * query_user_version = "PRAGMA user_version ;" ;
914
914
915
915
rc = sqlite3_open (filename , & db );
916
916
if (rc != SQLITE_OK ){
@@ -924,11 +924,13 @@ static int sqlcipher_check_connection(const char *filename, char *key, int key_s
924
924
if (rc != SQLITE_OK ){
925
925
goto cleanup ;
926
926
}
927
- rc = sqlite3_prepare (db , query_sqlite_master , -1 , & statement , NULL );
927
+ rc = sqlite3_prepare (db , query_user_version , -1 , & statement , NULL );
928
928
if (rc != SQLITE_OK ){
929
929
goto cleanup ;
930
930
}
931
- if (sqlite3_step (statement ) == SQLITE_ROW ){
931
+ rc = sqlite3_step (statement );
932
+ if (rc == SQLITE_ROW ){
933
+ * user_version = sqlite3_column_int (statement , 0 );
932
934
rc = SQLITE_OK ;
933
935
}
934
936
@@ -958,8 +960,10 @@ int sqlcipher_codec_ctx_migrate(codec_ctx *ctx) {
958
960
char * pragma_hmac_off = "PRAGMA cipher_use_hmac = OFF;" ;
959
961
char * pragma_4k_kdf_iter = "PRAGMA kdf_iter = 4000;" ;
960
962
char * pragma_1x_and_4k ;
963
+ char * set_user_version ;
961
964
char * key ;
962
965
int key_sz ;
966
+ int user_version = 0 ;
963
967
int upgrade_1x_format = 0 ;
964
968
int upgrade_4k_format = 0 ;
965
969
static const unsigned char aCopy [] = {
@@ -977,18 +981,18 @@ int sqlcipher_codec_ctx_migrate(codec_ctx *ctx) {
977
981
memcpy (key , ctx -> read_ctx -> pass , ctx -> read_ctx -> pass_sz );
978
982
979
983
if (db_filename ){
980
- const char * commands [4 ];
981
- char * attach_command = sqlite3_mprintf ("ATTACH DATABASE '%s-migrated' as migrate KEY '%s ';" ,
984
+ const char * commands [5 ];
985
+ char * attach_command = sqlite3_mprintf ("ATTACH DATABASE '%s-migrated' as migrate KEY '%q ';" ,
982
986
db_filename , key );
983
987
984
- int rc = sqlcipher_check_connection (db_filename , key , key_sz , "" );
988
+ int rc = sqlcipher_check_connection (db_filename , key , key_sz , "" , & user_version );
985
989
if (rc == SQLITE_OK ){
986
990
CODEC_TRACE (("No upgrade required - exiting\n" ));
987
991
goto exit ;
988
992
}
989
993
990
994
// Version 2 - check for 4k with hmac format
991
- rc = sqlcipher_check_connection (db_filename , key , key_sz , pragma_4k_kdf_iter );
995
+ rc = sqlcipher_check_connection (db_filename , key , key_sz , pragma_4k_kdf_iter , & user_version );
992
996
if (rc == SQLITE_OK ) {
993
997
CODEC_TRACE (("Version 2 format found\n" ));
994
998
upgrade_4k_format = 1 ;
@@ -997,7 +1001,7 @@ int sqlcipher_codec_ctx_migrate(codec_ctx *ctx) {
997
1001
// Version 1 - check both no hmac and 4k together
998
1002
pragma_1x_and_4k = sqlite3_mprintf ("%s%s" , pragma_hmac_off ,
999
1003
pragma_4k_kdf_iter );
1000
- rc = sqlcipher_check_connection (db_filename , key , key_sz , pragma_1x_and_4k );
1004
+ rc = sqlcipher_check_connection (db_filename , key , key_sz , pragma_1x_and_4k , & user_version );
1001
1005
sqlite3_free (pragma_1x_and_4k );
1002
1006
if (rc == SQLITE_OK ) {
1003
1007
CODEC_TRACE (("Version 1 format found\n" ));
@@ -1010,10 +1014,12 @@ int sqlcipher_codec_ctx_migrate(codec_ctx *ctx) {
1010
1014
goto handle_error ;
1011
1015
}
1012
1016
1017
+ set_user_version = sqlite3_mprintf ("PRAGMA migrate.user_version = %d;" , user_version );
1013
1018
commands [0 ] = upgrade_4k_format == 1 ? pragma_4k_kdf_iter : "" ;
1014
1019
commands [1 ] = upgrade_1x_format == 1 ? pragma_hmac_off : "" ;
1015
1020
commands [2 ] = attach_command ;
1016
1021
commands [3 ] = "SELECT sqlcipher_export('migrate');" ;
1022
+ commands [4 ] = set_user_version ;
1017
1023
1018
1024
for (command_idx = 0 ; command_idx < ArraySize (commands ); command_idx ++ ){
1019
1025
const char * command = commands [command_idx ];
@@ -1026,6 +1032,7 @@ int sqlcipher_codec_ctx_migrate(codec_ctx *ctx) {
1026
1032
}
1027
1033
}
1028
1034
sqlite3_free (attach_command );
1035
+ sqlite3_free (set_user_version );
1029
1036
sqlcipher_free (key , key_sz );
1030
1037
1031
1038
if (rc == SQLITE_OK ){
0 commit comments