]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Allow the SQLITE_OPEN_EXCLUSIVE flag in sqlite3_open(). Return the
authordrh <>
Thu, 24 Jun 2021 18:23:54 +0000 (18:23 +0000)
committerdrh <>
Thu, 24 Jun 2021 18:23:54 +0000 (18:23 +0000)
SQLITE_CANTOPEN_EXISTS extended code to indicate that the open failed because
the database already exists.

FossilOrigin-Name: d091150ff80709a1e50e0431aa33021f036979e4a88e9769eeec431dfad6d5f5

manifest
manifest.uuid
src/main.c
src/os_unix.c
src/shell.c.in
src/sqlite.h.in

index 0b1abe7100bda2b02c68979f317a732d0823ac63..00633470da5df77abbcc5d4e151dedec414c9258 100644 (file)
--- 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
index f8e64bdd7e5ed49c2dd3743058ea47951a12ad0d..880df83d62c3d77d4bcb473319a91337775d6378 100644 (file)
@@ -1 +1 @@
-0e0ece7111945d61278e60385f883303b593ed0d64beeb951b9c49f243531628
\ No newline at end of file
+d091150ff80709a1e50e0431aa33021f036979e4a88e9769eeec431dfad6d5f5
\ No newline at end of file
index f73f103f2a0d07e3e5607d2099589279d9d9cc43..e2ebb1ef2f806f95902e0a1e99e4784ca018130f 100644 (file)
@@ -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 | 
index d45fdabab24e4a9bae0dee8e5bef4bfd0e3c4169..aa6b3b8e4cbe9ee1a061d1b8d6e020c943ff9901 100644 (file)
@@ -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);
index 39f1d08b59e101ff02ef1cfb2995f7335bca9679..1f064fa96fe76dd5fc3102d9431d351f9ed449d3 100644 (file)
@@ -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;
index 553dc8aea32490c76740f6e7b604e0d50b15d749..6dcd25d4c05375a385663f2dc6f073cfa46a9487 100644 (file)
@@ -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]] ^(<dt>[SQLITE_OPEN_NOFOLLOW]</dt>
 ** <dd>The database filename is not allowed to be a symbolic link</dd>
+**
+** [[OPEN_EXCLUSIVE]] ^(<dt>[SQLITE_OPEN_EXCLUSIVE]</dt>
+** <dd>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.</dd>
 ** </dl>)^
 **
 ** If the 3rd parameter to sqlite3_open_v2() is not one of the