From: drh <> Date: Thu, 24 Jun 2021 18:23:54 +0000 (+0000) Subject: Allow the SQLITE_OPEN_EXCLUSIVE flag in sqlite3_open(). Return the X-Git-Tag: version-3.37.0~379 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dff34ab96f12640212ef249cba899f172f7d69d4;p=thirdparty%2Fsqlite.git Allow the SQLITE_OPEN_EXCLUSIVE flag in sqlite3_open(). Return the SQLITE_CANTOPEN_EXISTS extended code to indicate that the open failed because the database already exists. FossilOrigin-Name: d091150ff80709a1e50e0431aa33021f036979e4a88e9769eeec431dfad6d5f5 --- diff --git a/manifest b/manifest index 0b1abe7100..00633470da 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sconditional\snature\sof\ssqlite3_normalized_sql()\sbetter\sknown. -D 2021-06-23T17:41:38.452 +C Allow\sthe\sSQLITE_OPEN_EXCLUSIVE\sflag\sin\ssqlite3_open().\s\sReturn\sthe\nSQLITE_CANTOPEN_EXISTS\sextended\scode\sto\sindicate\sthat\sthe\sopen\sfailed\sbecause\nthe\sdatabase\salready\sexists. +D 2021-06-24T18:23:54.265 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -508,7 +508,7 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 2189e0e596010a0dc5405d9f14f78db1ee2fa71138c931f5b6ea96610b95bfc1 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 0aa9e7f08e168e3874cb54984408e3976dafdf5616d511952c425b5ac088ea3e -F src/main.c c49a03dc832c479fbdce6f0bb51f20ac3c7c2541a956c8cba68a2f61c4d23ba6 +F src/main.c aedd8596e4dbdedacbf69fc4ff0462404effb9e6528146a1fdf4adee004053c9 F src/malloc.c cbc93cdd429c4594912017d92ab656e2579aca64dbd1c6888551275bed46f25b F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de @@ -528,7 +528,7 @@ F src/os.c 59ed1f503347e8b5434c0ce7d7d0f02a3f24a72fea8b26d0bba2de8dfaef778b F src/os.h 26890f540b475598cd9881dcc68931377b8d429d3ea3e2eeb64470cde64199f8 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c feac74a0ba7652c405ba30f61d9e738be717d15899f2915a129ef160a3e5b26b +F src/os_unix.c b11e4610769922253dec27d7af4a07ff84f65169d19bda5e9b12a152a706f7f5 F src/os_win.c 77d39873836f1831a9b0b91894fec45ab0e9ca8e067dc8c549e1d1eca1566fe9 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 95c255256b13827caf038c8f963d334784073f38ab6ef9d70371d9d04f3c43e0 @@ -545,8 +545,8 @@ F src/random.c 097dc8b31b8fba5a9aca1697aeb9fd82078ec91be734c16bffda620ced7ab83c F src/resolve.c 35630effd4d16d2373caa41bae40a3d71f853f3ad0cb4f572f2ed4b8c350c1e9 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 4fa607bab6bcc580f12dbaf9c800b2250a1e408f10321a1d3bcb1dd30c447e62 -F src/shell.c.in 07c3c9ef05efdabd747acd0b009049ae0c5f4d4348496d5e29dcdf524e6fbd12 -F src/sqlite.h.in c1c540911a4bb6a9c8e12385a2b7b271bbb8b520c1b3ca8405d605a66f1f45c0 +F src/shell.c.in a41dd6ac58ed2edfb9967bbf774ae2418ef03e6e2a8ce9420dffd4d5681f3b6d +F src/sqlite.h.in 3411513e1aa0a07cfd669b7cf1817bb4a394ffb71ca09e30933433edbc82528e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h e97f4e9b509408fea4c4e9bef5a41608dfac343b4d3c7a990dedde1e19af9510 F src/sqliteInt.h fccf952bd572fe52f3bd2928982bd80933308c1118fdde27f667d0de7c77fb30 @@ -1919,7 +1919,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6699a2f6bec9dfcdc456ff1cd8e652588b144ec28b7eac6e403a63eab61b416e -R 97422642c89cbcd5a06a3965ff4e42a5 -U larrybr -Z 081b6dfad3e7ceb900a3ca592bf7620d +P 0e0ece7111945d61278e60385f883303b593ed0d64beeb951b9c49f243531628 +R d49c4e4c2feb2977a624c53673d27670 +U drh +Z a9d994e59c81c672b66c62cc7efdfd13 diff --git a/manifest.uuid b/manifest.uuid index f8e64bdd7e..880df83d62 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0e0ece7111945d61278e60385f883303b593ed0d64beeb951b9c49f243531628 \ No newline at end of file +d091150ff80709a1e50e0431aa33021f036979e4a88e9769eeec431dfad6d5f5 \ No newline at end of file diff --git a/src/main.c b/src/main.c index f73f103f2a..e2ebb1ef2f 100644 --- a/src/main.c +++ b/src/main.c @@ -3149,7 +3149,6 @@ static int openDatabase( ** off all other flags. */ flags &= ~( SQLITE_OPEN_DELETEONCLOSE | - SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_MAIN_DB | SQLITE_OPEN_TEMP_DB | SQLITE_OPEN_TRANSIENT_DB | diff --git a/src/os_unix.c b/src/os_unix.c index d45fdabab2..aa6b3b8e4c 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -6185,6 +6185,8 @@ static int unixOpen( /* If unable to create a journal because the directory is not ** writable, change the error code to indicate that. */ rc = SQLITE_READONLY_DIRECTORY; + }else if( errno==EEXIST ){ + rc = SQLITE_CANTOPEN_EXISTS; }else if( errno!=EISDIR && isReadWrite ){ /* Failed to open the file for read/write access. Try read-only. */ flags &= ~(SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE); diff --git a/src/shell.c.in b/src/shell.c.in index 39f1d08b59..1f064fa96f 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -8730,6 +8730,8 @@ static int do_meta_command(char *zLine, ShellState *p){ p->openMode = SHELL_OPEN_READONLY; }else if( optionMatch(z, "nofollow") ){ p->openFlags |= SQLITE_OPEN_NOFOLLOW; + }else if( optionMatch(z, "excl") ){ + p->openFlags |= SQLITE_OPEN_EXCLUSIVE; #ifndef SQLITE_OMIT_DESERIALIZE }else if( optionMatch(z, "deserialize") ){ p->openMode = SHELL_OPEN_DESERIALIZE; diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 553dc8aea3..6dcd25d4c0 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -516,6 +516,7 @@ int sqlite3_exec( #define SQLITE_CANTOPEN_CONVPATH (SQLITE_CANTOPEN | (4<<8)) #define SQLITE_CANTOPEN_DIRTYWAL (SQLITE_CANTOPEN | (5<<8)) /* Not Used */ #define SQLITE_CANTOPEN_SYMLINK (SQLITE_CANTOPEN | (6<<8)) +#define SQLITE_CANTOPEN_EXISTS (SQLITE_CANTOPEN | (7<<8)) #define SQLITE_CORRUPT_VTAB (SQLITE_CORRUPT | (1<<8)) #define SQLITE_CORRUPT_SEQUENCE (SQLITE_CORRUPT | (2<<8)) #define SQLITE_CORRUPT_INDEX (SQLITE_CORRUPT | (3<<8)) @@ -3394,6 +3395,12 @@ void sqlite3_progress_handler(sqlite3*, int, int(*)(void*), void*); ** ** [[OPEN_NOFOLLOW]] ^(
[SQLITE_OPEN_NOFOLLOW]
**
The database filename is not allowed to be a symbolic link
+** +** [[OPEN_EXCLUSIVE]] ^(
[SQLITE_OPEN_EXCLUSIVE]
+**
This flag causes the open to fail if the database file already +** exists. The open will only be success if this flag is used in combination +** with the SQLITE_OPEN_CREATE and SQLITE_OPEN_READWRITE flags and if +** the file does not previously exist.
** )^ ** ** If the 3rd parameter to sqlite3_open_v2() is not one of the