diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/os_win.c | 55 | ||||
-rw-r--r-- | src/test_config.c | 7 | ||||
-rw-r--r-- | src/test_vfs.c | 8 |
3 files changed, 50 insertions, 20 deletions
diff --git a/src/os_win.c b/src/os_win.c index 739be79b5..c5342b2d0 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -4044,10 +4044,13 @@ static void *winConvertFromUtf8Filename(const char *zFilename){ return zConverted; } -static int winOpenFile( - const char *zUtf8, - int *pbReadonly, - HANDLE *ph +/* +** This function is used to open a handle on a *-shm file. +*/ +static int winHandleOpen( + const char *zUtf8, /* File to open */ + int *pbReadonly, /* IN/OUT: True for readonly handle */ + HANDLE *ph /* OUT: New HANDLE for file */ ){ int rc = SQLITE_OK; void *zConverted = 0; @@ -4072,8 +4075,8 @@ static int winOpenFile( /* TODO: platforms. ** TODO: retry-on-ioerr. */ + if( osIsNT() ){ #if SQLITE_OS_WINRT - { CREATEFILE2_EXTENDED_PARAMETERS extendedParameters; memset(&extendedParameters, 0, sizeof(extendedParameters)); extendedParameters.dwSize = sizeof(extendedParameters); @@ -4086,21 +4089,35 @@ static int winOpenFile( OPEN_ALWAYS, /* dwCreationDisposition */ &extendedParameters ); - } #else - h = osCreateFileW((LPCWSTR)zConverted, /* lpFileName */ - (GENERIC_READ | (bReadonly ? 0 : GENERIC_WRITE)), /* dwDesiredAccess */ - FILE_SHARE_READ | FILE_SHARE_WRITE, /* dwShareMode */ - NULL, /* lpSecurityAttributes */ - OPEN_ALWAYS, /* dwCreationDisposition */ - FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, - NULL - ); + h = osCreateFileW((LPCWSTR)zConverted, /* lpFileName */ + (GENERIC_READ | (bReadonly ? 0 : GENERIC_WRITE)), /* dwDesiredAccess */ + FILE_SHARE_READ | FILE_SHARE_WRITE, /* dwShareMode */ + NULL, /* lpSecurityAttributes */ + OPEN_ALWAYS, /* dwCreationDisposition */ + FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, + NULL + ); #endif + }else{ + /* Due to pre-processor directives earlier in this file, + ** SQLITE_WIN32_HAS_ANSI is always defined if osIsNT() is false. */ +#ifdef SQLITE_WIN32_HAS_ANSI + h = osCreateFileA((LPCSTR)zConverted, + (GENERIC_READ | (bReadonly ? 0 : GENERIC_WRITE)), /* dwDesiredAccess */ + FILE_SHARE_READ | FILE_SHARE_WRITE, /* dwShareMode */ + NULL, /* lpSecurityAttributes */ + OPEN_ALWAYS, /* dwCreationDisposition */ + FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, + NULL + ); +#endif + } + if( h==INVALID_HANDLE_VALUE ){ if( bReadonly==0 ){ bReadonly = 1; - rc = winOpenFile(zUtf8, &bReadonly, &h); + rc = winHandleOpen(zUtf8, &bReadonly, &h); }else{ rc = SQLITE_CANTOPEN_BKPT; } @@ -4143,10 +4160,10 @@ static int winOpenSharedMemory(winFile *pDbFd){ sqlite3FileSuffix3(pDbFd->zPath, pNew->zFilename); /* Open a file-handle on the *-shm file for this connection. This file-handle - ** is only used for locking. The mapping of the *-shm file is created using the - ** shared file handle in winShmNode.hSharedShm. */ + ** is only used for locking. The mapping of the *-shm file is created using + ** the shared file handle in winShmNode.hSharedShm. */ p->bReadonly = sqlite3_uri_boolean(pDbFd->zPath, "readonly_shm", 0); - rc = winOpenFile(pNew->zFilename, &p->bReadonly, &p->hShm); + rc = winHandleOpen(pNew->zFilename, &p->bReadonly, &p->hShm); /* Look to see if there is an existing winShmNode that can be used. ** If no matching winShmNode currently exists, then create a new one. */ @@ -4169,7 +4186,7 @@ static int winOpenSharedMemory(winFile *pDbFd){ if( rc==SQLITE_OK ){ HANDLE h = INVALID_HANDLE_VALUE; pShmNode->isReadonly = p->bReadonly; - rc = winOpenFile(pNew->zFilename, &pShmNode->isReadonly, &h); + rc = winHandleOpen(pNew->zFilename, &pShmNode->isReadonly, &h); pShmNode->hSharedShm = h; } diff --git a/src/test_config.c b/src/test_config.c index 6ad7a9075..bdfb31e7d 100644 --- a/src/test_config.c +++ b/src/test_config.c @@ -787,6 +787,13 @@ Tcl_SetVar2(interp, "sqlite_options", "mergesort", "1", TCL_GLOBAL_ONLY); Tcl_SetVar2(interp, "sqlite_options", "windowfunc", "1", TCL_GLOBAL_ONLY); #endif +#if !defined(SQLITE_ENABLE_SETLK_TIMEOUT) + Tcl_SetVar2(interp, "sqlite_options", "setlk_timeout", "0", TCL_GLOBAL_ONLY); +#else + Tcl_SetVar2(interp, "sqlite_options", "setlk_timeout", + STRINGVALUE(SQLITE_ENABLE_SETLK_TIMEOUT), TCL_GLOBAL_ONLY); +#endif + #define LINKVAR(x) { \ static const int cv_ ## x = SQLITE_ ## x; \ Tcl_LinkVar(interp, "SQLITE_" #x, (char *)&(cv_ ## x), \ diff --git a/src/test_vfs.c b/src/test_vfs.c index 9f84b4f80..f75ef956b 100644 --- a/src/test_vfs.c +++ b/src/test_vfs.c @@ -130,8 +130,9 @@ struct Testvfs { #define TESTVFS_LOCK_MASK 0x00040000 #define TESTVFS_CKLOCK_MASK 0x00080000 #define TESTVFS_FCNTL_MASK 0x00100000 +#define TESTVFS_SLEEP_MASK 0x00200000 -#define TESTVFS_ALL_MASK 0x001FFFFF +#define TESTVFS_ALL_MASK 0x003FFFFF #define TESTVFS_MAX_PAGES 1024 @@ -813,6 +814,10 @@ static int tvfsRandomness(sqlite3_vfs *pVfs, int nByte, char *zBufOut){ ** actually slept. */ static int tvfsSleep(sqlite3_vfs *pVfs, int nMicro){ + Testvfs *p = (Testvfs *)pVfs->pAppData; + if( p->pScript && (p->mask&TESTVFS_SLEEP_MASK) ){ + tvfsExecTcl(p, "xSleep", Tcl_NewIntObj(nMicro), 0, 0, 0); + } return sqlite3OsSleep(PARENTVFS(pVfs), nMicro); } @@ -1197,6 +1202,7 @@ static int SQLITE_TCLAPI testvfs_obj_cmd( { "xLock", TESTVFS_LOCK_MASK }, { "xCheckReservedLock", TESTVFS_CKLOCK_MASK }, { "xFileControl", TESTVFS_FCNTL_MASK }, + { "xSleep", TESTVFS_SLEEP_MASK }, }; Tcl_Obj **apElem = 0; Tcl_Size nElem = 0; |