diff options
author | drh <drh@noemail.net> | 2019-02-02 15:59:49 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2019-02-02 15:59:49 +0000 |
commit | e5989723ba9b6510728d8a50f35347dc8aa4ee6b (patch) | |
tree | 0cf2697e5e478696897f50d4a8928962e3476948 /src/main.c | |
parent | 9b2bd91d9a4bf91c3dff1caf1ec2687ed9b54873 (diff) | |
download | sqlite-e5989723ba9b6510728d8a50f35347dc8aa4ee6b.tar.gz sqlite-e5989723ba9b6510728d8a50f35347dc8aa4ee6b.zip |
Honor key query parameters for SEE on the URI filename for ATTACH
and VACUUM INTO.
FossilOrigin-Name: 2e01096b8933a2315e3dffcd7d0de84c744c1b4be1d909388c61f0fd636ddb99
Diffstat (limited to 'src/main.c')
-rw-r--r-- | src/main.c | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/src/main.c b/src/main.c index c40e6e877..41e024547 100644 --- a/src/main.c +++ b/src/main.c @@ -2942,6 +2942,40 @@ int sqlite3ParseUri( return rc; } +#if defined(SQLITE_HAS_CODEC) +/* +** Process URI filename query parameters relevant to the SQLite Encryption +** Extension. Return true if any of the relevant query parameters are +** seen and return false if not. +*/ +int sqlite3CodecQueryParameters( + sqlite3 *db, /* Database connection */ + const char *zDb, /* Which schema is being created/attached */ + const char *zUri /* URI filename */ +){ + const char *zKey; + if( (zKey = sqlite3_uri_parameter(zUri, "hexkey"))!=0 && zKey[0] ){ + u8 iByte; + int i; + char zDecoded[40]; + for(i=0, iByte=0; i<sizeof(zDecoded)*2 && sqlite3Isxdigit(zKey[i]); i++){ + iByte = (iByte<<4) + sqlite3HexToInt(zKey[i]); + if( (i&1)!=0 ) zDecoded[i/2] = iByte; + } + sqlite3_key_v2(db, zDb, zDecoded, i/2); + return 1; + }else if( (zKey = sqlite3_uri_parameter(zUri, "key"))!=0 ){ + sqlite3_key_v2(db, zDb, zKey, sqlite3Strlen30(zKey)); + return 1; + }else if( (zKey = sqlite3_uri_parameter(zUri, "textkey"))!=0 ){ + sqlite3_key_v2(db, zDb, zKey, -1); + return 1; + }else{ + return 0; + } +} +#endif + /* ** This routine does the work of opening a database on behalf of @@ -3287,26 +3321,13 @@ opendb_out: } #endif #if defined(SQLITE_HAS_CODEC) - if( rc==SQLITE_OK ){ - const char *zKey; - if( (zKey = sqlite3_uri_parameter(zOpen, "hexkey"))!=0 && zKey[0] ){ - u8 iByte; - int i; - char zDecoded[40]; - for(i=0, iByte=0; i<sizeof(zDecoded)*2 && sqlite3Isxdigit(zKey[i]); i++){ - iByte = (iByte<<4) + sqlite3HexToInt(zKey[i]); - if( (i&1)!=0 ) zDecoded[i/2] = iByte; - } - sqlite3_key_v2(db, 0, zDecoded, i/2); - }else if( (zKey = sqlite3_uri_parameter(zOpen, "key"))!=0 ){ - sqlite3_key_v2(db, 0, zKey, sqlite3Strlen30(zKey)); - } - } + if( rc==SQLITE_OK ) sqlite3CodecQueryParameters(db, 0, zOpen); #endif sqlite3_free(zOpen); return rc & 0xff; } + /* ** Open a new database handle. */ |