mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-12 13:01:09 +03:00
In the Win32 VFS, work around InterlockedCompareExchange() being a macro on some platforms (e.g. x64).
FossilOrigin-Name: 7be244ce129d6502f3a3e3f3e8a1dd61ef71d878
This commit is contained in:
14
manifest
14
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Fix\stypos\sin\sthe\sopcode\sdocumentation.\s\sComment\schanges\sonly.\s\sNo\schanges\nto\scode.
|
C In\sthe\sWin32\sVFS,\swork\saround\sInterlockedCompareExchange()\sbeing\sa\smacro\son\ssome\splatforms\s(e.g.\sx64).
|
||||||
D 2014-08-06T01:08:07.269
|
D 2014-08-06T03:06:01.637
|
||||||
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
|
||||||
F Makefile.in 5eb79e334a5de69c87740edd56af6527dd219308
|
F Makefile.in 5eb79e334a5de69c87740edd56af6527dd219308
|
||||||
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
|
||||||
@@ -208,7 +208,7 @@ F src/os.h 60d419395e32a8029fa380a80a3da2e9030f635e
|
|||||||
F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04
|
F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04
|
||||||
F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa
|
F src/os_setup.h c9d4553b5aaa6f73391448b265b89bed0b890faa
|
||||||
F src/os_unix.c a7baf1b30f3c58ba20b813e01aab23b18ae44f85
|
F src/os_unix.c a7baf1b30f3c58ba20b813e01aab23b18ae44f85
|
||||||
F src/os_win.c e5f0fc446a682b70db3397d14cca9806d9a15d12
|
F src/os_win.c dddffe56dd21fd3687eaec36e01499988918a4fb
|
||||||
F src/os_win.h 057344a6720b4c8405d9bd98f58cb37a6ee46c25
|
F src/os_win.h 057344a6720b4c8405d9bd98f58cb37a6ee46c25
|
||||||
F src/pager.c f6bb1fa6cdf2062f2d8aec3e64db302bca519ab8
|
F src/pager.c f6bb1fa6cdf2062f2d8aec3e64db302bca519ab8
|
||||||
F src/pager.h ffd5607f7b3e4590b415b007a4382f693334d428
|
F src/pager.h ffd5607f7b3e4590b415b007a4382f693334d428
|
||||||
@@ -1185,7 +1185,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1
|
|||||||
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
|
||||||
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
|
F tool/warnings.sh 0abfd78ceb09b7f7c27c688c8e3fe93268a13b32
|
||||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||||
P 0ad1ed8ef0b5fb5d8db44479373b2b93d8fcfd66
|
P 717245d48714c08156c9b7636aaa6c3a402bad66
|
||||||
R 1045cc0c95f68e0f0e2e47642b0ec158
|
R c63f8cfa87b32fea35b14f1ae3f3b367
|
||||||
U drh
|
U mistachkin
|
||||||
Z fecab6dfa8d111d2725130892a38124f
|
Z 0f9f130c5300af8c7a887c050bb16bac
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
717245d48714c08156c9b7636aaa6c3a402bad66
|
7be244ce129d6502f3a3e3f3e8a1dd61ef71d878
|
||||||
179
src/os_win.c
179
src/os_win.c
@@ -204,7 +204,7 @@ WINBASEAPI BOOL WINAPI UnmapViewOfFile(LPCVOID);
|
|||||||
** Some Microsoft compilers lack this definition.
|
** Some Microsoft compilers lack this definition.
|
||||||
*/
|
*/
|
||||||
#ifndef INVALID_FILE_ATTRIBUTES
|
#ifndef INVALID_FILE_ATTRIBUTES
|
||||||
# define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
|
# define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef FILE_FLAG_MASK
|
#ifndef FILE_FLAG_MASK
|
||||||
@@ -254,7 +254,7 @@ struct winFile {
|
|||||||
int szChunk; /* Chunk size configured by FCNTL_CHUNK_SIZE */
|
int szChunk; /* Chunk size configured by FCNTL_CHUNK_SIZE */
|
||||||
#if SQLITE_OS_WINCE
|
#if SQLITE_OS_WINCE
|
||||||
LPWSTR zDeleteOnClose; /* Name of file to delete when closing */
|
LPWSTR zDeleteOnClose; /* Name of file to delete when closing */
|
||||||
HANDLE hMutex; /* Mutex used to control access to shared lock */
|
HANDLE hMutex; /* Mutex used to control access to shared lock */
|
||||||
HANDLE hShared; /* Shared memory segment used for locking */
|
HANDLE hShared; /* Shared memory segment used for locking */
|
||||||
winceLock local; /* Locks obtained by this instance of winFile */
|
winceLock local; /* Locks obtained by this instance of winFile */
|
||||||
winceLock *shared; /* Global shared lock memory for the file */
|
winceLock *shared; /* Global shared lock memory for the file */
|
||||||
@@ -1047,10 +1047,19 @@ static struct win_syscall {
|
|||||||
#define osCreateFileMappingFromApp ((HANDLE(WINAPI*)(HANDLE, \
|
#define osCreateFileMappingFromApp ((HANDLE(WINAPI*)(HANDLE, \
|
||||||
LPSECURITY_ATTRIBUTES,ULONG,ULONG64,LPCWSTR))aSyscall[75].pCurrent)
|
LPSECURITY_ATTRIBUTES,ULONG,ULONG64,LPCWSTR))aSyscall[75].pCurrent)
|
||||||
|
|
||||||
|
/*
|
||||||
|
** NOTE: On some sub-platforms, the InterlockedCompareExchange "function"
|
||||||
|
** is really just a macro that uses a compiler intrinsic (e.g. x64).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(InterlockedCompareExchange)
|
||||||
|
#define osInterlockedCompareExchange InterlockedCompareExchange
|
||||||
|
#else
|
||||||
{ "InterlockedCompareExchange", (SYSCALL)InterlockedCompareExchange, 0 },
|
{ "InterlockedCompareExchange", (SYSCALL)InterlockedCompareExchange, 0 },
|
||||||
|
|
||||||
#define osInterlockedCompareExchange ((LONG(WINAPI*)(LONG volatile*, \
|
#define osInterlockedCompareExchange ((LONG(WINAPI*)(LONG volatile*, \
|
||||||
LONG,LONG))aSyscall[76].pCurrent)
|
LONG,LONG))aSyscall[76].pCurrent)
|
||||||
|
#endif /* defined(InterlockedCompareExchange) */
|
||||||
|
|
||||||
}; /* End of the overrideable system calls */
|
}; /* End of the overrideable system calls */
|
||||||
|
|
||||||
@@ -1532,7 +1541,7 @@ void sqlite3MemSetDefault(void){
|
|||||||
#endif /* SQLITE_WIN32_MALLOC */
|
#endif /* SQLITE_WIN32_MALLOC */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Convert a UTF-8 string to Microsoft Unicode (UTF-16?).
|
** Convert a UTF-8 string to Microsoft Unicode (UTF-16?).
|
||||||
**
|
**
|
||||||
** Space to hold the returned string is obtained from malloc.
|
** Space to hold the returned string is obtained from malloc.
|
||||||
*/
|
*/
|
||||||
@@ -1585,7 +1594,7 @@ static char *winUnicodeToUtf8(LPCWSTR zWideFilename){
|
|||||||
/*
|
/*
|
||||||
** Convert an ANSI string to Microsoft Unicode, based on the
|
** Convert an ANSI string to Microsoft Unicode, based on the
|
||||||
** current codepage settings for file apis.
|
** current codepage settings for file apis.
|
||||||
**
|
**
|
||||||
** Space to hold the returned string is obtained
|
** Space to hold the returned string is obtained
|
||||||
** from sqlite3_malloc.
|
** from sqlite3_malloc.
|
||||||
*/
|
*/
|
||||||
@@ -1659,7 +1668,7 @@ char *sqlite3_win32_mbcs_to_utf8(const char *zFilename){
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Convert UTF-8 to multibyte character string. Space to hold the
|
** Convert UTF-8 to multibyte character string. Space to hold the
|
||||||
** returned string is obtained from sqlite3_malloc().
|
** returned string is obtained from sqlite3_malloc().
|
||||||
*/
|
*/
|
||||||
char *sqlite3_win32_utf8_to_mbcs(const char *zFilename){
|
char *sqlite3_win32_utf8_to_mbcs(const char *zFilename){
|
||||||
@@ -1799,11 +1808,11 @@ static int winGetLastErrorMsg(DWORD lastErrno, int nBuf, char *zBuf){
|
|||||||
**
|
**
|
||||||
** This routine is invoked after an error occurs in an OS function.
|
** This routine is invoked after an error occurs in an OS function.
|
||||||
** It logs a message using sqlite3_log() containing the current value of
|
** It logs a message using sqlite3_log() containing the current value of
|
||||||
** error code and, if possible, the human-readable equivalent from
|
** error code and, if possible, the human-readable equivalent from
|
||||||
** FormatMessage.
|
** FormatMessage.
|
||||||
**
|
**
|
||||||
** The first argument passed to the macro should be the error code that
|
** The first argument passed to the macro should be the error code that
|
||||||
** will be returned to SQLite (e.g. SQLITE_IOERR_DELETE, SQLITE_CANTOPEN).
|
** will be returned to SQLite (e.g. SQLITE_IOERR_DELETE, SQLITE_CANTOPEN).
|
||||||
** The two subsequent arguments should be the name of the OS function that
|
** The two subsequent arguments should be the name of the OS function that
|
||||||
** failed and the associated file-system path, if any.
|
** failed and the associated file-system path, if any.
|
||||||
*/
|
*/
|
||||||
@@ -1834,7 +1843,7 @@ static int winLogErrorAtLine(
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
** The number of times that a ReadFile(), WriteFile(), and DeleteFile()
|
** The number of times that a ReadFile(), WriteFile(), and DeleteFile()
|
||||||
** will be retried following a locking error - probably caused by
|
** will be retried following a locking error - probably caused by
|
||||||
** antivirus software. Also the initial delay before the first retry.
|
** antivirus software. Also the initial delay before the first retry.
|
||||||
** The delay increases linearly with each retry.
|
** The delay increases linearly with each retry.
|
||||||
*/
|
*/
|
||||||
@@ -1909,7 +1918,7 @@ static int winRetryIoerr(int *pnRetry, DWORD *pError){
|
|||||||
*/
|
*/
|
||||||
static void winLogIoerr(int nRetry){
|
static void winLogIoerr(int nRetry){
|
||||||
if( nRetry ){
|
if( nRetry ){
|
||||||
sqlite3_log(SQLITE_IOERR,
|
sqlite3_log(SQLITE_IOERR,
|
||||||
"delayed %dms for lock/sharing conflict",
|
"delayed %dms for lock/sharing conflict",
|
||||||
winIoerrRetryDelay*nRetry*(nRetry+1)/2
|
winIoerrRetryDelay*nRetry*(nRetry+1)/2
|
||||||
);
|
);
|
||||||
@@ -2003,17 +2012,17 @@ static int winceCreateLock(const char *zFilename, winFile *pFile){
|
|||||||
|
|
||||||
/* Acquire the mutex before continuing */
|
/* Acquire the mutex before continuing */
|
||||||
winceMutexAcquire(pFile->hMutex);
|
winceMutexAcquire(pFile->hMutex);
|
||||||
|
|
||||||
/* Since the names of named mutexes, semaphores, file mappings etc are
|
/* Since the names of named mutexes, semaphores, file mappings etc are
|
||||||
** case-sensitive, take advantage of that by uppercasing the mutex name
|
** case-sensitive, take advantage of that by uppercasing the mutex name
|
||||||
** and using that as the shared filemapping name.
|
** and using that as the shared filemapping name.
|
||||||
*/
|
*/
|
||||||
osCharUpperW(zName);
|
osCharUpperW(zName);
|
||||||
pFile->hShared = osCreateFileMappingW(INVALID_HANDLE_VALUE, NULL,
|
pFile->hShared = osCreateFileMappingW(INVALID_HANDLE_VALUE, NULL,
|
||||||
PAGE_READWRITE, 0, sizeof(winceLock),
|
PAGE_READWRITE, 0, sizeof(winceLock),
|
||||||
zName);
|
zName);
|
||||||
|
|
||||||
/* Set a flag that indicates we're the first to create the memory so it
|
/* Set a flag that indicates we're the first to create the memory so it
|
||||||
** must be zero-initialized */
|
** must be zero-initialized */
|
||||||
lastErrno = osGetLastError();
|
lastErrno = osGetLastError();
|
||||||
if (lastErrno == ERROR_ALREADY_EXISTS){
|
if (lastErrno == ERROR_ALREADY_EXISTS){
|
||||||
@@ -2024,7 +2033,7 @@ static int winceCreateLock(const char *zFilename, winFile *pFile){
|
|||||||
|
|
||||||
/* If we succeeded in making the shared memory handle, map it. */
|
/* If we succeeded in making the shared memory handle, map it. */
|
||||||
if( pFile->hShared ){
|
if( pFile->hShared ){
|
||||||
pFile->shared = (winceLock*)osMapViewOfFile(pFile->hShared,
|
pFile->shared = (winceLock*)osMapViewOfFile(pFile->hShared,
|
||||||
FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, sizeof(winceLock));
|
FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, sizeof(winceLock));
|
||||||
/* If mapping failed, close the shared memory handle and erase it */
|
/* If mapping failed, close the shared memory handle and erase it */
|
||||||
if( !pFile->shared ){
|
if( !pFile->shared ){
|
||||||
@@ -2050,7 +2059,7 @@ static int winceCreateLock(const char *zFilename, winFile *pFile){
|
|||||||
pFile->hMutex = NULL;
|
pFile->hMutex = NULL;
|
||||||
return SQLITE_IOERR;
|
return SQLITE_IOERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the shared memory if we're supposed to */
|
/* Initialize the shared memory if we're supposed to */
|
||||||
if( bInit ){
|
if( bInit ){
|
||||||
memset(pFile->shared, 0, sizeof(winceLock));
|
memset(pFile->shared, 0, sizeof(winceLock));
|
||||||
@@ -2088,13 +2097,13 @@ static void winceDestroyLock(winFile *pFile){
|
|||||||
osCloseHandle(pFile->hShared);
|
osCloseHandle(pFile->hShared);
|
||||||
|
|
||||||
/* Done with the mutex */
|
/* Done with the mutex */
|
||||||
winceMutexRelease(pFile->hMutex);
|
winceMutexRelease(pFile->hMutex);
|
||||||
osCloseHandle(pFile->hMutex);
|
osCloseHandle(pFile->hMutex);
|
||||||
pFile->hMutex = NULL;
|
pFile->hMutex = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** An implementation of the LockFile() API of Windows for CE
|
** An implementation of the LockFile() API of Windows for CE
|
||||||
*/
|
*/
|
||||||
static BOOL winceLockFile(
|
static BOOL winceLockFile(
|
||||||
@@ -2305,8 +2314,8 @@ static BOOL winUnlockFile(
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Move the current position of the file handle passed as the first
|
** Move the current position of the file handle passed as the first
|
||||||
** argument to offset iOffset within the file. If successful, return 0.
|
** argument to offset iOffset within the file. If successful, return 0.
|
||||||
** Otherwise, set pFile->lastErrno and return non-zero.
|
** Otherwise, set pFile->lastErrno and return non-zero.
|
||||||
*/
|
*/
|
||||||
static int winSeekFile(winFile *pFile, sqlite3_int64 iOffset){
|
static int winSeekFile(winFile *pFile, sqlite3_int64 iOffset){
|
||||||
@@ -2321,11 +2330,11 @@ static int winSeekFile(winFile *pFile, sqlite3_int64 iOffset){
|
|||||||
upperBits = (LONG)((iOffset>>32) & 0x7fffffff);
|
upperBits = (LONG)((iOffset>>32) & 0x7fffffff);
|
||||||
lowerBits = (LONG)(iOffset & 0xffffffff);
|
lowerBits = (LONG)(iOffset & 0xffffffff);
|
||||||
|
|
||||||
/* API oddity: If successful, SetFilePointer() returns a dword
|
/* API oddity: If successful, SetFilePointer() returns a dword
|
||||||
** containing the lower 32-bits of the new file-offset. Or, if it fails,
|
** containing the lower 32-bits of the new file-offset. Or, if it fails,
|
||||||
** it returns INVALID_SET_FILE_POINTER. However according to MSDN,
|
** it returns INVALID_SET_FILE_POINTER. However according to MSDN,
|
||||||
** INVALID_SET_FILE_POINTER may also be a valid new offset. So to determine
|
** INVALID_SET_FILE_POINTER may also be a valid new offset. So to determine
|
||||||
** whether an error has actually occurred, it is also necessary to call
|
** whether an error has actually occurred, it is also necessary to call
|
||||||
** GetLastError().
|
** GetLastError().
|
||||||
*/
|
*/
|
||||||
dwRet = osSetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN);
|
dwRet = osSetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN);
|
||||||
@@ -2408,7 +2417,7 @@ static int winClose(sqlite3_file *id){
|
|||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
while(
|
while(
|
||||||
osDeleteFileW(pFile->zDeleteOnClose)==0
|
osDeleteFileW(pFile->zDeleteOnClose)==0
|
||||||
&& osGetFileAttributesW(pFile->zDeleteOnClose)!=0xffffffff
|
&& osGetFileAttributesW(pFile->zDeleteOnClose)!=0xffffffff
|
||||||
&& cnt++ < WINCE_DELETION_ATTEMPTS
|
&& cnt++ < WINCE_DELETION_ATTEMPTS
|
||||||
){
|
){
|
||||||
sqlite3_win32_sleep(100); /* Wait a little before trying again */
|
sqlite3_win32_sleep(100); /* Wait a little before trying again */
|
||||||
@@ -3256,7 +3265,7 @@ static int winDeviceCharacteristics(sqlite3_file *id){
|
|||||||
((p->ctrlFlags & WINFILE_PSOW)?SQLITE_IOCAP_POWERSAFE_OVERWRITE:0);
|
((p->ctrlFlags & WINFILE_PSOW)?SQLITE_IOCAP_POWERSAFE_OVERWRITE:0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Windows will only let you create file view mappings
|
** Windows will only let you create file view mappings
|
||||||
** on allocation size granularity boundaries.
|
** on allocation size granularity boundaries.
|
||||||
** During sqlite3_os_init() we do a GetSystemInfo()
|
** During sqlite3_os_init() we do a GetSystemInfo()
|
||||||
@@ -3268,11 +3277,11 @@ static SYSTEM_INFO winSysInfo;
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
** Helper functions to obtain and relinquish the global mutex. The
|
** Helper functions to obtain and relinquish the global mutex. The
|
||||||
** global mutex is used to protect the winLockInfo objects used by
|
** global mutex is used to protect the winLockInfo objects used by
|
||||||
** this file, all of which may be shared by multiple threads.
|
** this file, all of which may be shared by multiple threads.
|
||||||
**
|
**
|
||||||
** Function winShmMutexHeld() is used to assert() that the global mutex
|
** Function winShmMutexHeld() is used to assert() that the global mutex
|
||||||
** is held when required. This function is only used as part of assert()
|
** is held when required. This function is only used as part of assert()
|
||||||
** statements. e.g.
|
** statements. e.g.
|
||||||
**
|
**
|
||||||
** winShmEnterMutex()
|
** winShmEnterMutex()
|
||||||
@@ -3302,10 +3311,10 @@ static int winShmMutexHeld(void) {
|
|||||||
** this object or while reading or writing the following fields:
|
** this object or while reading or writing the following fields:
|
||||||
**
|
**
|
||||||
** nRef
|
** nRef
|
||||||
** pNext
|
** pNext
|
||||||
**
|
**
|
||||||
** The following fields are read-only after the object is created:
|
** The following fields are read-only after the object is created:
|
||||||
**
|
**
|
||||||
** fid
|
** fid
|
||||||
** zFilename
|
** zFilename
|
||||||
**
|
**
|
||||||
@@ -3401,7 +3410,7 @@ static int winShmSystemLock(
|
|||||||
if( lockType == _SHM_WRLCK ) dwFlags |= LOCKFILE_EXCLUSIVE_LOCK;
|
if( lockType == _SHM_WRLCK ) dwFlags |= LOCKFILE_EXCLUSIVE_LOCK;
|
||||||
rc = winLockFile(&pFile->hFile.h, dwFlags, ofst, 0, nByte, 0);
|
rc = winLockFile(&pFile->hFile.h, dwFlags, ofst, 0, nByte, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( rc!= 0 ){
|
if( rc!= 0 ){
|
||||||
rc = SQLITE_OK;
|
rc = SQLITE_OK;
|
||||||
}else{
|
}else{
|
||||||
@@ -3497,7 +3506,7 @@ static int winOpenSharedMemory(winFile *pDbFd){
|
|||||||
}
|
}
|
||||||
pNew->zFilename = (char*)&pNew[1];
|
pNew->zFilename = (char*)&pNew[1];
|
||||||
sqlite3_snprintf(nName+15, pNew->zFilename, "%s-shm", pDbFd->zPath);
|
sqlite3_snprintf(nName+15, pNew->zFilename, "%s-shm", pDbFd->zPath);
|
||||||
sqlite3FileSuffix3(pDbFd->zPath, pNew->zFilename);
|
sqlite3FileSuffix3(pDbFd->zPath, pNew->zFilename);
|
||||||
|
|
||||||
/* Look to see if there is an existing winShmNode that can be used.
|
/* Look to see if there is an existing winShmNode that can be used.
|
||||||
** If no matching winShmNode currently exists, create a new one.
|
** If no matching winShmNode currently exists, create a new one.
|
||||||
@@ -3534,7 +3543,7 @@ static int winOpenSharedMemory(winFile *pDbFd){
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Check to see if another process is holding the dead-man switch.
|
/* Check to see if another process is holding the dead-man switch.
|
||||||
** If not, truncate the file to zero length.
|
** If not, truncate the file to zero length.
|
||||||
*/
|
*/
|
||||||
if( winShmSystemLock(pShmNode, _SHM_WRLCK, WIN_SHM_DMS, 1)==SQLITE_OK ){
|
if( winShmSystemLock(pShmNode, _SHM_WRLCK, WIN_SHM_DMS, 1)==SQLITE_OK ){
|
||||||
rc = winTruncate((sqlite3_file *)&pShmNode->hFile, 0);
|
rc = winTruncate((sqlite3_file *)&pShmNode->hFile, 0);
|
||||||
@@ -3563,7 +3572,7 @@ static int winOpenSharedMemory(winFile *pDbFd){
|
|||||||
** the cover of the winShmEnterMutex() mutex and the pointer from the
|
** the cover of the winShmEnterMutex() mutex and the pointer from the
|
||||||
** new (struct winShm) object to the pShmNode has been set. All that is
|
** new (struct winShm) object to the pShmNode has been set. All that is
|
||||||
** left to do is to link the new object into the linked list starting
|
** left to do is to link the new object into the linked list starting
|
||||||
** at pShmNode->pFirst. This must be done while holding the pShmNode->mutex
|
** at pShmNode->pFirst. This must be done while holding the pShmNode->mutex
|
||||||
** mutex.
|
** mutex.
|
||||||
*/
|
*/
|
||||||
sqlite3_mutex_enter(pShmNode->mutex);
|
sqlite3_mutex_enter(pShmNode->mutex);
|
||||||
@@ -3583,7 +3592,7 @@ shm_open_err:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Close a connection to shared-memory. Delete the underlying
|
** Close a connection to shared-memory. Delete the underlying
|
||||||
** storage if deleteFlag is true.
|
** storage if deleteFlag is true.
|
||||||
*/
|
*/
|
||||||
static int winShmUnmap(
|
static int winShmUnmap(
|
||||||
@@ -3672,7 +3681,7 @@ static int winShmLock(
|
|||||||
if( rc==SQLITE_OK ){
|
if( rc==SQLITE_OK ){
|
||||||
p->exclMask &= ~mask;
|
p->exclMask &= ~mask;
|
||||||
p->sharedMask &= ~mask;
|
p->sharedMask &= ~mask;
|
||||||
}
|
}
|
||||||
}else if( flags & SQLITE_SHM_SHARED ){
|
}else if( flags & SQLITE_SHM_SHARED ){
|
||||||
u16 allShared = 0; /* Union of locks held by connections other than "p" */
|
u16 allShared = 0; /* Union of locks held by connections other than "p" */
|
||||||
|
|
||||||
@@ -3711,7 +3720,7 @@ static int winShmLock(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the exclusive locks at the system level. Then if successful
|
/* Get the exclusive locks at the system level. Then if successful
|
||||||
** also mark the local connection as being locked.
|
** also mark the local connection as being locked.
|
||||||
*/
|
*/
|
||||||
@@ -3731,7 +3740,7 @@ static int winShmLock(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Implement a memory barrier or memory fence on shared memory.
|
** Implement a memory barrier or memory fence on shared memory.
|
||||||
**
|
**
|
||||||
** All loads and stores begun before the barrier must complete before
|
** All loads and stores begun before the barrier must complete before
|
||||||
** any load or store begun after the barrier.
|
** any load or store begun after the barrier.
|
||||||
@@ -3746,22 +3755,22 @@ static void winShmBarrier(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** This function is called to obtain a pointer to region iRegion of the
|
** This function is called to obtain a pointer to region iRegion of the
|
||||||
** shared-memory associated with the database file fd. Shared-memory regions
|
** shared-memory associated with the database file fd. Shared-memory regions
|
||||||
** are numbered starting from zero. Each shared-memory region is szRegion
|
** are numbered starting from zero. Each shared-memory region is szRegion
|
||||||
** bytes in size.
|
** bytes in size.
|
||||||
**
|
**
|
||||||
** If an error occurs, an error code is returned and *pp is set to NULL.
|
** If an error occurs, an error code is returned and *pp is set to NULL.
|
||||||
**
|
**
|
||||||
** Otherwise, if the isWrite parameter is 0 and the requested shared-memory
|
** Otherwise, if the isWrite parameter is 0 and the requested shared-memory
|
||||||
** region has not been allocated (by any client, including one running in a
|
** region has not been allocated (by any client, including one running in a
|
||||||
** separate process), then *pp is set to NULL and SQLITE_OK returned. If
|
** separate process), then *pp is set to NULL and SQLITE_OK returned. If
|
||||||
** isWrite is non-zero and the requested shared-memory region has not yet
|
** isWrite is non-zero and the requested shared-memory region has not yet
|
||||||
** been allocated, it is allocated by this function.
|
** been allocated, it is allocated by this function.
|
||||||
**
|
**
|
||||||
** If the shared-memory region has already been allocated or is allocated by
|
** If the shared-memory region has already been allocated or is allocated by
|
||||||
** this call as described above, then it is mapped into this processes
|
** this call as described above, then it is mapped into this processes
|
||||||
** address space (if it is not already), *pp is set to point to the mapped
|
** address space (if it is not already), *pp is set to point to the mapped
|
||||||
** memory and SQLITE_OK returned.
|
** memory and SQLITE_OK returned.
|
||||||
*/
|
*/
|
||||||
static int winShmMap(
|
static int winShmMap(
|
||||||
@@ -3833,17 +3842,17 @@ static int winShmMap(
|
|||||||
while( pShmNode->nRegion<=iRegion ){
|
while( pShmNode->nRegion<=iRegion ){
|
||||||
HANDLE hMap = NULL; /* file-mapping handle */
|
HANDLE hMap = NULL; /* file-mapping handle */
|
||||||
void *pMap = 0; /* Mapped memory region */
|
void *pMap = 0; /* Mapped memory region */
|
||||||
|
|
||||||
#if SQLITE_OS_WINRT
|
#if SQLITE_OS_WINRT
|
||||||
hMap = osCreateFileMappingFromApp(pShmNode->hFile.h,
|
hMap = osCreateFileMappingFromApp(pShmNode->hFile.h,
|
||||||
NULL, PAGE_READWRITE, nByte, NULL
|
NULL, PAGE_READWRITE, nByte, NULL
|
||||||
);
|
);
|
||||||
#elif defined(SQLITE_WIN32_HAS_WIDE)
|
#elif defined(SQLITE_WIN32_HAS_WIDE)
|
||||||
hMap = osCreateFileMappingW(pShmNode->hFile.h,
|
hMap = osCreateFileMappingW(pShmNode->hFile.h,
|
||||||
NULL, PAGE_READWRITE, 0, nByte, NULL
|
NULL, PAGE_READWRITE, 0, nByte, NULL
|
||||||
);
|
);
|
||||||
#elif defined(SQLITE_WIN32_HAS_ANSI)
|
#elif defined(SQLITE_WIN32_HAS_ANSI)
|
||||||
hMap = osCreateFileMappingA(pShmNode->hFile.h,
|
hMap = osCreateFileMappingA(pShmNode->hFile.h,
|
||||||
NULL, PAGE_READWRITE, 0, nByte, NULL
|
NULL, PAGE_READWRITE, 0, nByte, NULL
|
||||||
);
|
);
|
||||||
#endif
|
#endif
|
||||||
@@ -3940,14 +3949,14 @@ static int winUnmapfile(winFile *pFile){
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
** Memory map or remap the file opened by file-descriptor pFd (if the file
|
** Memory map or remap the file opened by file-descriptor pFd (if the file
|
||||||
** is already mapped, the existing mapping is replaced by the new). Or, if
|
** is already mapped, the existing mapping is replaced by the new). Or, if
|
||||||
** there already exists a mapping for this file, and there are still
|
** there already exists a mapping for this file, and there are still
|
||||||
** outstanding xFetch() references to it, this function is a no-op.
|
** outstanding xFetch() references to it, this function is a no-op.
|
||||||
**
|
**
|
||||||
** If parameter nByte is non-negative, then it is the requested size of
|
** If parameter nByte is non-negative, then it is the requested size of
|
||||||
** the mapping to create. Otherwise, if nByte is less than zero, then the
|
** the mapping to create. Otherwise, if nByte is less than zero, then the
|
||||||
** requested size is the size of the file on disk. The actual size of the
|
** requested size is the size of the file on disk. The actual size of the
|
||||||
** created mapping is either the requested size or the value configured
|
** created mapping is either the requested size or the value configured
|
||||||
** using SQLITE_FCNTL_MMAP_SIZE, whichever is smaller.
|
** using SQLITE_FCNTL_MMAP_SIZE, whichever is smaller.
|
||||||
**
|
**
|
||||||
** SQLITE_OK is returned if no error occurs (even if the mapping is not
|
** SQLITE_OK is returned if no error occurs (even if the mapping is not
|
||||||
@@ -3976,7 +3985,7 @@ static int winMapfile(winFile *pFd, sqlite3_int64 nByte){
|
|||||||
nMap = pFd->mmapSizeMax;
|
nMap = pFd->mmapSizeMax;
|
||||||
}
|
}
|
||||||
nMap &= ~(sqlite3_int64)(winSysInfo.dwPageSize - 1);
|
nMap &= ~(sqlite3_int64)(winSysInfo.dwPageSize - 1);
|
||||||
|
|
||||||
if( nMap==0 && pFd->mmapSize>0 ){
|
if( nMap==0 && pFd->mmapSize>0 ){
|
||||||
winUnmapfile(pFd);
|
winUnmapfile(pFd);
|
||||||
}
|
}
|
||||||
@@ -4048,7 +4057,7 @@ static int winMapfile(winFile *pFd, sqlite3_int64 nByte){
|
|||||||
** Finally, if an error does occur, return an SQLite error code. The final
|
** Finally, if an error does occur, return an SQLite error code. The final
|
||||||
** value of *pp is undefined in this case.
|
** value of *pp is undefined in this case.
|
||||||
**
|
**
|
||||||
** If this function does return a pointer, the caller must eventually
|
** If this function does return a pointer, the caller must eventually
|
||||||
** release the reference by calling winUnfetch().
|
** release the reference by calling winUnfetch().
|
||||||
*/
|
*/
|
||||||
static int winFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){
|
static int winFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){
|
||||||
@@ -4083,20 +4092,20 @@ static int winFetch(sqlite3_file *fd, i64 iOff, int nAmt, void **pp){
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** If the third argument is non-NULL, then this function releases a
|
** If the third argument is non-NULL, then this function releases a
|
||||||
** reference obtained by an earlier call to winFetch(). The second
|
** reference obtained by an earlier call to winFetch(). The second
|
||||||
** argument passed to this function must be the same as the corresponding
|
** argument passed to this function must be the same as the corresponding
|
||||||
** argument that was passed to the winFetch() invocation.
|
** argument that was passed to the winFetch() invocation.
|
||||||
**
|
**
|
||||||
** Or, if the third argument is NULL, then this function is being called
|
** Or, if the third argument is NULL, then this function is being called
|
||||||
** to inform the VFS layer that, according to POSIX, any existing mapping
|
** to inform the VFS layer that, according to POSIX, any existing mapping
|
||||||
** may now be invalid and should be unmapped.
|
** may now be invalid and should be unmapped.
|
||||||
*/
|
*/
|
||||||
static int winUnfetch(sqlite3_file *fd, i64 iOff, void *p){
|
static int winUnfetch(sqlite3_file *fd, i64 iOff, void *p){
|
||||||
#if SQLITE_MAX_MMAP_SIZE>0
|
#if SQLITE_MAX_MMAP_SIZE>0
|
||||||
winFile *pFd = (winFile*)fd; /* The underlying database file */
|
winFile *pFd = (winFile*)fd; /* The underlying database file */
|
||||||
|
|
||||||
/* If p==0 (unmap the entire file) then there must be no outstanding
|
/* If p==0 (unmap the entire file) then there must be no outstanding
|
||||||
** xFetch references. Or, if p!=0 (meaning it is an xFetch reference),
|
** xFetch references. Or, if p!=0 (meaning it is an xFetch reference),
|
||||||
** then there must be at least one outstanding. */
|
** then there must be at least one outstanding. */
|
||||||
assert( (p==0)==(pFd->nFetchOut==0) );
|
assert( (p==0)==(pFd->nFetchOut==0) );
|
||||||
@@ -4242,7 +4251,7 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){
|
|||||||
|
|
||||||
/* It's odd to simulate an io-error here, but really this is just
|
/* It's odd to simulate an io-error here, but really this is just
|
||||||
** using the io-error infrastructure to test that SQLite handles this
|
** using the io-error infrastructure to test that SQLite handles this
|
||||||
** function failing.
|
** function failing.
|
||||||
*/
|
*/
|
||||||
SimulateIOError( return SQLITE_IOERR );
|
SimulateIOError( return SQLITE_IOERR );
|
||||||
|
|
||||||
@@ -4424,7 +4433,7 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Check that the output buffer is large enough for the temporary file
|
** Check that the output buffer is large enough for the temporary file
|
||||||
** name in the following format:
|
** name in the following format:
|
||||||
**
|
**
|
||||||
** "<temporary_directory>/etilqs_XXXXXXXXXXXXXXX\0\0"
|
** "<temporary_directory>/etilqs_XXXXXXXXXXXXXXX\0\0"
|
||||||
@@ -4527,8 +4536,8 @@ static int winOpen(
|
|||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
int isOpenJournal = (isCreate && (
|
int isOpenJournal = (isCreate && (
|
||||||
eType==SQLITE_OPEN_MASTER_JOURNAL
|
eType==SQLITE_OPEN_MASTER_JOURNAL
|
||||||
|| eType==SQLITE_OPEN_MAIN_JOURNAL
|
|| eType==SQLITE_OPEN_MAIN_JOURNAL
|
||||||
|| eType==SQLITE_OPEN_WAL
|
|| eType==SQLITE_OPEN_WAL
|
||||||
));
|
));
|
||||||
#endif
|
#endif
|
||||||
@@ -4536,9 +4545,9 @@ static int winOpen(
|
|||||||
OSTRACE(("OPEN name=%s, pFile=%p, flags=%x, pOutFlags=%p\n",
|
OSTRACE(("OPEN name=%s, pFile=%p, flags=%x, pOutFlags=%p\n",
|
||||||
zUtf8Name, id, flags, pOutFlags));
|
zUtf8Name, id, flags, pOutFlags));
|
||||||
|
|
||||||
/* Check the following statements are true:
|
/* Check the following statements are true:
|
||||||
**
|
**
|
||||||
** (a) Exactly one of the READWRITE and READONLY flags must be set, and
|
** (a) Exactly one of the READWRITE and READONLY flags must be set, and
|
||||||
** (b) if CREATE is set, then READWRITE must also be set, and
|
** (b) if CREATE is set, then READWRITE must also be set, and
|
||||||
** (c) if EXCLUSIVE is set, then CREATE must also be set.
|
** (c) if EXCLUSIVE is set, then CREATE must also be set.
|
||||||
** (d) if DELETEONCLOSE is set, then CREATE must also be set.
|
** (d) if DELETEONCLOSE is set, then CREATE must also be set.
|
||||||
@@ -4548,7 +4557,7 @@ static int winOpen(
|
|||||||
assert(isExclusive==0 || isCreate);
|
assert(isExclusive==0 || isCreate);
|
||||||
assert(isDelete==0 || isCreate);
|
assert(isDelete==0 || isCreate);
|
||||||
|
|
||||||
/* The main DB, main journal, WAL file and master journal are never
|
/* The main DB, main journal, WAL file and master journal are never
|
||||||
** automatically deleted. Nor are they ever temporary files. */
|
** automatically deleted. Nor are they ever temporary files. */
|
||||||
assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_DB );
|
assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_DB );
|
||||||
assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_JOURNAL );
|
assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_JOURNAL );
|
||||||
@@ -4556,9 +4565,9 @@ static int winOpen(
|
|||||||
assert( (!isDelete && zName) || eType!=SQLITE_OPEN_WAL );
|
assert( (!isDelete && zName) || eType!=SQLITE_OPEN_WAL );
|
||||||
|
|
||||||
/* Assert that the upper layer has set one of the "file-type" flags. */
|
/* Assert that the upper layer has set one of the "file-type" flags. */
|
||||||
assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB
|
assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB
|
||||||
|| eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL
|
|| eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL
|
||||||
|| eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_MASTER_JOURNAL
|
|| eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_MASTER_JOURNAL
|
||||||
|| eType==SQLITE_OPEN_TRANSIENT_DB || eType==SQLITE_OPEN_WAL
|
|| eType==SQLITE_OPEN_TRANSIENT_DB || eType==SQLITE_OPEN_WAL
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -4573,8 +4582,8 @@ static int winOpen(
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* If the second argument to this function is NULL, generate a
|
/* If the second argument to this function is NULL, generate a
|
||||||
** temporary file name to use
|
** temporary file name to use
|
||||||
*/
|
*/
|
||||||
if( !zUtf8Name ){
|
if( !zUtf8Name ){
|
||||||
assert( isDelete && !isOpenJournal );
|
assert( isDelete && !isOpenJournal );
|
||||||
@@ -4614,8 +4623,8 @@ static int winOpen(
|
|||||||
dwDesiredAccess = GENERIC_READ;
|
dwDesiredAccess = GENERIC_READ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SQLITE_OPEN_EXCLUSIVE is used to make sure that a new file is
|
/* SQLITE_OPEN_EXCLUSIVE is used to make sure that a new file is
|
||||||
** created. SQLite doesn't use it to indicate "exclusive access"
|
** created. SQLite doesn't use it to indicate "exclusive access"
|
||||||
** as it is usually understood.
|
** as it is usually understood.
|
||||||
*/
|
*/
|
||||||
if( isExclusive ){
|
if( isExclusive ){
|
||||||
@@ -4704,7 +4713,7 @@ static int winOpen(
|
|||||||
sqlite3_free(zConverted);
|
sqlite3_free(zConverted);
|
||||||
sqlite3_free(zTmpname);
|
sqlite3_free(zTmpname);
|
||||||
if( isReadWrite && !isExclusive ){
|
if( isReadWrite && !isExclusive ){
|
||||||
return winOpen(pVfs, zName, id,
|
return winOpen(pVfs, zName, id,
|
||||||
((flags|SQLITE_OPEN_READONLY) &
|
((flags|SQLITE_OPEN_READONLY) &
|
||||||
~(SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE)),
|
~(SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE)),
|
||||||
pOutFlags);
|
pOutFlags);
|
||||||
@@ -4913,14 +4922,14 @@ static int winAccess(
|
|||||||
WIN32_FILE_ATTRIBUTE_DATA sAttrData;
|
WIN32_FILE_ATTRIBUTE_DATA sAttrData;
|
||||||
memset(&sAttrData, 0, sizeof(sAttrData));
|
memset(&sAttrData, 0, sizeof(sAttrData));
|
||||||
while( !(rc = osGetFileAttributesExW((LPCWSTR)zConverted,
|
while( !(rc = osGetFileAttributesExW((LPCWSTR)zConverted,
|
||||||
GetFileExInfoStandard,
|
GetFileExInfoStandard,
|
||||||
&sAttrData)) && winRetryIoerr(&cnt, &lastErrno) ){}
|
&sAttrData)) && winRetryIoerr(&cnt, &lastErrno) ){}
|
||||||
if( rc ){
|
if( rc ){
|
||||||
/* For an SQLITE_ACCESS_EXISTS query, treat a zero-length file
|
/* For an SQLITE_ACCESS_EXISTS query, treat a zero-length file
|
||||||
** as if it does not exist.
|
** as if it does not exist.
|
||||||
*/
|
*/
|
||||||
if( flags==SQLITE_ACCESS_EXISTS
|
if( flags==SQLITE_ACCESS_EXISTS
|
||||||
&& sAttrData.nFileSizeHigh==0
|
&& sAttrData.nFileSizeHigh==0
|
||||||
&& sAttrData.nFileSizeLow==0 ){
|
&& sAttrData.nFileSizeLow==0 ){
|
||||||
attr = INVALID_FILE_ATTRIBUTES;
|
attr = INVALID_FILE_ATTRIBUTES;
|
||||||
}else{
|
}else{
|
||||||
@@ -5019,7 +5028,7 @@ static int winFullPathname(
|
|||||||
int nFull, /* Size of output buffer in bytes */
|
int nFull, /* Size of output buffer in bytes */
|
||||||
char *zFull /* Output buffer */
|
char *zFull /* Output buffer */
|
||||||
){
|
){
|
||||||
|
|
||||||
#if defined(__CYGWIN__)
|
#if defined(__CYGWIN__)
|
||||||
SimulateIOError( return SQLITE_ERROR );
|
SimulateIOError( return SQLITE_ERROR );
|
||||||
UNUSED_PARAMETER(nFull);
|
UNUSED_PARAMETER(nFull);
|
||||||
@@ -5332,12 +5341,12 @@ int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */
|
|||||||
** epoch of noon in Greenwich on November 24, 4714 B.C according to the
|
** epoch of noon in Greenwich on November 24, 4714 B.C according to the
|
||||||
** proleptic Gregorian calendar.
|
** proleptic Gregorian calendar.
|
||||||
**
|
**
|
||||||
** On success, return SQLITE_OK. Return SQLITE_ERROR if the time and date
|
** On success, return SQLITE_OK. Return SQLITE_ERROR if the time and date
|
||||||
** cannot be found.
|
** cannot be found.
|
||||||
*/
|
*/
|
||||||
static int winCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *piNow){
|
static int winCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *piNow){
|
||||||
/* FILETIME structure is a 64-bit value representing the number of
|
/* FILETIME structure is a 64-bit value representing the number of
|
||||||
100-nanosecond intervals since January 1, 1601 (= JD 2305813.5).
|
100-nanosecond intervals since January 1, 1601 (= JD 2305813.5).
|
||||||
*/
|
*/
|
||||||
FILETIME ft;
|
FILETIME ft;
|
||||||
static const sqlite3_int64 winFiletimeEpoch = 23058135*(sqlite3_int64)8640000;
|
static const sqlite3_int64 winFiletimeEpoch = 23058135*(sqlite3_int64)8640000;
|
||||||
@@ -5345,7 +5354,7 @@ static int winCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *piNow){
|
|||||||
static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000;
|
static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000;
|
||||||
#endif
|
#endif
|
||||||
/* 2^32 - to avoid use of LL and warnings in gcc */
|
/* 2^32 - to avoid use of LL and warnings in gcc */
|
||||||
static const sqlite3_int64 max32BitValue =
|
static const sqlite3_int64 max32BitValue =
|
||||||
(sqlite3_int64)2000000000 + (sqlite3_int64)2000000000 +
|
(sqlite3_int64)2000000000 + (sqlite3_int64)2000000000 +
|
||||||
(sqlite3_int64)294967296;
|
(sqlite3_int64)294967296;
|
||||||
|
|
||||||
@@ -5361,7 +5370,7 @@ static int winCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *piNow){
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
*piNow = winFiletimeEpoch +
|
*piNow = winFiletimeEpoch +
|
||||||
((((sqlite3_int64)ft.dwHighDateTime)*max32BitValue) +
|
((((sqlite3_int64)ft.dwHighDateTime)*max32BitValue) +
|
||||||
(sqlite3_int64)ft.dwLowDateTime)/(sqlite3_int64)10000;
|
(sqlite3_int64)ft.dwLowDateTime)/(sqlite3_int64)10000;
|
||||||
|
|
||||||
#ifdef SQLITE_TEST
|
#ifdef SQLITE_TEST
|
||||||
@@ -5498,10 +5507,10 @@ int sqlite3_os_init(void){
|
|||||||
sqlite3_vfs_register(&winLongPathVfs, 0);
|
sqlite3_vfs_register(&winLongPathVfs, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return SQLITE_OK;
|
return SQLITE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sqlite3_os_end(void){
|
int sqlite3_os_end(void){
|
||||||
#if SQLITE_OS_WINRT
|
#if SQLITE_OS_WINRT
|
||||||
if( sleepObj!=NULL ){
|
if( sleepObj!=NULL ){
|
||||||
osCloseHandle(sleepObj);
|
osCloseHandle(sleepObj);
|
||||||
|
|||||||
Reference in New Issue
Block a user