mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-12 13:01:09 +03:00
Initial work on a Win32 VFS with NOP locking.
FossilOrigin-Name: 549abe3f89b55b05a05f267865a5dd84b8cd335d
This commit is contained in:
18
manifest
18
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Another\sattempt\sto\sfix\serror\shandling\sin\sLemon.\s\sThis\schange\sis\sa\sno-op\sfor\nSQLite's\susage.
|
C Initial\swork\son\sa\sWin32\sVFS\swith\sNOP\slocking.
|
||||||
D 2016-07-08T19:54:38.723
|
D 2016-07-08T21:14:37.641
|
||||||
F Makefile.in 6c20d44f72d4564f11652b26291a214c8367e5db
|
F Makefile.in 6c20d44f72d4564f11652b26291a214c8367e5db
|
||||||
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
||||||
F Makefile.msc d66d0395c38571aab3804f8db0fa20707ae4609a
|
F Makefile.msc d66d0395c38571aab3804f8db0fa20707ae4609a
|
||||||
@@ -368,7 +368,7 @@ F src/os.h 8e976e59eb4ca1c0fca6d35ee803e38951cb0343
|
|||||||
F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85
|
F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85
|
||||||
F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa
|
F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa
|
||||||
F src/os_unix.c a9443cdab41d7f3cdf0df3a5aab62fd6e1c9b234
|
F src/os_unix.c a9443cdab41d7f3cdf0df3a5aab62fd6e1c9b234
|
||||||
F src/os_win.c d4b8faf8896b65818e67070711fdd00d8e620bd6
|
F src/os_win.c 716af57117381c24c0eb43c8dc5a86a6496f98a7
|
||||||
F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca
|
F src/os_win.h eb7a47aa17b26b77eb97e4823f20a00b8bda12ca
|
||||||
F src/pager.c c368634b888b1c8740aea83b36bfd266f2443e60
|
F src/pager.c c368634b888b1c8740aea83b36bfd266f2443e60
|
||||||
F src/pager.h 8ab6b6feeee4bc0439bfde7ee59ba99df98b9bc3
|
F src/pager.h 8ab6b6feeee4bc0439bfde7ee59ba99df98b9bc3
|
||||||
@@ -1402,6 +1402,7 @@ F test/wild001.test bca33f499866f04c24510d74baf1e578d4e44b1c
|
|||||||
F test/win32heap.test ea19770974795cff26e11575e12d422dbd16893c
|
F test/win32heap.test ea19770974795cff26e11575e12d422dbd16893c
|
||||||
F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972
|
F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972
|
||||||
F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d
|
F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d
|
||||||
|
F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc
|
||||||
F test/with1.test cef099a491eac9874f2c28bd2dc86394fb3e47b3
|
F test/with1.test cef099a491eac9874f2c28bd2dc86394fb3e47b3
|
||||||
F test/with2.test 2b40da883658eb74ad8ad06afabe11a408e7fb87
|
F test/with2.test 2b40da883658eb74ad8ad06afabe11a408e7fb87
|
||||||
F test/with3.test 511bacdbe41c49cf34f9fd1bd3245fe1575bca98
|
F test/with3.test 511bacdbe41c49cf34f9fd1bd3245fe1575bca98
|
||||||
@@ -1504,7 +1505,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P 8bb8d886ffa948cd7bc66c8c62da76bce233be2e
|
P e1d8ef311cabcb96495a88404991b1416655e4a8
|
||||||
R 855944636ee976f5addadf9e5d764c10
|
R ba3e2959766a1594f290917f0109fdb1
|
||||||
U drh
|
T *branch * win32nolock
|
||||||
Z 1b9ee21867274cd5ef77d7b4ebcc2052
|
T *sym-win32nolock *
|
||||||
|
T -sym-trunk *
|
||||||
|
U mistachkin
|
||||||
|
Z 21c6555b60ed7b3a758f8d504d1fa54f
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
e1d8ef311cabcb96495a88404991b1416655e4a8
|
549abe3f89b55b05a05f267865a5dd84b8cd335d
|
||||||
162
src/os_win.c
162
src/os_win.c
@@ -290,6 +290,17 @@ struct winFile {
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** The winVfsAppData structure is used for the pAppData member for all of the
|
||||||
|
** Win32 VFS variants.
|
||||||
|
*/
|
||||||
|
typedef struct winVfsAppData winVfsAppData;
|
||||||
|
struct winVfsAppData {
|
||||||
|
const sqlite3_io_methods *pMethod; /* The file I/O methods to use. */
|
||||||
|
void *pAppData; /* The extra pAppData, if any. */
|
||||||
|
BOOL bNoLock; /* Non-zero if locking is disabled. */
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Allowed values for winFile.ctrlFlags
|
** Allowed values for winFile.ctrlFlags
|
||||||
*/
|
*/
|
||||||
@@ -2611,7 +2622,12 @@ static int winClose(sqlite3_file *id){
|
|||||||
}while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (sqlite3_win32_sleep(100), 1) );
|
}while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (sqlite3_win32_sleep(100), 1) );
|
||||||
#if SQLITE_OS_WINCE
|
#if SQLITE_OS_WINCE
|
||||||
#define WINCE_DELETION_ATTEMPTS 3
|
#define WINCE_DELETION_ATTEMPTS 3
|
||||||
|
{
|
||||||
|
winVfsAppData *pAppData = (winVfsAppData*)pFile->pVfs->pAppData;
|
||||||
|
if( pAppData==NULL || !pAppData->bNoLock ){
|
||||||
winceDestroyLock(pFile);
|
winceDestroyLock(pFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
if( pFile->zDeleteOnClose ){
|
if( pFile->zDeleteOnClose ){
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
while(
|
while(
|
||||||
@@ -3343,6 +3359,44 @@ static int winUnlock(sqlite3_file *id, int locktype){
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
****************************** No-op Locking **********************************
|
||||||
|
**
|
||||||
|
** Of the various locking implementations available, this is by far the
|
||||||
|
** simplest: locking is ignored. No attempt is made to lock the database
|
||||||
|
** file for reading or writing.
|
||||||
|
**
|
||||||
|
** This locking mode is appropriate for use on read-only databases
|
||||||
|
** (ex: databases that are burned into CD-ROM, for example.) It can
|
||||||
|
** also be used if the application employs some external mechanism to
|
||||||
|
** prevent simultaneous access of the same database by two or more
|
||||||
|
** database connections. But there is a serious risk of database
|
||||||
|
** corruption if this locking mode is used in situations where multiple
|
||||||
|
** database connections are accessing the same database file at the same
|
||||||
|
** time and one or more of those connections are writing.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int winNolockLock(sqlite3_file *id, int locktype){
|
||||||
|
UNUSED_PARAMETER(id);
|
||||||
|
UNUSED_PARAMETER(locktype);
|
||||||
|
return SQLITE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int winNolockCheckReservedLock(sqlite3_file *id, int *pResOut){
|
||||||
|
UNUSED_PARAMETER(id);
|
||||||
|
UNUSED_PARAMETER(pResOut);
|
||||||
|
return SQLITE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int winNolockUnlock(sqlite3_file *id, int locktype){
|
||||||
|
UNUSED_PARAMETER(id);
|
||||||
|
UNUSED_PARAMETER(locktype);
|
||||||
|
return SQLITE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************* End of the no-op lock implementation *********************
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** If *pArg is initially negative then this is a query. Set *pArg to
|
** If *pArg is initially negative then this is a query. Set *pArg to
|
||||||
** 1 or 0 depending on whether or not bit mask of pFile->ctrlFlags is set.
|
** 1 or 0 depending on whether or not bit mask of pFile->ctrlFlags is set.
|
||||||
@@ -4407,6 +4461,44 @@ static const sqlite3_io_methods winIoMethod = {
|
|||||||
winUnfetch /* xUnfetch */
|
winUnfetch /* xUnfetch */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
** This vector defines all the methods that can operate on an
|
||||||
|
** sqlite3_file for win32 without performing any locking.
|
||||||
|
*/
|
||||||
|
static const sqlite3_io_methods winIoNolockMethod = {
|
||||||
|
3, /* iVersion */
|
||||||
|
winClose, /* xClose */
|
||||||
|
winRead, /* xRead */
|
||||||
|
winWrite, /* xWrite */
|
||||||
|
winTruncate, /* xTruncate */
|
||||||
|
winSync, /* xSync */
|
||||||
|
winFileSize, /* xFileSize */
|
||||||
|
winNolockLock, /* xLock */
|
||||||
|
winNolockUnlock, /* xUnlock */
|
||||||
|
winNolockCheckReservedLock, /* xCheckReservedLock */
|
||||||
|
winFileControl, /* xFileControl */
|
||||||
|
winSectorSize, /* xSectorSize */
|
||||||
|
winDeviceCharacteristics, /* xDeviceCharacteristics */
|
||||||
|
winShmMap, /* xShmMap */
|
||||||
|
winShmLock, /* xShmLock */
|
||||||
|
winShmBarrier, /* xShmBarrier */
|
||||||
|
winShmUnmap, /* xShmUnmap */
|
||||||
|
winFetch, /* xFetch */
|
||||||
|
winUnfetch /* xUnfetch */
|
||||||
|
};
|
||||||
|
|
||||||
|
static winVfsAppData winAppData = {
|
||||||
|
&winIoMethod, /* pMethod */
|
||||||
|
0, /* pAppData */
|
||||||
|
0 /* bNoLock */
|
||||||
|
};
|
||||||
|
|
||||||
|
static winVfsAppData winNolockAppData = {
|
||||||
|
&winIoNolockMethod, /* pMethod */
|
||||||
|
0, /* pAppData */
|
||||||
|
1 /* bNoLock */
|
||||||
|
};
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
**************************** sqlite3_vfs methods ****************************
|
**************************** sqlite3_vfs methods ****************************
|
||||||
**
|
**
|
||||||
@@ -4739,7 +4831,7 @@ static int winIsDir(const void *zConverted){
|
|||||||
** Open a file.
|
** Open a file.
|
||||||
*/
|
*/
|
||||||
static int winOpen(
|
static int winOpen(
|
||||||
sqlite3_vfs *pVfs, /* Used to get maximum path name length */
|
sqlite3_vfs *pVfs, /* Used to get maximum path length and AppData */
|
||||||
const char *zName, /* Name of the file (UTF-8) */
|
const char *zName, /* Name of the file (UTF-8) */
|
||||||
sqlite3_file *id, /* Write the SQLite file handle here */
|
sqlite3_file *id, /* Write the SQLite file handle here */
|
||||||
int flags, /* Open mode flags */
|
int flags, /* Open mode flags */
|
||||||
@@ -4754,6 +4846,7 @@ static int winOpen(
|
|||||||
#if SQLITE_OS_WINCE
|
#if SQLITE_OS_WINCE
|
||||||
int isTemp = 0;
|
int isTemp = 0;
|
||||||
#endif
|
#endif
|
||||||
|
winVfsAppData *pAppData;
|
||||||
winFile *pFile = (winFile*)id;
|
winFile *pFile = (winFile*)id;
|
||||||
void *zConverted; /* Filename in OS encoding */
|
void *zConverted; /* Filename in OS encoding */
|
||||||
const char *zUtf8Name = zName; /* Filename in UTF-8 encoding */
|
const char *zUtf8Name = zName; /* Filename in UTF-8 encoding */
|
||||||
@@ -4975,8 +5068,12 @@ static int winOpen(
|
|||||||
"rc=%s\n", h, zUtf8Name, dwDesiredAccess, pOutFlags, pOutFlags ?
|
"rc=%s\n", h, zUtf8Name, dwDesiredAccess, pOutFlags, pOutFlags ?
|
||||||
*pOutFlags : 0, (h==INVALID_HANDLE_VALUE) ? "failed" : "ok"));
|
*pOutFlags : 0, (h==INVALID_HANDLE_VALUE) ? "failed" : "ok"));
|
||||||
|
|
||||||
|
pAppData = (winVfsAppData*)pVfs->pAppData;
|
||||||
|
|
||||||
#if SQLITE_OS_WINCE
|
#if SQLITE_OS_WINCE
|
||||||
|
{
|
||||||
if( isReadWrite && eType==SQLITE_OPEN_MAIN_DB
|
if( isReadWrite && eType==SQLITE_OPEN_MAIN_DB
|
||||||
|
&& ((pAppData==NULL) || !pAppData->bNoLock)
|
||||||
&& (rc = winceCreateLock(zName, pFile))!=SQLITE_OK
|
&& (rc = winceCreateLock(zName, pFile))!=SQLITE_OK
|
||||||
){
|
){
|
||||||
osCloseHandle(h);
|
osCloseHandle(h);
|
||||||
@@ -4985,6 +5082,7 @@ static int winOpen(
|
|||||||
OSTRACE(("OPEN-CE-LOCK name=%s, rc=%s\n", zName, sqlite3ErrName(rc)));
|
OSTRACE(("OPEN-CE-LOCK name=%s, rc=%s\n", zName, sqlite3ErrName(rc)));
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if( isTemp ){
|
if( isTemp ){
|
||||||
pFile->zDeleteOnClose = zConverted;
|
pFile->zDeleteOnClose = zConverted;
|
||||||
}else
|
}else
|
||||||
@@ -4994,7 +5092,7 @@ static int winOpen(
|
|||||||
}
|
}
|
||||||
|
|
||||||
sqlite3_free(zTmpname);
|
sqlite3_free(zTmpname);
|
||||||
pFile->pMethod = &winIoMethod;
|
pFile->pMethod = pAppData ? pAppData->pMethod : &winIoMethod;
|
||||||
pFile->pVfs = pVfs;
|
pFile->pVfs = pVfs;
|
||||||
pFile->h = h;
|
pFile->h = h;
|
||||||
if( isReadonly ){
|
if( isReadonly ){
|
||||||
@@ -5722,7 +5820,7 @@ int sqlite3_os_init(void){
|
|||||||
SQLITE_WIN32_MAX_PATH_BYTES, /* mxPathname */
|
SQLITE_WIN32_MAX_PATH_BYTES, /* mxPathname */
|
||||||
0, /* pNext */
|
0, /* pNext */
|
||||||
"win32", /* zName */
|
"win32", /* zName */
|
||||||
0, /* pAppData */
|
&winAppData, /* pAppData */
|
||||||
winOpen, /* xOpen */
|
winOpen, /* xOpen */
|
||||||
winDelete, /* xDelete */
|
winDelete, /* xDelete */
|
||||||
winAccess, /* xAccess */
|
winAccess, /* xAccess */
|
||||||
@@ -5747,7 +5845,57 @@ int sqlite3_os_init(void){
|
|||||||
SQLITE_WINNT_MAX_PATH_BYTES, /* mxPathname */
|
SQLITE_WINNT_MAX_PATH_BYTES, /* mxPathname */
|
||||||
0, /* pNext */
|
0, /* pNext */
|
||||||
"win32-longpath", /* zName */
|
"win32-longpath", /* zName */
|
||||||
0, /* pAppData */
|
&winAppData, /* pAppData */
|
||||||
|
winOpen, /* xOpen */
|
||||||
|
winDelete, /* xDelete */
|
||||||
|
winAccess, /* xAccess */
|
||||||
|
winFullPathname, /* xFullPathname */
|
||||||
|
winDlOpen, /* xDlOpen */
|
||||||
|
winDlError, /* xDlError */
|
||||||
|
winDlSym, /* xDlSym */
|
||||||
|
winDlClose, /* xDlClose */
|
||||||
|
winRandomness, /* xRandomness */
|
||||||
|
winSleep, /* xSleep */
|
||||||
|
winCurrentTime, /* xCurrentTime */
|
||||||
|
winGetLastError, /* xGetLastError */
|
||||||
|
winCurrentTimeInt64, /* xCurrentTimeInt64 */
|
||||||
|
winSetSystemCall, /* xSetSystemCall */
|
||||||
|
winGetSystemCall, /* xGetSystemCall */
|
||||||
|
winNextSystemCall, /* xNextSystemCall */
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
static sqlite3_vfs winNolockVfs = {
|
||||||
|
3, /* iVersion */
|
||||||
|
sizeof(winFile), /* szOsFile */
|
||||||
|
SQLITE_WIN32_MAX_PATH_BYTES, /* mxPathname */
|
||||||
|
0, /* pNext */
|
||||||
|
"win32-none", /* zName */
|
||||||
|
&winNolockAppData, /* pAppData */
|
||||||
|
winOpen, /* xOpen */
|
||||||
|
winDelete, /* xDelete */
|
||||||
|
winAccess, /* xAccess */
|
||||||
|
winFullPathname, /* xFullPathname */
|
||||||
|
winDlOpen, /* xDlOpen */
|
||||||
|
winDlError, /* xDlError */
|
||||||
|
winDlSym, /* xDlSym */
|
||||||
|
winDlClose, /* xDlClose */
|
||||||
|
winRandomness, /* xRandomness */
|
||||||
|
winSleep, /* xSleep */
|
||||||
|
winCurrentTime, /* xCurrentTime */
|
||||||
|
winGetLastError, /* xGetLastError */
|
||||||
|
winCurrentTimeInt64, /* xCurrentTimeInt64 */
|
||||||
|
winSetSystemCall, /* xSetSystemCall */
|
||||||
|
winGetSystemCall, /* xGetSystemCall */
|
||||||
|
winNextSystemCall, /* xNextSystemCall */
|
||||||
|
};
|
||||||
|
#if defined(SQLITE_WIN32_HAS_WIDE)
|
||||||
|
static sqlite3_vfs winLongPathNolockVfs = {
|
||||||
|
3, /* iVersion */
|
||||||
|
sizeof(winFile), /* szOsFile */
|
||||||
|
SQLITE_WINNT_MAX_PATH_BYTES, /* mxPathname */
|
||||||
|
0, /* pNext */
|
||||||
|
"win32-longpath-none", /* zName */
|
||||||
|
&winNolockAppData, /* pAppData */
|
||||||
winOpen, /* xOpen */
|
winOpen, /* xOpen */
|
||||||
winDelete, /* xDelete */
|
winDelete, /* xDelete */
|
||||||
winAccess, /* xAccess */
|
winAccess, /* xAccess */
|
||||||
@@ -5787,6 +5935,12 @@ int sqlite3_os_init(void){
|
|||||||
sqlite3_vfs_register(&winLongPathVfs, 0);
|
sqlite3_vfs_register(&winLongPathVfs, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
sqlite3_vfs_register(&winNolockVfs, 0);
|
||||||
|
|
||||||
|
#if defined(SQLITE_WIN32_HAS_WIDE)
|
||||||
|
sqlite3_vfs_register(&winLongPathNolockVfs, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
return SQLITE_OK;
|
return SQLITE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
126
test/win32nolock.test
Normal file
126
test/win32nolock.test
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
# 2016 July 8
|
||||||
|
#
|
||||||
|
# The author disclaims copyright to this source code. In place of
|
||||||
|
# a legal notice, here is a blessing:
|
||||||
|
#
|
||||||
|
# May you do good and not evil.
|
||||||
|
# May you find forgiveness for yourself and forgive others.
|
||||||
|
# May you share freely, never taking more than you give.
|
||||||
|
#
|
||||||
|
#***********************************************************************
|
||||||
|
# This file implements regression tests for SQLite library.
|
||||||
|
#
|
||||||
|
|
||||||
|
if {$tcl_platform(platform)!="windows"} return
|
||||||
|
|
||||||
|
set testdir [file dirname $argv0]
|
||||||
|
source $testdir/tester.tcl
|
||||||
|
set testprefix win32nolock
|
||||||
|
|
||||||
|
do_test win32nolock-1.0 {
|
||||||
|
sqlite3 db test.db
|
||||||
|
execsql {
|
||||||
|
CREATE TABLE t1(a, b);
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO t1 VALUES(1, 2);
|
||||||
|
}
|
||||||
|
} {}
|
||||||
|
|
||||||
|
do_test win32nolock-1.1 {
|
||||||
|
execsql COMMIT
|
||||||
|
catchsql { SELECT * FROM t1 }
|
||||||
|
} {0 {1 2}}
|
||||||
|
|
||||||
|
db close
|
||||||
|
|
||||||
|
do_test win32nolock-1.2 {
|
||||||
|
sqlite3 db test.db -vfs win32-none
|
||||||
|
sqlite3 db2 test.db -vfs win32-none
|
||||||
|
execsql { PRAGMA mmap_size = 0 } db2
|
||||||
|
execsql {
|
||||||
|
BEGIN;
|
||||||
|
INSERT INTO t1 VALUES(3, 4);
|
||||||
|
}
|
||||||
|
} {}
|
||||||
|
|
||||||
|
do_test win32nolock-1.3 {
|
||||||
|
execsql { SELECT * FROM t1 }
|
||||||
|
} {1 2 3 4}
|
||||||
|
|
||||||
|
do_test win32nolock-1.4 {
|
||||||
|
execsql { SELECT * FROM t1; } db2
|
||||||
|
} {1 2}
|
||||||
|
|
||||||
|
do_test win32nolock-1.5 {
|
||||||
|
execsql {
|
||||||
|
BEGIN;
|
||||||
|
SELECT * FROM t1;
|
||||||
|
} db2
|
||||||
|
} {1 2}
|
||||||
|
|
||||||
|
do_test win32nolock-1.6 {
|
||||||
|
execsql COMMIT
|
||||||
|
execsql {SELECT * FROM t1} db2
|
||||||
|
} {1 2}
|
||||||
|
|
||||||
|
ifcapable memorymanage {
|
||||||
|
do_test win32nolock-1.7 {
|
||||||
|
sqlite3_release_memory 1000000
|
||||||
|
execsql {SELECT * FROM t1} db2
|
||||||
|
} {1 2 3 4}
|
||||||
|
}
|
||||||
|
|
||||||
|
do_test win32nolock-1.8 {
|
||||||
|
db close
|
||||||
|
db2 close
|
||||||
|
} {}
|
||||||
|
|
||||||
|
do_test win32nolock-1.9.1 {
|
||||||
|
sqlite3 db test.db
|
||||||
|
sqlite3 db2 test.db
|
||||||
|
list [catchsql { BEGIN EXCLUSIVE; } db] \
|
||||||
|
[catchsql { BEGIN EXCLUSIVE; } db2]
|
||||||
|
} {{0 {}} {1 {database is locked}}}
|
||||||
|
|
||||||
|
do_test win32nolock-1.9.2 {
|
||||||
|
db close
|
||||||
|
db2 close
|
||||||
|
} {}
|
||||||
|
|
||||||
|
do_test win32nolock-1.10.1 {
|
||||||
|
sqlite3 db test.db -vfs win32-none
|
||||||
|
sqlite3 db2 test.db
|
||||||
|
list [catchsql { BEGIN EXCLUSIVE; } db] \
|
||||||
|
[catchsql { BEGIN EXCLUSIVE; } db2]
|
||||||
|
} {{0 {}} {0 {}}}
|
||||||
|
|
||||||
|
do_test win32nolock-1.10.2 {
|
||||||
|
db close
|
||||||
|
db2 close
|
||||||
|
} {}
|
||||||
|
|
||||||
|
do_test win32nolock-1.11.1 {
|
||||||
|
sqlite3 db test.db
|
||||||
|
sqlite3 db2 test.db -vfs win32-none
|
||||||
|
list [catchsql { BEGIN EXCLUSIVE; } db] \
|
||||||
|
[catchsql { BEGIN EXCLUSIVE; } db2]
|
||||||
|
} {{0 {}} {0 {}}}
|
||||||
|
|
||||||
|
do_test win32nolock-1.11.2 {
|
||||||
|
db close
|
||||||
|
db2 close
|
||||||
|
} {}
|
||||||
|
|
||||||
|
do_test win32nolock-1.12.1 {
|
||||||
|
sqlite3 db test.db -vfs win32-none
|
||||||
|
sqlite3 db2 test.db -vfs win32-none
|
||||||
|
list [catchsql { BEGIN EXCLUSIVE; } db] \
|
||||||
|
[catchsql { BEGIN EXCLUSIVE; } db2]
|
||||||
|
} {{0 {}} {0 {}}}
|
||||||
|
|
||||||
|
do_test win32nolock-1.12.2 {
|
||||||
|
db close
|
||||||
|
db2 close
|
||||||
|
} {}
|
||||||
|
|
||||||
|
finish_test
|
||||||
Reference in New Issue
Block a user