Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(139)

Side by Side Diff: third_party/sqlite/src/src/os_win.c

Issue 2751253002: [sql] Import SQLite 3.17.0. (Closed)
Patch Set: also clang on Linux i386 Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/sqlite/src/src/os_win.h ('k') | third_party/sqlite/src/src/pager.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 ** 2004 May 22 2 ** 2004 May 22
3 ** 3 **
4 ** The author disclaims copyright to this source code. In place of 4 ** The author disclaims copyright to this source code. In place of
5 ** a legal notice, here is a blessing: 5 ** a legal notice, here is a blessing:
6 ** 6 **
7 ** May you do good and not evil. 7 ** May you do good and not evil.
8 ** May you find forgiveness for yourself and forgive others. 8 ** May you find forgiveness for yourself and forgive others.
9 ** May you share freely, never taking more than you give. 9 ** May you share freely, never taking more than you give.
10 ** 10 **
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 ** already available. 69 ** already available.
70 */ 70 */
71 #ifndef NTDDI_WIN8 71 #ifndef NTDDI_WIN8
72 # define NTDDI_WIN8 0x06020000 72 # define NTDDI_WIN8 0x06020000
73 #endif 73 #endif
74 74
75 #ifndef NTDDI_WINBLUE 75 #ifndef NTDDI_WINBLUE
76 # define NTDDI_WINBLUE 0x06030000 76 # define NTDDI_WINBLUE 0x06030000
77 #endif 77 #endif
78 78
79 #ifndef NTDDI_WINTHRESHOLD
80 # define NTDDI_WINTHRESHOLD 0x06040000
81 #endif
82
79 /* 83 /*
80 ** Check to see if the GetVersionEx[AW] functions are deprecated on the 84 ** Check to see if the GetVersionEx[AW] functions are deprecated on the
81 ** target system. GetVersionEx was first deprecated in Win8.1. 85 ** target system. GetVersionEx was first deprecated in Win8.1.
82 */ 86 */
83 #ifndef SQLITE_WIN32_GETVERSIONEX 87 #ifndef SQLITE_WIN32_GETVERSIONEX
84 # if defined(NTDDI_VERSION) && NTDDI_VERSION >= NTDDI_WINBLUE 88 # if defined(NTDDI_VERSION) && NTDDI_VERSION >= NTDDI_WINBLUE
85 # define SQLITE_WIN32_GETVERSIONEX 0 /* GetVersionEx() is deprecated */ 89 # define SQLITE_WIN32_GETVERSIONEX 0 /* GetVersionEx() is deprecated */
86 # else 90 # else
87 # define SQLITE_WIN32_GETVERSIONEX 1 /* GetVersionEx() is current */ 91 # define SQLITE_WIN32_GETVERSIONEX 1 /* GetVersionEx() is current */
88 # endif 92 # endif
89 #endif 93 #endif
90 94
91 /* 95 /*
96 ** Check to see if the CreateFileMappingA function is supported on the
97 ** target system. It is unavailable when using "mincore.lib" on Win10.
98 ** When compiling for Windows 10, always assume "mincore.lib" is in use.
99 */
100 #ifndef SQLITE_WIN32_CREATEFILEMAPPINGA
101 # if defined(NTDDI_VERSION) && NTDDI_VERSION >= NTDDI_WINTHRESHOLD
102 # define SQLITE_WIN32_CREATEFILEMAPPINGA 0
103 # else
104 # define SQLITE_WIN32_CREATEFILEMAPPINGA 1
105 # endif
106 #endif
107
108 /*
92 ** This constant should already be defined (in the "WinDef.h" SDK file). 109 ** This constant should already be defined (in the "WinDef.h" SDK file).
93 */ 110 */
94 #ifndef MAX_PATH 111 #ifndef MAX_PATH
95 # define MAX_PATH (260) 112 # define MAX_PATH (260)
96 #endif 113 #endif
97 114
98 /* 115 /*
99 ** Maximum pathname length (in chars) for Win32. This should normally be 116 ** Maximum pathname length (in chars) for Win32. This should normally be
100 ** MAX_PATH. 117 ** MAX_PATH.
101 */ 118 */
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 int nFetchOut; /* Number of outstanding xFetch references */ 284 int nFetchOut; /* Number of outstanding xFetch references */
268 HANDLE hMap; /* Handle for accessing memory mapping */ 285 HANDLE hMap; /* Handle for accessing memory mapping */
269 void *pMapRegion; /* Area memory mapped */ 286 void *pMapRegion; /* Area memory mapped */
270 sqlite3_int64 mmapSize; /* Usable size of mapped region */ 287 sqlite3_int64 mmapSize; /* Usable size of mapped region */
271 sqlite3_int64 mmapSizeActual; /* Actual size of mapped region */ 288 sqlite3_int64 mmapSizeActual; /* Actual size of mapped region */
272 sqlite3_int64 mmapSizeMax; /* Configured FCNTL_MMAP_SIZE value */ 289 sqlite3_int64 mmapSizeMax; /* Configured FCNTL_MMAP_SIZE value */
273 #endif 290 #endif
274 }; 291 };
275 292
276 /* 293 /*
294 ** The winVfsAppData structure is used for the pAppData member for all of the
295 ** Win32 VFS variants.
296 */
297 typedef struct winVfsAppData winVfsAppData;
298 struct winVfsAppData {
299 const sqlite3_io_methods *pMethod; /* The file I/O methods to use. */
300 void *pAppData; /* The extra pAppData, if any. */
301 BOOL bNoLock; /* Non-zero if locking is disabled. */
302 };
303
304 /*
277 ** Allowed values for winFile.ctrlFlags 305 ** Allowed values for winFile.ctrlFlags
278 */ 306 */
279 #define WINFILE_RDONLY 0x02 /* Connection is read only */ 307 #define WINFILE_RDONLY 0x02 /* Connection is read only */
280 #define WINFILE_PERSIST_WAL 0x04 /* Persistent WAL mode */ 308 #define WINFILE_PERSIST_WAL 0x04 /* Persistent WAL mode */
281 #define WINFILE_PSOW 0x10 /* SQLITE_IOCAP_POWERSAFE_OVERWRITE */ 309 #define WINFILE_PSOW 0x10 /* SQLITE_IOCAP_POWERSAFE_OVERWRITE */
282 310
283 /* 311 /*
284 * The size of the buffer used by sqlite3_win32_write_debug(). 312 * The size of the buffer used by sqlite3_win32_write_debug().
285 */ 313 */
286 #ifndef SQLITE_WIN32_DBG_BUF_SIZE 314 #ifndef SQLITE_WIN32_DBG_BUF_SIZE
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 * function), all data that was allocated using the isolated heap will 349 * function), all data that was allocated using the isolated heap will
322 * be freed immediately and any attempt to access any of that freed 350 * be freed immediately and any attempt to access any of that freed
323 * data will almost certainly result in an immediate access violation. 351 * data will almost certainly result in an immediate access violation.
324 ****************************************************************************** 352 ******************************************************************************
325 */ 353 */
326 #ifndef SQLITE_WIN32_HEAP_CREATE 354 #ifndef SQLITE_WIN32_HEAP_CREATE
327 # define SQLITE_WIN32_HEAP_CREATE (TRUE) 355 # define SQLITE_WIN32_HEAP_CREATE (TRUE)
328 #endif 356 #endif
329 357
330 /* 358 /*
359 * This is cache size used in the calculation of the initial size of the
360 * Win32-specific heap. It cannot be negative.
361 */
362 #ifndef SQLITE_WIN32_CACHE_SIZE
363 # if SQLITE_DEFAULT_CACHE_SIZE>=0
364 # define SQLITE_WIN32_CACHE_SIZE (SQLITE_DEFAULT_CACHE_SIZE)
365 # else
366 # define SQLITE_WIN32_CACHE_SIZE (-(SQLITE_DEFAULT_CACHE_SIZE))
367 # endif
368 #endif
369
370 /*
331 * The initial size of the Win32-specific heap. This value may be zero. 371 * The initial size of the Win32-specific heap. This value may be zero.
332 */ 372 */
333 #ifndef SQLITE_WIN32_HEAP_INIT_SIZE 373 #ifndef SQLITE_WIN32_HEAP_INIT_SIZE
334 # define SQLITE_WIN32_HEAP_INIT_SIZE ((SQLITE_DEFAULT_CACHE_SIZE) * \ 374 # define SQLITE_WIN32_HEAP_INIT_SIZE ((SQLITE_WIN32_CACHE_SIZE) * \
335 (SQLITE_DEFAULT_PAGE_SIZE) + 4194304) 375 (SQLITE_DEFAULT_PAGE_SIZE) + 4194304)
336 #endif 376 #endif
337 377
338 /* 378 /*
339 * The maximum size of the Win32-specific heap. This value may be zero. 379 * The maximum size of the Win32-specific heap. This value may be zero.
340 */ 380 */
341 #ifndef SQLITE_WIN32_HEAP_MAX_SIZE 381 #ifndef SQLITE_WIN32_HEAP_MAX_SIZE
342 # define SQLITE_WIN32_HEAP_MAX_SIZE (0) 382 # define SQLITE_WIN32_HEAP_MAX_SIZE (0)
343 #endif 383 #endif
344 384
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
487 527
488 #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) 528 #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE)
489 { "CreateFileW", (SYSCALL)CreateFileW, 0 }, 529 { "CreateFileW", (SYSCALL)CreateFileW, 0 },
490 #else 530 #else
491 { "CreateFileW", (SYSCALL)0, 0 }, 531 { "CreateFileW", (SYSCALL)0, 0 },
492 #endif 532 #endif
493 533
494 #define osCreateFileW ((HANDLE(WINAPI*)(LPCWSTR,DWORD,DWORD, \ 534 #define osCreateFileW ((HANDLE(WINAPI*)(LPCWSTR,DWORD,DWORD, \
495 LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))aSyscall[5].pCurrent) 535 LPSECURITY_ATTRIBUTES,DWORD,DWORD,HANDLE))aSyscall[5].pCurrent)
496 536
497 #if (!SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_ANSI) && \ 537 #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_ANSI) && \
498 (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0)) 538 (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0) && \
539 SQLITE_WIN32_CREATEFILEMAPPINGA
499 { "CreateFileMappingA", (SYSCALL)CreateFileMappingA, 0 }, 540 { "CreateFileMappingA", (SYSCALL)CreateFileMappingA, 0 },
500 #else 541 #else
501 { "CreateFileMappingA", (SYSCALL)0, 0 }, 542 { "CreateFileMappingA", (SYSCALL)0, 0 },
502 #endif 543 #endif
503 544
504 #define osCreateFileMappingA ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \ 545 #define osCreateFileMappingA ((HANDLE(WINAPI*)(HANDLE,LPSECURITY_ATTRIBUTES, \
505 DWORD,DWORD,DWORD,LPCSTR))aSyscall[6].pCurrent) 546 DWORD,DWORD,DWORD,LPCSTR))aSyscall[6].pCurrent)
506 547
507 #if SQLITE_OS_WINCE || (!SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \ 548 #if SQLITE_OS_WINCE || (!SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \
508 (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0)) 549 (!defined(SQLITE_OMIT_WAL) || SQLITE_MAX_MMAP_SIZE>0))
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 #define osGetTempPathW ((DWORD(WINAPI*)(DWORD,LPWSTR))aSyscall[32].pCurrent) 759 #define osGetTempPathW ((DWORD(WINAPI*)(DWORD,LPWSTR))aSyscall[32].pCurrent)
719 760
720 #if !SQLITE_OS_WINRT 761 #if !SQLITE_OS_WINRT
721 { "GetTickCount", (SYSCALL)GetTickCount, 0 }, 762 { "GetTickCount", (SYSCALL)GetTickCount, 0 },
722 #else 763 #else
723 { "GetTickCount", (SYSCALL)0, 0 }, 764 { "GetTickCount", (SYSCALL)0, 0 },
724 #endif 765 #endif
725 766
726 #define osGetTickCount ((DWORD(WINAPI*)(VOID))aSyscall[33].pCurrent) 767 #define osGetTickCount ((DWORD(WINAPI*)(VOID))aSyscall[33].pCurrent)
727 768
728 #if defined(SQLITE_WIN32_HAS_ANSI) && defined(SQLITE_WIN32_GETVERSIONEX) && \ 769 #if defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_GETVERSIONEX
729 SQLITE_WIN32_GETVERSIONEX
730 { "GetVersionExA", (SYSCALL)GetVersionExA, 0 }, 770 { "GetVersionExA", (SYSCALL)GetVersionExA, 0 },
731 #else 771 #else
732 { "GetVersionExA", (SYSCALL)0, 0 }, 772 { "GetVersionExA", (SYSCALL)0, 0 },
733 #endif 773 #endif
734 774
735 #define osGetVersionExA ((BOOL(WINAPI*)( \ 775 #define osGetVersionExA ((BOOL(WINAPI*)( \
736 LPOSVERSIONINFOA))aSyscall[34].pCurrent) 776 LPOSVERSIONINFOA))aSyscall[34].pCurrent)
737 777
738 #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \ 778 #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_HAS_WIDE) && \
739 defined(SQLITE_WIN32_GETVERSIONEX) && SQLITE_WIN32_GETVERSIONEX 779 SQLITE_WIN32_GETVERSIONEX
740 { "GetVersionExW", (SYSCALL)GetVersionExW, 0 }, 780 { "GetVersionExW", (SYSCALL)GetVersionExW, 0 },
741 #else 781 #else
742 { "GetVersionExW", (SYSCALL)0, 0 }, 782 { "GetVersionExW", (SYSCALL)0, 0 },
743 #endif 783 #endif
744 784
745 #define osGetVersionExW ((BOOL(WINAPI*)( \ 785 #define osGetVersionExW ((BOOL(WINAPI*)( \
746 LPOSVERSIONINFOW))aSyscall[35].pCurrent) 786 LPOSVERSIONINFOW))aSyscall[35].pCurrent)
747 787
748 { "HeapAlloc", (SYSCALL)HeapAlloc, 0 }, 788 { "HeapAlloc", (SYSCALL)HeapAlloc, 0 },
749 789
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after
1198 assert( hHeap!=INVALID_HANDLE_VALUE ); 1238 assert( hHeap!=INVALID_HANDLE_VALUE );
1199 #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) 1239 #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE)
1200 assert( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); 1240 assert( osHeapValidate(hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) );
1201 #endif 1241 #endif
1202 #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT 1242 #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT
1203 if( (nLargest=osHeapCompact(hHeap, SQLITE_WIN32_HEAP_FLAGS))==0 ){ 1243 if( (nLargest=osHeapCompact(hHeap, SQLITE_WIN32_HEAP_FLAGS))==0 ){
1204 DWORD lastErrno = osGetLastError(); 1244 DWORD lastErrno = osGetLastError();
1205 if( lastErrno==NO_ERROR ){ 1245 if( lastErrno==NO_ERROR ){
1206 sqlite3_log(SQLITE_NOMEM, "failed to HeapCompact (no space), heap=%p", 1246 sqlite3_log(SQLITE_NOMEM, "failed to HeapCompact (no space), heap=%p",
1207 (void*)hHeap); 1247 (void*)hHeap);
1208 rc = SQLITE_NOMEM; 1248 rc = SQLITE_NOMEM_BKPT;
1209 }else{ 1249 }else{
1210 sqlite3_log(SQLITE_ERROR, "failed to HeapCompact (%lu), heap=%p", 1250 sqlite3_log(SQLITE_ERROR, "failed to HeapCompact (%lu), heap=%p",
1211 osGetLastError(), (void*)hHeap); 1251 osGetLastError(), (void*)hHeap);
1212 rc = SQLITE_ERROR; 1252 rc = SQLITE_ERROR;
1213 } 1253 }
1214 } 1254 }
1215 #else 1255 #else
1216 sqlite3_log(SQLITE_NOTFOUND, "failed to HeapCompact, heap=%p", 1256 sqlite3_log(SQLITE_NOTFOUND, "failed to HeapCompact, heap=%p",
1217 (void*)hHeap); 1257 (void*)hHeap);
1218 rc = SQLITE_NOTFOUND; 1258 rc = SQLITE_NOTFOUND;
1219 #endif 1259 #endif
1220 if( pnLargest ) *pnLargest = nLargest; 1260 if( pnLargest ) *pnLargest = nLargest;
1221 return rc; 1261 return rc;
1222 } 1262 }
1223 1263
1224 /* 1264 /*
1225 ** If a Win32 native heap has been configured, this function will attempt to 1265 ** If a Win32 native heap has been configured, this function will attempt to
1226 ** destroy and recreate it. If the Win32 native heap is not isolated and/or 1266 ** destroy and recreate it. If the Win32 native heap is not isolated and/or
1227 ** the sqlite3_memory_used() function does not return zero, SQLITE_BUSY will 1267 ** the sqlite3_memory_used() function does not return zero, SQLITE_BUSY will
1228 ** be returned and no changes will be made to the Win32 native heap. 1268 ** be returned and no changes will be made to the Win32 native heap.
1229 */ 1269 */
1230 int sqlite3_win32_reset_heap(){ 1270 int sqlite3_win32_reset_heap(){
1231 int rc; 1271 int rc;
1232 MUTEX_LOGIC( sqlite3_mutex *pMaster; ) /* The main static mutex */ 1272 MUTEX_LOGIC( sqlite3_mutex *pMaster; ) /* The main static mutex */
1233 MUTEX_LOGIC( sqlite3_mutex *pMem; ) /* The memsys static mutex */ 1273 MUTEX_LOGIC( sqlite3_mutex *pMem; ) /* The memsys static mutex */
1234 MUTEX_LOGIC( pMaster = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); ) 1274 MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); )
1235 MUTEX_LOGIC( pMem = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MEM); ) 1275 MUTEX_LOGIC( pMem = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MEM); )
1236 sqlite3_mutex_enter(pMaster); 1276 sqlite3_mutex_enter(pMaster);
1237 sqlite3_mutex_enter(pMem); 1277 sqlite3_mutex_enter(pMem);
1238 winMemAssertMagic(); 1278 winMemAssertMagic();
1239 if( winMemGetHeap()!=NULL && winMemGetOwned() && sqlite3_memory_used()==0 ){ 1279 if( winMemGetHeap()!=NULL && winMemGetOwned() && sqlite3_memory_used()==0 ){
1240 /* 1280 /*
1241 ** At this point, there should be no outstanding memory allocations on 1281 ** At this point, there should be no outstanding memory allocations on
1242 ** the heap. Also, since both the master and memsys locks are currently 1282 ** the heap. Also, since both the master and memsys locks are currently
1243 ** being held by us, no other function (i.e. from another thread) should 1283 ** being held by us, no other function (i.e. from another thread) should
1244 ** be able to even access the heap. Attempt to destroy and recreate our 1284 ** be able to even access the heap. Attempt to destroy and recreate our
1245 ** isolated Win32 native heap now. 1285 ** isolated Win32 native heap now.
(...skipping 24 matching lines...) Expand all
1270 /* 1310 /*
1271 ** This function outputs the specified (ANSI) string to the Win32 debugger 1311 ** This function outputs the specified (ANSI) string to the Win32 debugger
1272 ** (if available). 1312 ** (if available).
1273 */ 1313 */
1274 1314
1275 void sqlite3_win32_write_debug(const char *zBuf, int nBuf){ 1315 void sqlite3_win32_write_debug(const char *zBuf, int nBuf){
1276 char zDbgBuf[SQLITE_WIN32_DBG_BUF_SIZE]; 1316 char zDbgBuf[SQLITE_WIN32_DBG_BUF_SIZE];
1277 int nMin = MIN(nBuf, (SQLITE_WIN32_DBG_BUF_SIZE - 1)); /* may be negative. */ 1317 int nMin = MIN(nBuf, (SQLITE_WIN32_DBG_BUF_SIZE - 1)); /* may be negative. */
1278 if( nMin<-1 ) nMin = -1; /* all negative values become -1. */ 1318 if( nMin<-1 ) nMin = -1; /* all negative values become -1. */
1279 assert( nMin==-1 || nMin==0 || nMin<SQLITE_WIN32_DBG_BUF_SIZE ); 1319 assert( nMin==-1 || nMin==0 || nMin<SQLITE_WIN32_DBG_BUF_SIZE );
1320 #ifdef SQLITE_ENABLE_API_ARMOR
1321 if( !zBuf ){
1322 (void)SQLITE_MISUSE_BKPT;
1323 return;
1324 }
1325 #endif
1280 #if defined(SQLITE_WIN32_HAS_ANSI) 1326 #if defined(SQLITE_WIN32_HAS_ANSI)
1281 if( nMin>0 ){ 1327 if( nMin>0 ){
1282 memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE); 1328 memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE);
1283 memcpy(zDbgBuf, zBuf, nMin); 1329 memcpy(zDbgBuf, zBuf, nMin);
1284 osOutputDebugStringA(zDbgBuf); 1330 osOutputDebugStringA(zDbgBuf);
1285 }else{ 1331 }else{
1286 osOutputDebugStringA(zBuf); 1332 osOutputDebugStringA(zBuf);
1287 } 1333 }
1288 #elif defined(SQLITE_WIN32_HAS_WIDE) 1334 #elif defined(SQLITE_WIN32_HAS_WIDE)
1289 memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE); 1335 memset(zDbgBuf, 0, SQLITE_WIN32_DBG_BUF_SIZE);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1340 ** or WinCE. Return false (zero) for Win95, Win98, or WinME. 1386 ** or WinCE. Return false (zero) for Win95, Win98, or WinME.
1341 ** 1387 **
1342 ** Here is an interesting observation: Win95, Win98, and WinME lack 1388 ** Here is an interesting observation: Win95, Win98, and WinME lack
1343 ** the LockFileEx() API. But we can still statically link against that 1389 ** the LockFileEx() API. But we can still statically link against that
1344 ** API as long as we don't call it when running Win95/98/ME. A call to 1390 ** API as long as we don't call it when running Win95/98/ME. A call to
1345 ** this routine is used to determine if the host is Win95/98/ME or 1391 ** this routine is used to determine if the host is Win95/98/ME or
1346 ** WinNT/2K/XP so that we will know whether or not we can safely call 1392 ** WinNT/2K/XP so that we will know whether or not we can safely call
1347 ** the LockFileEx() API. 1393 ** the LockFileEx() API.
1348 */ 1394 */
1349 1395
1350 #if !defined(SQLITE_WIN32_GETVERSIONEX) || !SQLITE_WIN32_GETVERSIONEX 1396 #if !SQLITE_WIN32_GETVERSIONEX
1351 # define osIsNT() (1) 1397 # define osIsNT() (1)
1352 #elif SQLITE_OS_WINCE || SQLITE_OS_WINRT || !defined(SQLITE_WIN32_HAS_ANSI) 1398 #elif SQLITE_OS_WINCE || SQLITE_OS_WINRT || !defined(SQLITE_WIN32_HAS_ANSI)
1353 # define osIsNT() (1) 1399 # define osIsNT() (1)
1354 #elif !defined(SQLITE_WIN32_HAS_WIDE) 1400 #elif !defined(SQLITE_WIN32_HAS_WIDE)
1355 # define osIsNT() (0) 1401 # define osIsNT() (0)
1356 #else 1402 #else
1357 # define osIsNT() ((sqlite3_os_type==2) || sqlite3_win32_is_nt()) 1403 # define osIsNT() ((sqlite3_os_type==2) || sqlite3_win32_is_nt())
1358 #endif 1404 #endif
1359 1405
1360 /* 1406 /*
1361 ** This function determines if the machine is running a version of Windows 1407 ** This function determines if the machine is running a version of Windows
1362 ** based on the NT kernel. 1408 ** based on the NT kernel.
1363 */ 1409 */
1364 int sqlite3_win32_is_nt(void){ 1410 int sqlite3_win32_is_nt(void){
1365 #if SQLITE_OS_WINRT 1411 #if SQLITE_OS_WINRT
1366 /* 1412 /*
1367 ** NOTE: The WinRT sub-platform is always assumed to be based on the NT 1413 ** NOTE: The WinRT sub-platform is always assumed to be based on the NT
1368 ** kernel. 1414 ** kernel.
1369 */ 1415 */
1370 return 1; 1416 return 1;
1371 #elif defined(SQLITE_WIN32_GETVERSIONEX) && SQLITE_WIN32_GETVERSIONEX 1417 #elif SQLITE_WIN32_GETVERSIONEX
1372 if( osInterlockedCompareExchange(&sqlite3_os_type, 0, 0)==0 ){ 1418 if( osInterlockedCompareExchange(&sqlite3_os_type, 0, 0)==0 ){
1373 #if defined(SQLITE_WIN32_HAS_ANSI) 1419 #if defined(SQLITE_WIN32_HAS_ANSI)
1374 OSVERSIONINFOA sInfo; 1420 OSVERSIONINFOA sInfo;
1375 sInfo.dwOSVersionInfoSize = sizeof(sInfo); 1421 sInfo.dwOSVersionInfoSize = sizeof(sInfo);
1376 osGetVersionExA(&sInfo); 1422 osGetVersionExA(&sInfo);
1377 osInterlockedCompareExchange(&sqlite3_os_type, 1423 osInterlockedCompareExchange(&sqlite3_os_type,
1378 (sInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) ? 2 : 1, 0); 1424 (sInfo.dwPlatformId == VER_PLATFORM_WIN32_NT) ? 2 : 1, 0);
1379 #elif defined(SQLITE_WIN32_HAS_WIDE) 1425 #elif defined(SQLITE_WIN32_HAS_WIDE)
1380 OSVERSIONINFOW sInfo; 1426 OSVERSIONINFOW sInfo;
1381 sInfo.dwOSVersionInfoSize = sizeof(sInfo); 1427 sInfo.dwOSVersionInfoSize = sizeof(sInfo);
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
1518 }else if( dwInitialSize>dwMaximumSize ){ 1564 }else if( dwInitialSize>dwMaximumSize ){
1519 dwInitialSize = dwMaximumSize; 1565 dwInitialSize = dwMaximumSize;
1520 } 1566 }
1521 pWinMemData->hHeap = osHeapCreate(SQLITE_WIN32_HEAP_FLAGS, 1567 pWinMemData->hHeap = osHeapCreate(SQLITE_WIN32_HEAP_FLAGS,
1522 dwInitialSize, dwMaximumSize); 1568 dwInitialSize, dwMaximumSize);
1523 if( !pWinMemData->hHeap ){ 1569 if( !pWinMemData->hHeap ){
1524 sqlite3_log(SQLITE_NOMEM, 1570 sqlite3_log(SQLITE_NOMEM,
1525 "failed to HeapCreate (%lu), flags=%u, initSize=%lu, maxSize=%lu", 1571 "failed to HeapCreate (%lu), flags=%u, initSize=%lu, maxSize=%lu",
1526 osGetLastError(), SQLITE_WIN32_HEAP_FLAGS, dwInitialSize, 1572 osGetLastError(), SQLITE_WIN32_HEAP_FLAGS, dwInitialSize,
1527 dwMaximumSize); 1573 dwMaximumSize);
1528 return SQLITE_NOMEM; 1574 return SQLITE_NOMEM_BKPT;
1529 } 1575 }
1530 pWinMemData->bOwned = TRUE; 1576 pWinMemData->bOwned = TRUE;
1531 assert( pWinMemData->bOwned ); 1577 assert( pWinMemData->bOwned );
1532 } 1578 }
1533 #else 1579 #else
1534 pWinMemData->hHeap = osGetProcessHeap(); 1580 pWinMemData->hHeap = osGetProcessHeap();
1535 if( !pWinMemData->hHeap ){ 1581 if( !pWinMemData->hHeap ){
1536 sqlite3_log(SQLITE_NOMEM, 1582 sqlite3_log(SQLITE_NOMEM,
1537 "failed to GetProcessHeap (%lu)", osGetLastError()); 1583 "failed to GetProcessHeap (%lu)", osGetLastError());
1538 return SQLITE_NOMEM; 1584 return SQLITE_NOMEM_BKPT;
1539 } 1585 }
1540 pWinMemData->bOwned = FALSE; 1586 pWinMemData->bOwned = FALSE;
1541 assert( !pWinMemData->bOwned ); 1587 assert( !pWinMemData->bOwned );
1542 #endif 1588 #endif
1543 assert( pWinMemData->hHeap!=0 ); 1589 assert( pWinMemData->hHeap!=0 );
1544 assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE ); 1590 assert( pWinMemData->hHeap!=INVALID_HANDLE_VALUE );
1545 #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE) 1591 #if !SQLITE_OS_WINRT && defined(SQLITE_WIN32_MALLOC_VALIDATE)
1546 assert( osHeapValidate(pWinMemData->hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) ); 1592 assert( osHeapValidate(pWinMemData->hHeap, SQLITE_WIN32_HEAP_FLAGS, NULL) );
1547 #endif 1593 #endif
1548 return SQLITE_OK; 1594 return SQLITE_OK;
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
1595 }; 1641 };
1596 return &winMemMethods; 1642 return &winMemMethods;
1597 } 1643 }
1598 1644
1599 void sqlite3MemSetDefault(void){ 1645 void sqlite3MemSetDefault(void){
1600 sqlite3_config(SQLITE_CONFIG_MALLOC, sqlite3MemGetWin32()); 1646 sqlite3_config(SQLITE_CONFIG_MALLOC, sqlite3MemGetWin32());
1601 } 1647 }
1602 #endif /* SQLITE_WIN32_MALLOC */ 1648 #endif /* SQLITE_WIN32_MALLOC */
1603 1649
1604 /* 1650 /*
1605 ** Convert a UTF-8 string to Microsoft Unicode (UTF-16?). 1651 ** Convert a UTF-8 string to Microsoft Unicode.
1606 ** 1652 **
1607 ** Space to hold the returned string is obtained from malloc. 1653 ** Space to hold the returned string is obtained from sqlite3_malloc().
1608 */ 1654 */
1609 static LPWSTR winUtf8ToUnicode(const char *zFilename){ 1655 static LPWSTR winUtf8ToUnicode(const char *zText){
1610 int nChar; 1656 int nChar;
1611 LPWSTR zWideFilename; 1657 LPWSTR zWideText;
1612 1658
1613 nChar = osMultiByteToWideChar(CP_UTF8, 0, zFilename, -1, NULL, 0); 1659 nChar = osMultiByteToWideChar(CP_UTF8, 0, zText, -1, NULL, 0);
1614 if( nChar==0 ){ 1660 if( nChar==0 ){
1615 return 0; 1661 return 0;
1616 } 1662 }
1617 zWideFilename = sqlite3MallocZero( nChar*sizeof(zWideFilename[0]) ); 1663 zWideText = sqlite3MallocZero( nChar*sizeof(WCHAR) );
1618 if( zWideFilename==0 ){ 1664 if( zWideText==0 ){
1619 return 0; 1665 return 0;
1620 } 1666 }
1621 nChar = osMultiByteToWideChar(CP_UTF8, 0, zFilename, -1, zWideFilename, 1667 nChar = osMultiByteToWideChar(CP_UTF8, 0, zText, -1, zWideText,
1622 nChar); 1668 nChar);
1623 if( nChar==0 ){ 1669 if( nChar==0 ){
1624 sqlite3_free(zWideFilename); 1670 sqlite3_free(zWideText);
1625 zWideFilename = 0; 1671 zWideText = 0;
1626 } 1672 }
1627 return zWideFilename; 1673 return zWideText;
1628 } 1674 }
1629 1675
1630 /* 1676 /*
1631 ** Convert Microsoft Unicode to UTF-8. Space to hold the returned string is 1677 ** Convert a Microsoft Unicode string to UTF-8.
1632 ** obtained from sqlite3_malloc(). 1678 **
1633 */ 1679 ** Space to hold the returned string is obtained from sqlite3_malloc().
1634 static char *winUnicodeToUtf8(LPCWSTR zWideFilename){ 1680 */
1681 static char *winUnicodeToUtf8(LPCWSTR zWideText){
1635 int nByte; 1682 int nByte;
1636 char *zFilename; 1683 char *zText;
1637 1684
1638 nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, 0, 0, 0, 0); 1685 nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideText, -1, 0, 0, 0, 0);
1639 if( nByte == 0 ){ 1686 if( nByte == 0 ){
1640 return 0; 1687 return 0;
1641 } 1688 }
1642 zFilename = sqlite3MallocZero( nByte ); 1689 zText = sqlite3MallocZero( nByte );
1643 if( zFilename==0 ){ 1690 if( zText==0 ){
1644 return 0; 1691 return 0;
1645 } 1692 }
1646 nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, zFilename, nByte, 1693 nByte = osWideCharToMultiByte(CP_UTF8, 0, zWideText, -1, zText, nByte,
1647 0, 0); 1694 0, 0);
1648 if( nByte == 0 ){ 1695 if( nByte == 0 ){
1649 sqlite3_free(zFilename); 1696 sqlite3_free(zText);
1650 zFilename = 0; 1697 zText = 0;
1651 } 1698 }
1652 return zFilename; 1699 return zText;
1653 } 1700 }
1654 1701
1655 /* 1702 /*
1656 ** Convert an ANSI string to Microsoft Unicode, based on the 1703 ** Convert an ANSI string to Microsoft Unicode, using the ANSI or OEM
1657 ** current codepage settings for file apis. 1704 ** code page.
1658 ** 1705 **
1659 ** Space to hold the returned string is obtained 1706 ** Space to hold the returned string is obtained from sqlite3_malloc().
1660 ** from sqlite3_malloc. 1707 */
1661 */ 1708 static LPWSTR winMbcsToUnicode(const char *zText, int useAnsi){
1662 static LPWSTR winMbcsToUnicode(const char *zFilename){
1663 int nByte; 1709 int nByte;
1664 LPWSTR zMbcsFilename; 1710 LPWSTR zMbcsText;
1665 int codepage = osAreFileApisANSI() ? CP_ACP : CP_OEMCP; 1711 int codepage = useAnsi ? CP_ACP : CP_OEMCP;
1666 1712
1667 nByte = osMultiByteToWideChar(codepage, 0, zFilename, -1, NULL, 1713 nByte = osMultiByteToWideChar(codepage, 0, zText, -1, NULL,
1668 0)*sizeof(WCHAR); 1714 0)*sizeof(WCHAR);
1669 if( nByte==0 ){ 1715 if( nByte==0 ){
1670 return 0; 1716 return 0;
1671 } 1717 }
1672 zMbcsFilename = sqlite3MallocZero( nByte*sizeof(zMbcsFilename[0]) ); 1718 zMbcsText = sqlite3MallocZero( nByte*sizeof(WCHAR) );
1673 if( zMbcsFilename==0 ){ 1719 if( zMbcsText==0 ){
1674 return 0; 1720 return 0;
1675 } 1721 }
1676 nByte = osMultiByteToWideChar(codepage, 0, zFilename, -1, zMbcsFilename, 1722 nByte = osMultiByteToWideChar(codepage, 0, zText, -1, zMbcsText,
1677 nByte); 1723 nByte);
1678 if( nByte==0 ){ 1724 if( nByte==0 ){
1679 sqlite3_free(zMbcsFilename); 1725 sqlite3_free(zMbcsText);
1680 zMbcsFilename = 0; 1726 zMbcsText = 0;
1681 } 1727 }
1682 return zMbcsFilename; 1728 return zMbcsText;
1683 } 1729 }
1684 1730
1685 /* 1731 /*
1686 ** Convert Microsoft Unicode to multi-byte character string, based on the 1732 ** Convert a Microsoft Unicode string to a multi-byte character string,
1687 ** user's ANSI codepage. 1733 ** using the ANSI or OEM code page.
1688 ** 1734 **
1689 ** Space to hold the returned string is obtained from 1735 ** Space to hold the returned string is obtained from sqlite3_malloc().
1690 ** sqlite3_malloc(). 1736 */
1691 */ 1737 static char *winUnicodeToMbcs(LPCWSTR zWideText, int useAnsi){
1692 static char *winUnicodeToMbcs(LPCWSTR zWideFilename){
1693 int nByte; 1738 int nByte;
1694 char *zFilename; 1739 char *zText;
1695 int codepage = osAreFileApisANSI() ? CP_ACP : CP_OEMCP; 1740 int codepage = useAnsi ? CP_ACP : CP_OEMCP;
1696 1741
1697 nByte = osWideCharToMultiByte(codepage, 0, zWideFilename, -1, 0, 0, 0, 0); 1742 nByte = osWideCharToMultiByte(codepage, 0, zWideText, -1, 0, 0, 0, 0);
1698 if( nByte == 0 ){ 1743 if( nByte == 0 ){
1699 return 0; 1744 return 0;
1700 } 1745 }
1701 zFilename = sqlite3MallocZero( nByte ); 1746 zText = sqlite3MallocZero( nByte );
1702 if( zFilename==0 ){ 1747 if( zText==0 ){
1703 return 0; 1748 return 0;
1704 } 1749 }
1705 nByte = osWideCharToMultiByte(codepage, 0, zWideFilename, -1, zFilename, 1750 nByte = osWideCharToMultiByte(codepage, 0, zWideText, -1, zText,
1706 nByte, 0, 0); 1751 nByte, 0, 0);
1707 if( nByte == 0 ){ 1752 if( nByte == 0 ){
1708 sqlite3_free(zFilename); 1753 sqlite3_free(zText);
1709 zFilename = 0; 1754 zText = 0;
1710 } 1755 }
1711 return zFilename; 1756 return zText;
1712 } 1757 }
1713 1758
1714 /* 1759 /*
1715 ** Convert multibyte character string to UTF-8. Space to hold the 1760 ** Convert a multi-byte character string to UTF-8.
1716 ** returned string is obtained from sqlite3_malloc(). 1761 **
1717 */ 1762 ** Space to hold the returned string is obtained from sqlite3_malloc().
1718 char *sqlite3_win32_mbcs_to_utf8(const char *zFilename){ 1763 */
1719 char *zFilenameUtf8; 1764 static char *winMbcsToUtf8(const char *zText, int useAnsi){
1765 char *zTextUtf8;
1720 LPWSTR zTmpWide; 1766 LPWSTR zTmpWide;
1721 1767
1722 zTmpWide = winMbcsToUnicode(zFilename); 1768 zTmpWide = winMbcsToUnicode(zText, useAnsi);
1723 if( zTmpWide==0 ){ 1769 if( zTmpWide==0 ){
1724 return 0; 1770 return 0;
1725 } 1771 }
1726 zFilenameUtf8 = winUnicodeToUtf8(zTmpWide); 1772 zTextUtf8 = winUnicodeToUtf8(zTmpWide);
1727 sqlite3_free(zTmpWide); 1773 sqlite3_free(zTmpWide);
1728 return zFilenameUtf8; 1774 return zTextUtf8;
1729 } 1775 }
1730 1776
1731 /* 1777 /*
1732 ** Convert UTF-8 to multibyte character string. Space to hold the 1778 ** Convert a UTF-8 string to a multi-byte character string.
1733 ** returned string is obtained from sqlite3_malloc(). 1779 **
1734 */ 1780 ** Space to hold the returned string is obtained from sqlite3_malloc().
1735 char *sqlite3_win32_utf8_to_mbcs(const char *zFilename){ 1781 */
1736 char *zFilenameMbcs; 1782 static char *winUtf8ToMbcs(const char *zText, int useAnsi){
1783 char *zTextMbcs;
1737 LPWSTR zTmpWide; 1784 LPWSTR zTmpWide;
1738 1785
1739 zTmpWide = winUtf8ToUnicode(zFilename); 1786 zTmpWide = winUtf8ToUnicode(zText);
1740 if( zTmpWide==0 ){ 1787 if( zTmpWide==0 ){
1741 return 0; 1788 return 0;
1742 } 1789 }
1743 zFilenameMbcs = winUnicodeToMbcs(zTmpWide); 1790 zTextMbcs = winUnicodeToMbcs(zTmpWide, useAnsi);
1744 sqlite3_free(zTmpWide); 1791 sqlite3_free(zTmpWide);
1745 return zFilenameMbcs; 1792 return zTextMbcs;
1746 } 1793 }
1747 1794
1748 /* 1795 /*
1796 ** This is a public wrapper for the winUtf8ToUnicode() function.
1797 */
1798 LPWSTR sqlite3_win32_utf8_to_unicode(const char *zText){
1799 #ifdef SQLITE_ENABLE_API_ARMOR
1800 if( !zText ){
1801 (void)SQLITE_MISUSE_BKPT;
1802 return 0;
1803 }
1804 #endif
1805 #ifndef SQLITE_OMIT_AUTOINIT
1806 if( sqlite3_initialize() ) return 0;
1807 #endif
1808 return winUtf8ToUnicode(zText);
1809 }
1810
1811 /*
1812 ** This is a public wrapper for the winUnicodeToUtf8() function.
1813 */
1814 char *sqlite3_win32_unicode_to_utf8(LPCWSTR zWideText){
1815 #ifdef SQLITE_ENABLE_API_ARMOR
1816 if( !zWideText ){
1817 (void)SQLITE_MISUSE_BKPT;
1818 return 0;
1819 }
1820 #endif
1821 #ifndef SQLITE_OMIT_AUTOINIT
1822 if( sqlite3_initialize() ) return 0;
1823 #endif
1824 return winUnicodeToUtf8(zWideText);
1825 }
1826
1827 /*
1828 ** This is a public wrapper for the winMbcsToUtf8() function.
1829 */
1830 char *sqlite3_win32_mbcs_to_utf8(const char *zText){
1831 #ifdef SQLITE_ENABLE_API_ARMOR
1832 if( !zText ){
1833 (void)SQLITE_MISUSE_BKPT;
1834 return 0;
1835 }
1836 #endif
1837 #ifndef SQLITE_OMIT_AUTOINIT
1838 if( sqlite3_initialize() ) return 0;
1839 #endif
1840 return winMbcsToUtf8(zText, osAreFileApisANSI());
1841 }
1842
1843 /*
1844 ** This is a public wrapper for the winMbcsToUtf8() function.
1845 */
1846 char *sqlite3_win32_mbcs_to_utf8_v2(const char *zText, int useAnsi){
1847 #ifdef SQLITE_ENABLE_API_ARMOR
1848 if( !zText ){
1849 (void)SQLITE_MISUSE_BKPT;
1850 return 0;
1851 }
1852 #endif
1853 #ifndef SQLITE_OMIT_AUTOINIT
1854 if( sqlite3_initialize() ) return 0;
1855 #endif
1856 return winMbcsToUtf8(zText, useAnsi);
1857 }
1858
1859 /*
1860 ** This is a public wrapper for the winUtf8ToMbcs() function.
1861 */
1862 char *sqlite3_win32_utf8_to_mbcs(const char *zText){
1863 #ifdef SQLITE_ENABLE_API_ARMOR
1864 if( !zText ){
1865 (void)SQLITE_MISUSE_BKPT;
1866 return 0;
1867 }
1868 #endif
1869 #ifndef SQLITE_OMIT_AUTOINIT
1870 if( sqlite3_initialize() ) return 0;
1871 #endif
1872 return winUtf8ToMbcs(zText, osAreFileApisANSI());
1873 }
1874
1875 /*
1876 ** This is a public wrapper for the winUtf8ToMbcs() function.
1877 */
1878 char *sqlite3_win32_utf8_to_mbcs_v2(const char *zText, int useAnsi){
1879 #ifdef SQLITE_ENABLE_API_ARMOR
1880 if( !zText ){
1881 (void)SQLITE_MISUSE_BKPT;
1882 return 0;
1883 }
1884 #endif
1885 #ifndef SQLITE_OMIT_AUTOINIT
1886 if( sqlite3_initialize() ) return 0;
1887 #endif
1888 return winUtf8ToMbcs(zText, useAnsi);
1889 }
1890
1891 /*
1749 ** This function sets the data directory or the temporary directory based on 1892 ** This function sets the data directory or the temporary directory based on
1750 ** the provided arguments. The type argument must be 1 in order to set the 1893 ** the provided arguments. The type argument must be 1 in order to set the
1751 ** data directory or 2 in order to set the temporary directory. The zValue 1894 ** data directory or 2 in order to set the temporary directory. The zValue
1752 ** argument is the name of the directory to use. The return value will be 1895 ** argument is the name of the directory to use. The return value will be
1753 ** SQLITE_OK if successful. 1896 ** SQLITE_OK if successful.
1754 */ 1897 */
1755 int sqlite3_win32_set_directory(DWORD type, LPCWSTR zValue){ 1898 int sqlite3_win32_set_directory(DWORD type, LPCWSTR zValue){
1756 char **ppDirectory = 0; 1899 char **ppDirectory = 0;
1757 #ifndef SQLITE_OMIT_AUTOINIT 1900 #ifndef SQLITE_OMIT_AUTOINIT
1758 int rc = sqlite3_initialize(); 1901 int rc = sqlite3_initialize();
1759 if( rc ) return rc; 1902 if( rc ) return rc;
1760 #endif 1903 #endif
1761 if( type==SQLITE_WIN32_DATA_DIRECTORY_TYPE ){ 1904 if( type==SQLITE_WIN32_DATA_DIRECTORY_TYPE ){
1762 ppDirectory = &sqlite3_data_directory; 1905 ppDirectory = &sqlite3_data_directory;
1763 }else if( type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE ){ 1906 }else if( type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE ){
1764 ppDirectory = &sqlite3_temp_directory; 1907 ppDirectory = &sqlite3_temp_directory;
1765 } 1908 }
1766 assert( !ppDirectory || type==SQLITE_WIN32_DATA_DIRECTORY_TYPE 1909 assert( !ppDirectory || type==SQLITE_WIN32_DATA_DIRECTORY_TYPE
1767 || type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE 1910 || type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE
1768 ); 1911 );
1769 assert( !ppDirectory || sqlite3MemdebugHasType(*ppDirectory, MEMTYPE_HEAP) ); 1912 assert( !ppDirectory || sqlite3MemdebugHasType(*ppDirectory, MEMTYPE_HEAP) );
1770 if( ppDirectory ){ 1913 if( ppDirectory ){
1771 char *zValueUtf8 = 0; 1914 char *zValueUtf8 = 0;
1772 if( zValue && zValue[0] ){ 1915 if( zValue && zValue[0] ){
1773 zValueUtf8 = winUnicodeToUtf8(zValue); 1916 zValueUtf8 = winUnicodeToUtf8(zValue);
1774 if ( zValueUtf8==0 ){ 1917 if ( zValueUtf8==0 ){
1775 return SQLITE_NOMEM; 1918 return SQLITE_NOMEM_BKPT;
1776 } 1919 }
1777 } 1920 }
1778 sqlite3_free(*ppDirectory); 1921 sqlite3_free(*ppDirectory);
1779 *ppDirectory = zValueUtf8; 1922 *ppDirectory = zValueUtf8;
1780 return SQLITE_OK; 1923 return SQLITE_OK;
1781 } 1924 }
1782 return SQLITE_ERROR; 1925 return SQLITE_ERROR;
1783 } 1926 }
1784 1927
1785 /* 1928 /*
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1837 FORMAT_MESSAGE_IGNORE_INSERTS, 1980 FORMAT_MESSAGE_IGNORE_INSERTS,
1838 NULL, 1981 NULL,
1839 lastErrno, 1982 lastErrno,
1840 0, 1983 0,
1841 (LPSTR) &zTemp, 1984 (LPSTR) &zTemp,
1842 0, 1985 0,
1843 0); 1986 0);
1844 if( dwLen > 0 ){ 1987 if( dwLen > 0 ){
1845 /* allocate a buffer and convert to UTF8 */ 1988 /* allocate a buffer and convert to UTF8 */
1846 sqlite3BeginBenignMalloc(); 1989 sqlite3BeginBenignMalloc();
1847 zOut = sqlite3_win32_mbcs_to_utf8(zTemp); 1990 zOut = winMbcsToUtf8(zTemp, osAreFileApisANSI());
1848 sqlite3EndBenignMalloc(); 1991 sqlite3EndBenignMalloc();
1849 /* free the system buffer allocated by FormatMessage */ 1992 /* free the system buffer allocated by FormatMessage */
1850 osLocalFree(zTemp); 1993 osLocalFree(zTemp);
1851 } 1994 }
1852 } 1995 }
1853 #endif 1996 #endif
1854 if( 0 == dwLen ){ 1997 if( 0 == dwLen ){
1855 sqlite3_snprintf(nBuf, zBuf, "OsError 0x%lx (%lu)", lastErrno, lastErrno); 1998 sqlite3_snprintf(nBuf, zBuf, "OsError 0x%lx (%lu)", lastErrno, lastErrno);
1856 }else{ 1999 }else{
1857 /* copy a maximum of nBuf chars to output buffer */ 2000 /* copy a maximum of nBuf chars to output buffer */
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1979 */ 2122 */
1980 static void winLogIoerr(int nRetry, int lineno){ 2123 static void winLogIoerr(int nRetry, int lineno){
1981 if( nRetry ){ 2124 if( nRetry ){
1982 sqlite3_log(SQLITE_NOTICE, 2125 sqlite3_log(SQLITE_NOTICE,
1983 "delayed %dms for lock/sharing conflict at line %d", 2126 "delayed %dms for lock/sharing conflict at line %d",
1984 winIoerrRetryDelay*nRetry*(nRetry+1)/2, lineno 2127 winIoerrRetryDelay*nRetry*(nRetry+1)/2, lineno
1985 ); 2128 );
1986 } 2129 }
1987 } 2130 }
1988 2131
1989 #if SQLITE_OS_WINCE 2132 /*
1990 /************************************************************************* 2133 ** This #if does not rely on the SQLITE_OS_WINCE define because the
1991 ** This section contains code for WinCE only. 2134 ** corresponding section in "date.c" cannot use it.
1992 */ 2135 */
1993 #if !defined(SQLITE_MSVC_LOCALTIME_API) || !SQLITE_MSVC_LOCALTIME_API 2136 #if !defined(SQLITE_OMIT_LOCALTIME) && defined(_WIN32_WCE) && \
2137 (!defined(SQLITE_MSVC_LOCALTIME_API) || !SQLITE_MSVC_LOCALTIME_API)
1994 /* 2138 /*
1995 ** The MSVC CRT on Windows CE may not have a localtime() function. So 2139 ** The MSVC CRT on Windows CE may not have a localtime() function.
1996 ** create a substitute. 2140 ** So define a substitute.
1997 */ 2141 */
1998 #include <time.h> 2142 # include <time.h>
1999 struct tm *__cdecl localtime(const time_t *t) 2143 struct tm *__cdecl localtime(const time_t *t)
2000 { 2144 {
2001 static struct tm y; 2145 static struct tm y;
2002 FILETIME uTm, lTm; 2146 FILETIME uTm, lTm;
2003 SYSTEMTIME pTm; 2147 SYSTEMTIME pTm;
2004 sqlite3_int64 t64; 2148 sqlite3_int64 t64;
2005 t64 = *t; 2149 t64 = *t;
2006 t64 = (t64 + 11644473600)*10000000; 2150 t64 = (t64 + 11644473600)*10000000;
2007 uTm.dwLowDateTime = (DWORD)(t64 & 0xFFFFFFFF); 2151 uTm.dwLowDateTime = (DWORD)(t64 & 0xFFFFFFFF);
2008 uTm.dwHighDateTime= (DWORD)(t64 >> 32); 2152 uTm.dwHighDateTime= (DWORD)(t64 >> 32);
2009 osFileTimeToLocalFileTime(&uTm,&lTm); 2153 osFileTimeToLocalFileTime(&uTm,&lTm);
2010 osFileTimeToSystemTime(&lTm,&pTm); 2154 osFileTimeToSystemTime(&lTm,&pTm);
2011 y.tm_year = pTm.wYear - 1900; 2155 y.tm_year = pTm.wYear - 1900;
2012 y.tm_mon = pTm.wMonth - 1; 2156 y.tm_mon = pTm.wMonth - 1;
2013 y.tm_wday = pTm.wDayOfWeek; 2157 y.tm_wday = pTm.wDayOfWeek;
2014 y.tm_mday = pTm.wDay; 2158 y.tm_mday = pTm.wDay;
2015 y.tm_hour = pTm.wHour; 2159 y.tm_hour = pTm.wHour;
2016 y.tm_min = pTm.wMinute; 2160 y.tm_min = pTm.wMinute;
2017 y.tm_sec = pTm.wSecond; 2161 y.tm_sec = pTm.wSecond;
2018 return &y; 2162 return &y;
2019 } 2163 }
2020 #endif 2164 #endif
2021 2165
2166 #if SQLITE_OS_WINCE
2167 /*************************************************************************
2168 ** This section contains code for WinCE only.
2169 */
2022 #define HANDLE_TO_WINFILE(a) (winFile*)&((char*)a)[-(int)offsetof(winFile,h)] 2170 #define HANDLE_TO_WINFILE(a) (winFile*)&((char*)a)[-(int)offsetof(winFile,h)]
2023 2171
2024 /* 2172 /*
2025 ** Acquire a lock on the handle h 2173 ** Acquire a lock on the handle h
2026 */ 2174 */
2027 static void winceMutexAcquire(HANDLE h){ 2175 static void winceMutexAcquire(HANDLE h){
2028 DWORD dwErr; 2176 DWORD dwErr;
2029 do { 2177 do {
2030 dwErr = osWaitForSingleObject(h, INFINITE); 2178 dwErr = osWaitForSingleObject(h, INFINITE);
2031 } while (dwErr != WAIT_OBJECT_0 && dwErr != WAIT_ABANDONED); 2179 } while (dwErr != WAIT_OBJECT_0 && dwErr != WAIT_ABANDONED);
(...skipping 10 matching lines...) Expand all
2042 static int winceCreateLock(const char *zFilename, winFile *pFile){ 2190 static int winceCreateLock(const char *zFilename, winFile *pFile){
2043 LPWSTR zTok; 2191 LPWSTR zTok;
2044 LPWSTR zName; 2192 LPWSTR zName;
2045 DWORD lastErrno; 2193 DWORD lastErrno;
2046 BOOL bLogged = FALSE; 2194 BOOL bLogged = FALSE;
2047 BOOL bInit = TRUE; 2195 BOOL bInit = TRUE;
2048 2196
2049 zName = winUtf8ToUnicode(zFilename); 2197 zName = winUtf8ToUnicode(zFilename);
2050 if( zName==0 ){ 2198 if( zName==0 ){
2051 /* out of memory */ 2199 /* out of memory */
2052 return SQLITE_IOERR_NOMEM; 2200 return SQLITE_IOERR_NOMEM_BKPT;
2053 } 2201 }
2054 2202
2055 /* Initialize the local lockdata */ 2203 /* Initialize the local lockdata */
2056 memset(&pFile->local, 0, sizeof(pFile->local)); 2204 memset(&pFile->local, 0, sizeof(pFile->local));
2057 2205
2058 /* Replace the backslashes from the filename and lowercase it 2206 /* Replace the backslashes from the filename and lowercase it
2059 ** to derive a mutex name. */ 2207 ** to derive a mutex name. */
2060 zTok = osCharLowerW(zName); 2208 zTok = osCharLowerW(zName);
2061 for (;*zTok;zTok++){ 2209 for (;*zTok;zTok++){
2062 if (*zTok == '\\') *zTok = '_'; 2210 if (*zTok == '\\') *zTok = '_';
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after
2467 #if SQLITE_MAX_MMAP_SIZE>0 2615 #if SQLITE_MAX_MMAP_SIZE>0
2468 winUnmapfile(pFile); 2616 winUnmapfile(pFile);
2469 #endif 2617 #endif
2470 2618
2471 do{ 2619 do{
2472 rc = osCloseHandle(pFile->h); 2620 rc = osCloseHandle(pFile->h);
2473 /* SimulateIOError( rc=0; cnt=MX_CLOSE_ATTEMPT; ); */ 2621 /* SimulateIOError( rc=0; cnt=MX_CLOSE_ATTEMPT; ); */
2474 }while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (sqlite3_win32_sleep(100), 1) ); 2622 }while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (sqlite3_win32_sleep(100), 1) );
2475 #if SQLITE_OS_WINCE 2623 #if SQLITE_OS_WINCE
2476 #define WINCE_DELETION_ATTEMPTS 3 2624 #define WINCE_DELETION_ATTEMPTS 3
2477 winceDestroyLock(pFile); 2625 {
2626 winVfsAppData *pAppData = (winVfsAppData*)pFile->pVfs->pAppData;
2627 if( pAppData==NULL || !pAppData->bNoLock ){
2628 winceDestroyLock(pFile);
2629 }
2630 }
2478 if( pFile->zDeleteOnClose ){ 2631 if( pFile->zDeleteOnClose ){
2479 int cnt = 0; 2632 int cnt = 0;
2480 while( 2633 while(
2481 osDeleteFileW(pFile->zDeleteOnClose)==0 2634 osDeleteFileW(pFile->zDeleteOnClose)==0
2482 && osGetFileAttributesW(pFile->zDeleteOnClose)!=0xffffffff 2635 && osGetFileAttributesW(pFile->zDeleteOnClose)!=0xffffffff
2483 && cnt++ < WINCE_DELETION_ATTEMPTS 2636 && cnt++ < WINCE_DELETION_ATTEMPTS
2484 ){ 2637 ){
2485 sqlite3_win32_sleep(100); /* Wait a little before trying again */ 2638 sqlite3_win32_sleep(100); /* Wait a little before trying again */
2486 } 2639 }
2487 sqlite3_free(pFile->zDeleteOnClose); 2640 sqlite3_free(pFile->zDeleteOnClose);
(...skipping 29 matching lines...) Expand all
2517 int nRetry = 0; /* Number of retrys */ 2670 int nRetry = 0; /* Number of retrys */
2518 2671
2519 assert( id!=0 ); 2672 assert( id!=0 );
2520 assert( amt>0 ); 2673 assert( amt>0 );
2521 assert( offset>=0 ); 2674 assert( offset>=0 );
2522 SimulateIOError(return SQLITE_IOERR_READ); 2675 SimulateIOError(return SQLITE_IOERR_READ);
2523 OSTRACE(("READ pid=%lu, pFile=%p, file=%p, buffer=%p, amount=%d, " 2676 OSTRACE(("READ pid=%lu, pFile=%p, file=%p, buffer=%p, amount=%d, "
2524 "offset=%lld, lock=%d\n", osGetCurrentProcessId(), pFile, 2677 "offset=%lld, lock=%d\n", osGetCurrentProcessId(), pFile,
2525 pFile->h, pBuf, amt, offset, pFile->locktype)); 2678 pFile->h, pBuf, amt, offset, pFile->locktype));
2526 2679
2527 #if defined(SQLITE_MMAP_READWRITE) && SQLITE_MAX_MMAP_SIZE>0 2680 #if SQLITE_MAX_MMAP_SIZE>0
2528 /* Deal with as much of this read request as possible by transfering 2681 /* Deal with as much of this read request as possible by transfering
2529 ** data from the memory mapping using memcpy(). */ 2682 ** data from the memory mapping using memcpy(). */
2530 if( offset<pFile->mmapSize ){ 2683 if( offset<pFile->mmapSize ){
2531 if( offset+amt <= pFile->mmapSize ){ 2684 if( offset+amt <= pFile->mmapSize ){
2532 memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], amt); 2685 memcpy(pBuf, &((u8 *)(pFile->pMapRegion))[offset], amt);
2533 OSTRACE(("READ-MMAP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n", 2686 OSTRACE(("READ-MMAP pid=%lu, pFile=%p, file=%p, rc=SQLITE_OK\n",
2534 osGetCurrentProcessId(), pFile, pFile->h)); 2687 osGetCurrentProcessId(), pFile, pFile->h));
2535 return SQLITE_OK; 2688 return SQLITE_OK;
2536 }else{ 2689 }else{
2537 int nCopy = (int)(pFile->mmapSize - offset); 2690 int nCopy = (int)(pFile->mmapSize - offset);
(...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after
3025 */ 3178 */
3026 assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK ); 3179 assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK );
3027 assert( locktype!=PENDING_LOCK ); 3180 assert( locktype!=PENDING_LOCK );
3028 assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK ); 3181 assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK );
3029 3182
3030 /* Lock the PENDING_LOCK byte if we need to acquire a PENDING lock or 3183 /* Lock the PENDING_LOCK byte if we need to acquire a PENDING lock or
3031 ** a SHARED lock. If we are acquiring a SHARED lock, the acquisition of 3184 ** a SHARED lock. If we are acquiring a SHARED lock, the acquisition of
3032 ** the PENDING_LOCK byte is temporary. 3185 ** the PENDING_LOCK byte is temporary.
3033 */ 3186 */
3034 newLocktype = pFile->locktype; 3187 newLocktype = pFile->locktype;
3035 if( (pFile->locktype==NO_LOCK) 3188 if( pFile->locktype==NO_LOCK
3036 || ( (locktype==EXCLUSIVE_LOCK) 3189 || (locktype==EXCLUSIVE_LOCK && pFile->locktype<=RESERVED_LOCK)
3037 && (pFile->locktype==RESERVED_LOCK))
3038 ){ 3190 ){
3039 int cnt = 3; 3191 int cnt = 3;
3040 while( cnt-->0 && (res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS, 3192 while( cnt-->0 && (res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS,
3041 PENDING_BYTE, 0, 1, 0))==0 ){ 3193 PENDING_BYTE, 0, 1, 0))==0 ){
3042 /* Try 3 times to get the pending lock. This is needed to work 3194 /* Try 3 times to get the pending lock. This is needed to work
3043 ** around problems caused by indexing and/or anti-virus software on 3195 ** around problems caused by indexing and/or anti-virus software on
3044 ** Windows systems. 3196 ** Windows systems.
3045 ** If you are using this code as a model for alternative VFSes, do not 3197 ** If you are using this code as a model for alternative VFSes, do not
3046 ** copy this retry logic. It is a hack intended for Windows only. 3198 ** copy this retry logic. It is a hack intended for Windows only.
3047 */ 3199 */
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
3200 } 3352 }
3201 if( type>=PENDING_LOCK ){ 3353 if( type>=PENDING_LOCK ){
3202 winUnlockFile(&pFile->h, PENDING_BYTE, 0, 1, 0); 3354 winUnlockFile(&pFile->h, PENDING_BYTE, 0, 1, 0);
3203 } 3355 }
3204 pFile->locktype = (u8)locktype; 3356 pFile->locktype = (u8)locktype;
3205 OSTRACE(("UNLOCK file=%p, lock=%d, rc=%s\n", 3357 OSTRACE(("UNLOCK file=%p, lock=%d, rc=%s\n",
3206 pFile->h, pFile->locktype, sqlite3ErrName(rc))); 3358 pFile->h, pFile->locktype, sqlite3ErrName(rc)));
3207 return rc; 3359 return rc;
3208 } 3360 }
3209 3361
3362 /******************************************************************************
3363 ****************************** No-op Locking **********************************
3364 **
3365 ** Of the various locking implementations available, this is by far the
3366 ** simplest: locking is ignored. No attempt is made to lock the database
3367 ** file for reading or writing.
3368 **
3369 ** This locking mode is appropriate for use on read-only databases
3370 ** (ex: databases that are burned into CD-ROM, for example.) It can
3371 ** also be used if the application employs some external mechanism to
3372 ** prevent simultaneous access of the same database by two or more
3373 ** database connections. But there is a serious risk of database
3374 ** corruption if this locking mode is used in situations where multiple
3375 ** database connections are accessing the same database file at the same
3376 ** time and one or more of those connections are writing.
3377 */
3378
3379 static int winNolockLock(sqlite3_file *id, int locktype){
3380 UNUSED_PARAMETER(id);
3381 UNUSED_PARAMETER(locktype);
3382 return SQLITE_OK;
3383 }
3384
3385 static int winNolockCheckReservedLock(sqlite3_file *id, int *pResOut){
3386 UNUSED_PARAMETER(id);
3387 UNUSED_PARAMETER(pResOut);
3388 return SQLITE_OK;
3389 }
3390
3391 static int winNolockUnlock(sqlite3_file *id, int locktype){
3392 UNUSED_PARAMETER(id);
3393 UNUSED_PARAMETER(locktype);
3394 return SQLITE_OK;
3395 }
3396
3397 /******************* End of the no-op lock implementation *********************
3398 ******************************************************************************/
3399
3210 /* 3400 /*
3211 ** If *pArg is initially negative then this is a query. Set *pArg to 3401 ** If *pArg is initially negative then this is a query. Set *pArg to
3212 ** 1 or 0 depending on whether or not bit mask of pFile->ctrlFlags is set. 3402 ** 1 or 0 depending on whether or not bit mask of pFile->ctrlFlags is set.
3213 ** 3403 **
3214 ** If *pArg is 0 or 1, then clear or set the mask bit of pFile->ctrlFlags. 3404 ** If *pArg is 0 or 1, then clear or set the mask bit of pFile->ctrlFlags.
3215 */ 3405 */
3216 static void winModeBit(winFile *pFile, unsigned char mask, int *pArg){ 3406 static void winModeBit(winFile *pFile, unsigned char mask, int *pArg){
3217 if( *pArg<0 ){ 3407 if( *pArg<0 ){
3218 *pArg = (pFile->ctrlFlags & mask)!=0; 3408 *pArg = (pFile->ctrlFlags & mask)!=0;
3219 }else if( (*pArg)==0 ){ 3409 }else if( (*pArg)==0 ){
(...skipping 13 matching lines...) Expand all
3233 */ 3423 */
3234 static int winFileControl(sqlite3_file *id, int op, void *pArg){ 3424 static int winFileControl(sqlite3_file *id, int op, void *pArg){
3235 winFile *pFile = (winFile*)id; 3425 winFile *pFile = (winFile*)id;
3236 OSTRACE(("FCNTL file=%p, op=%d, pArg=%p\n", pFile->h, op, pArg)); 3426 OSTRACE(("FCNTL file=%p, op=%d, pArg=%p\n", pFile->h, op, pArg));
3237 switch( op ){ 3427 switch( op ){
3238 case SQLITE_FCNTL_LOCKSTATE: { 3428 case SQLITE_FCNTL_LOCKSTATE: {
3239 *(int*)pArg = pFile->locktype; 3429 *(int*)pArg = pFile->locktype;
3240 OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); 3430 OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h));
3241 return SQLITE_OK; 3431 return SQLITE_OK;
3242 } 3432 }
3243 case SQLITE_LAST_ERRNO: { 3433 case SQLITE_FCNTL_LAST_ERRNO: {
3244 *(int*)pArg = (int)pFile->lastErrno; 3434 *(int*)pArg = (int)pFile->lastErrno;
3245 OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); 3435 OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h));
3246 return SQLITE_OK; 3436 return SQLITE_OK;
3247 } 3437 }
3248 case SQLITE_FCNTL_CHUNK_SIZE: { 3438 case SQLITE_FCNTL_CHUNK_SIZE: {
3249 pFile->szChunk = *(int *)pArg; 3439 pFile->szChunk = *(int *)pArg;
3250 OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); 3440 OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h));
3251 return SQLITE_OK; 3441 return SQLITE_OK;
3252 } 3442 }
3253 case SQLITE_FCNTL_SIZE_HINT: { 3443 case SQLITE_FCNTL_SIZE_HINT: {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
3291 a[0] = winIoerrRetry; 3481 a[0] = winIoerrRetry;
3292 } 3482 }
3293 if( a[1]>0 ){ 3483 if( a[1]>0 ){
3294 winIoerrRetryDelay = a[1]; 3484 winIoerrRetryDelay = a[1];
3295 }else{ 3485 }else{
3296 a[1] = winIoerrRetryDelay; 3486 a[1] = winIoerrRetryDelay;
3297 } 3487 }
3298 OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h)); 3488 OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h));
3299 return SQLITE_OK; 3489 return SQLITE_OK;
3300 } 3490 }
3491 case SQLITE_FCNTL_WIN32_GET_HANDLE: {
3492 LPHANDLE phFile = (LPHANDLE)pArg;
3493 *phFile = pFile->h;
3494 OSTRACE(("FCNTL file=%p, rc=SQLITE_OK\n", pFile->h));
3495 return SQLITE_OK;
3496 }
3301 #ifdef SQLITE_TEST 3497 #ifdef SQLITE_TEST
3302 case SQLITE_FCNTL_WIN32_SET_HANDLE: { 3498 case SQLITE_FCNTL_WIN32_SET_HANDLE: {
3303 LPHANDLE phFile = (LPHANDLE)pArg; 3499 LPHANDLE phFile = (LPHANDLE)pArg;
3304 HANDLE hOldFile = pFile->h; 3500 HANDLE hOldFile = pFile->h;
3305 pFile->h = *phFile; 3501 pFile->h = *phFile;
3306 *phFile = hOldFile; 3502 *phFile = hOldFile;
3307 OSTRACE(("FCNTL oldFile=%p, newFile=%p, rc=SQLITE_OK\n", 3503 OSTRACE(("FCNTL oldFile=%p, newFile=%p, rc=SQLITE_OK\n",
3308 hOldFile, pFile->h)); 3504 hOldFile, pFile->h));
3309 return SQLITE_OK; 3505 return SQLITE_OK;
3310 } 3506 }
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
3478 3674
3479 /* 3675 /*
3480 ** Constants used for locking 3676 ** Constants used for locking
3481 */ 3677 */
3482 #define WIN_SHM_BASE ((22+SQLITE_SHM_NLOCK)*4) /* first lock byte */ 3678 #define WIN_SHM_BASE ((22+SQLITE_SHM_NLOCK)*4) /* first lock byte */
3483 #define WIN_SHM_DMS (WIN_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */ 3679 #define WIN_SHM_DMS (WIN_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */
3484 3680
3485 /* 3681 /*
3486 ** Apply advisory locks for all n bytes beginning at ofst. 3682 ** Apply advisory locks for all n bytes beginning at ofst.
3487 */ 3683 */
3488 #define _SHM_UNLCK 1 3684 #define WINSHM_UNLCK 1
3489 #define _SHM_RDLCK 2 3685 #define WINSHM_RDLCK 2
3490 #define _SHM_WRLCK 3 3686 #define WINSHM_WRLCK 3
3491 static int winShmSystemLock( 3687 static int winShmSystemLock(
3492 winShmNode *pFile, /* Apply locks to this open shared-memory segment */ 3688 winShmNode *pFile, /* Apply locks to this open shared-memory segment */
3493 int lockType, /* _SHM_UNLCK, _SHM_RDLCK, or _SHM_WRLCK */ 3689 int lockType, /* WINSHM_UNLCK, WINSHM_RDLCK, or WINSHM_WRLCK */
3494 int ofst, /* Offset to first byte to be locked/unlocked */ 3690 int ofst, /* Offset to first byte to be locked/unlocked */
3495 int nByte /* Number of bytes to lock or unlock */ 3691 int nByte /* Number of bytes to lock or unlock */
3496 ){ 3692 ){
3497 int rc = 0; /* Result code form Lock/UnlockFileEx() */ 3693 int rc = 0; /* Result code form Lock/UnlockFileEx() */
3498 3694
3499 /* Access to the winShmNode object is serialized by the caller */ 3695 /* Access to the winShmNode object is serialized by the caller */
3500 assert( sqlite3_mutex_held(pFile->mutex) || pFile->nRef==0 ); 3696 assert( sqlite3_mutex_held(pFile->mutex) || pFile->nRef==0 );
3501 3697
3502 OSTRACE(("SHM-LOCK file=%p, lock=%d, offset=%d, size=%d\n", 3698 OSTRACE(("SHM-LOCK file=%p, lock=%d, offset=%d, size=%d\n",
3503 pFile->hFile.h, lockType, ofst, nByte)); 3699 pFile->hFile.h, lockType, ofst, nByte));
3504 3700
3505 /* Release/Acquire the system-level lock */ 3701 /* Release/Acquire the system-level lock */
3506 if( lockType==_SHM_UNLCK ){ 3702 if( lockType==WINSHM_UNLCK ){
3507 rc = winUnlockFile(&pFile->hFile.h, ofst, 0, nByte, 0); 3703 rc = winUnlockFile(&pFile->hFile.h, ofst, 0, nByte, 0);
3508 }else{ 3704 }else{
3509 /* Initialize the locking parameters */ 3705 /* Initialize the locking parameters */
3510 DWORD dwFlags = LOCKFILE_FAIL_IMMEDIATELY; 3706 DWORD dwFlags = LOCKFILE_FAIL_IMMEDIATELY;
3511 if( lockType == _SHM_WRLCK ) dwFlags |= LOCKFILE_EXCLUSIVE_LOCK; 3707 if( lockType == WINSHM_WRLCK ) dwFlags |= LOCKFILE_EXCLUSIVE_LOCK;
3512 rc = winLockFile(&pFile->hFile.h, dwFlags, ofst, 0, nByte, 0); 3708 rc = winLockFile(&pFile->hFile.h, dwFlags, ofst, 0, nByte, 0);
3513 } 3709 }
3514 3710
3515 if( rc!= 0 ){ 3711 if( rc!= 0 ){
3516 rc = SQLITE_OK; 3712 rc = SQLITE_OK;
3517 }else{ 3713 }else{
3518 pFile->lastErrno = osGetLastError(); 3714 pFile->lastErrno = osGetLastError();
3519 rc = SQLITE_BUSY; 3715 rc = SQLITE_BUSY;
3520 } 3716 }
3521 3717
3522 OSTRACE(("SHM-LOCK file=%p, func=%s, errno=%lu, rc=%s\n", 3718 OSTRACE(("SHM-LOCK file=%p, func=%s, errno=%lu, rc=%s\n",
3523 pFile->hFile.h, (lockType == _SHM_UNLCK) ? "winUnlockFile" : 3719 pFile->hFile.h, (lockType == WINSHM_UNLCK) ? "winUnlockFile" :
3524 "winLockFile", pFile->lastErrno, sqlite3ErrName(rc))); 3720 "winLockFile", pFile->lastErrno, sqlite3ErrName(rc)));
3525 3721
3526 return rc; 3722 return rc;
3527 } 3723 }
3528 3724
3529 /* Forward references to VFS methods */ 3725 /* Forward references to VFS methods */
3530 static int winOpen(sqlite3_vfs*,const char*,sqlite3_file*,int,int*); 3726 static int winOpen(sqlite3_vfs*,const char*,sqlite3_file*,int,int*);
3531 static int winDelete(sqlite3_vfs *,const char*,int); 3727 static int winDelete(sqlite3_vfs *,const char*,int);
3532 3728
3533 /* 3729 /*
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
3591 int rc; /* Result code */ 3787 int rc; /* Result code */
3592 struct winShmNode *pNew; /* Newly allocated winShmNode */ 3788 struct winShmNode *pNew; /* Newly allocated winShmNode */
3593 int nName; /* Size of zName in bytes */ 3789 int nName; /* Size of zName in bytes */
3594 3790
3595 assert( pDbFd->pShm==0 ); /* Not previously opened */ 3791 assert( pDbFd->pShm==0 ); /* Not previously opened */
3596 3792
3597 /* Allocate space for the new sqlite3_shm object. Also speculatively 3793 /* Allocate space for the new sqlite3_shm object. Also speculatively
3598 ** allocate space for a new winShmNode and filename. 3794 ** allocate space for a new winShmNode and filename.
3599 */ 3795 */
3600 p = sqlite3MallocZero( sizeof(*p) ); 3796 p = sqlite3MallocZero( sizeof(*p) );
3601 if( p==0 ) return SQLITE_IOERR_NOMEM; 3797 if( p==0 ) return SQLITE_IOERR_NOMEM_BKPT;
3602 nName = sqlite3Strlen30(pDbFd->zPath); 3798 nName = sqlite3Strlen30(pDbFd->zPath);
3603 pNew = sqlite3MallocZero( sizeof(*pShmNode) + nName + 17 ); 3799 pNew = sqlite3MallocZero( sizeof(*pShmNode) + nName + 17 );
3604 if( pNew==0 ){ 3800 if( pNew==0 ){
3605 sqlite3_free(p); 3801 sqlite3_free(p);
3606 return SQLITE_IOERR_NOMEM; 3802 return SQLITE_IOERR_NOMEM_BKPT;
3607 } 3803 }
3608 pNew->zFilename = (char*)&pNew[1]; 3804 pNew->zFilename = (char*)&pNew[1];
3609 sqlite3_snprintf(nName+15, pNew->zFilename, "%s-shm", pDbFd->zPath); 3805 sqlite3_snprintf(nName+15, pNew->zFilename, "%s-shm", pDbFd->zPath);
3610 sqlite3FileSuffix3(pDbFd->zPath, pNew->zFilename); 3806 sqlite3FileSuffix3(pDbFd->zPath, pNew->zFilename);
3611 3807
3612 /* Look to see if there is an existing winShmNode that can be used. 3808 /* Look to see if there is an existing winShmNode that can be used.
3613 ** If no matching winShmNode currently exists, create a new one. 3809 ** If no matching winShmNode currently exists, create a new one.
3614 */ 3810 */
3615 winShmEnterMutex(); 3811 winShmEnterMutex();
3616 for(pShmNode = winShmNodeList; pShmNode; pShmNode=pShmNode->pNext){ 3812 for(pShmNode = winShmNodeList; pShmNode; pShmNode=pShmNode->pNext){
3617 /* TBD need to come up with better match here. Perhaps 3813 /* TBD need to come up with better match here. Perhaps
3618 ** use FILE_ID_BOTH_DIR_INFO Structure. 3814 ** use FILE_ID_BOTH_DIR_INFO Structure.
3619 */ 3815 */
3620 if( sqlite3StrICmp(pShmNode->zFilename, pNew->zFilename)==0 ) break; 3816 if( sqlite3StrICmp(pShmNode->zFilename, pNew->zFilename)==0 ) break;
3621 } 3817 }
3622 if( pShmNode ){ 3818 if( pShmNode ){
3623 sqlite3_free(pNew); 3819 sqlite3_free(pNew);
3624 }else{ 3820 }else{
3625 pShmNode = pNew; 3821 pShmNode = pNew;
3626 pNew = 0; 3822 pNew = 0;
3627 ((winFile*)(&pShmNode->hFile))->h = INVALID_HANDLE_VALUE; 3823 ((winFile*)(&pShmNode->hFile))->h = INVALID_HANDLE_VALUE;
3628 pShmNode->pNext = winShmNodeList; 3824 pShmNode->pNext = winShmNodeList;
3629 winShmNodeList = pShmNode; 3825 winShmNodeList = pShmNode;
3630 3826
3631 pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); 3827 if( sqlite3GlobalConfig.bCoreMutex ){
3632 if( pShmNode->mutex==0 ){ 3828 pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST);
3633 rc = SQLITE_IOERR_NOMEM; 3829 if( pShmNode->mutex==0 ){
3634 goto shm_open_err; 3830 rc = SQLITE_IOERR_NOMEM_BKPT;
3831 goto shm_open_err;
3832 }
3635 } 3833 }
3636 3834
3637 rc = winOpen(pDbFd->pVfs, 3835 rc = winOpen(pDbFd->pVfs,
3638 pShmNode->zFilename, /* Name of the file (UTF-8) */ 3836 pShmNode->zFilename, /* Name of the file (UTF-8) */
3639 (sqlite3_file*)&pShmNode->hFile, /* File handle here */ 3837 (sqlite3_file*)&pShmNode->hFile, /* File handle here */
3640 SQLITE_OPEN_WAL | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 3838 SQLITE_OPEN_WAL | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
3641 0); 3839 0);
3642 if( SQLITE_OK!=rc ){ 3840 if( SQLITE_OK!=rc ){
3643 goto shm_open_err; 3841 goto shm_open_err;
3644 } 3842 }
3645 3843
3646 /* Check to see if another process is holding the dead-man switch. 3844 /* Check to see if another process is holding the dead-man switch.
3647 ** If not, truncate the file to zero length. 3845 ** If not, truncate the file to zero length.
3648 */ 3846 */
3649 if( winShmSystemLock(pShmNode, _SHM_WRLCK, WIN_SHM_DMS, 1)==SQLITE_OK ){ 3847 if( winShmSystemLock(pShmNode, WINSHM_WRLCK, WIN_SHM_DMS, 1)==SQLITE_OK ){
3650 rc = winTruncate((sqlite3_file *)&pShmNode->hFile, 0); 3848 rc = winTruncate((sqlite3_file *)&pShmNode->hFile, 0);
3651 if( rc!=SQLITE_OK ){ 3849 if( rc!=SQLITE_OK ){
3652 rc = winLogError(SQLITE_IOERR_SHMOPEN, osGetLastError(), 3850 rc = winLogError(SQLITE_IOERR_SHMOPEN, osGetLastError(),
3653 "winOpenShm", pDbFd->zPath); 3851 "winOpenShm", pDbFd->zPath);
3654 } 3852 }
3655 } 3853 }
3656 if( rc==SQLITE_OK ){ 3854 if( rc==SQLITE_OK ){
3657 winShmSystemLock(pShmNode, _SHM_UNLCK, WIN_SHM_DMS, 1); 3855 winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1);
3658 rc = winShmSystemLock(pShmNode, _SHM_RDLCK, WIN_SHM_DMS, 1); 3856 rc = winShmSystemLock(pShmNode, WINSHM_RDLCK, WIN_SHM_DMS, 1);
3659 } 3857 }
3660 if( rc ) goto shm_open_err; 3858 if( rc ) goto shm_open_err;
3661 } 3859 }
3662 3860
3663 /* Make the new connection a child of the winShmNode */ 3861 /* Make the new connection a child of the winShmNode */
3664 p->pShmNode = pShmNode; 3862 p->pShmNode = pShmNode;
3665 #if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE) 3863 #if defined(SQLITE_DEBUG) || defined(SQLITE_HAVE_OS_TRACE)
3666 p->id = pShmNode->nextShmId++; 3864 p->id = pShmNode->nextShmId++;
3667 #endif 3865 #endif
3668 pShmNode->nRef++; 3866 pShmNode->nRef++;
3669 pDbFd->pShm = p; 3867 pDbFd->pShm = p;
3670 winShmLeaveMutex(); 3868 winShmLeaveMutex();
3671 3869
3672 /* The reference count on pShmNode has already been incremented under 3870 /* The reference count on pShmNode has already been incremented under
3673 ** the cover of the winShmEnterMutex() mutex and the pointer from the 3871 ** the cover of the winShmEnterMutex() mutex and the pointer from the
3674 ** new (struct winShm) object to the pShmNode has been set. All that is 3872 ** new (struct winShm) object to the pShmNode has been set. All that is
3675 ** left to do is to link the new object into the linked list starting 3873 ** left to do is to link the new object into the linked list starting
3676 ** at pShmNode->pFirst. This must be done while holding the pShmNode->mutex 3874 ** at pShmNode->pFirst. This must be done while holding the pShmNode->mutex
3677 ** mutex. 3875 ** mutex.
3678 */ 3876 */
3679 sqlite3_mutex_enter(pShmNode->mutex); 3877 sqlite3_mutex_enter(pShmNode->mutex);
3680 p->pNext = pShmNode->pFirst; 3878 p->pNext = pShmNode->pFirst;
3681 pShmNode->pFirst = p; 3879 pShmNode->pFirst = p;
3682 sqlite3_mutex_leave(pShmNode->mutex); 3880 sqlite3_mutex_leave(pShmNode->mutex);
3683 return SQLITE_OK; 3881 return SQLITE_OK;
3684 3882
3685 /* Jump here on any error */ 3883 /* Jump here on any error */
3686 shm_open_err: 3884 shm_open_err:
3687 winShmSystemLock(pShmNode, _SHM_UNLCK, WIN_SHM_DMS, 1); 3885 winShmSystemLock(pShmNode, WINSHM_UNLCK, WIN_SHM_DMS, 1);
3688 winShmPurge(pDbFd->pVfs, 0); /* This call frees pShmNode if required */ 3886 winShmPurge(pDbFd->pVfs, 0); /* This call frees pShmNode if required */
3689 sqlite3_free(p); 3887 sqlite3_free(p);
3690 sqlite3_free(pNew); 3888 sqlite3_free(pNew);
3691 winShmLeaveMutex(); 3889 winShmLeaveMutex();
3692 return rc; 3890 return rc;
3693 } 3891 }
3694 3892
3695 /* 3893 /*
3696 ** Close a connection to shared-memory. Delete the underlying 3894 ** Close a connection to shared-memory. Delete the underlying
3697 ** storage if deleteFlag is true. 3895 ** storage if deleteFlag is true.
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
3766 3964
3767 /* See if any siblings hold this same lock */ 3965 /* See if any siblings hold this same lock */
3768 for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ 3966 for(pX=pShmNode->pFirst; pX; pX=pX->pNext){
3769 if( pX==p ) continue; 3967 if( pX==p ) continue;
3770 assert( (pX->exclMask & (p->exclMask|p->sharedMask))==0 ); 3968 assert( (pX->exclMask & (p->exclMask|p->sharedMask))==0 );
3771 allMask |= pX->sharedMask; 3969 allMask |= pX->sharedMask;
3772 } 3970 }
3773 3971
3774 /* Unlock the system-level locks */ 3972 /* Unlock the system-level locks */
3775 if( (mask & allMask)==0 ){ 3973 if( (mask & allMask)==0 ){
3776 rc = winShmSystemLock(pShmNode, _SHM_UNLCK, ofst+WIN_SHM_BASE, n); 3974 rc = winShmSystemLock(pShmNode, WINSHM_UNLCK, ofst+WIN_SHM_BASE, n);
3777 }else{ 3975 }else{
3778 rc = SQLITE_OK; 3976 rc = SQLITE_OK;
3779 } 3977 }
3780 3978
3781 /* Undo the local locks */ 3979 /* Undo the local locks */
3782 if( rc==SQLITE_OK ){ 3980 if( rc==SQLITE_OK ){
3783 p->exclMask &= ~mask; 3981 p->exclMask &= ~mask;
3784 p->sharedMask &= ~mask; 3982 p->sharedMask &= ~mask;
3785 } 3983 }
3786 }else if( flags & SQLITE_SHM_SHARED ){ 3984 }else if( flags & SQLITE_SHM_SHARED ){
3787 u16 allShared = 0; /* Union of locks held by connections other than "p" */ 3985 u16 allShared = 0; /* Union of locks held by connections other than "p" */
3788 3986
3789 /* Find out which shared locks are already held by sibling connections. 3987 /* Find out which shared locks are already held by sibling connections.
3790 ** If any sibling already holds an exclusive lock, go ahead and return 3988 ** If any sibling already holds an exclusive lock, go ahead and return
3791 ** SQLITE_BUSY. 3989 ** SQLITE_BUSY.
3792 */ 3990 */
3793 for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ 3991 for(pX=pShmNode->pFirst; pX; pX=pX->pNext){
3794 if( (pX->exclMask & mask)!=0 ){ 3992 if( (pX->exclMask & mask)!=0 ){
3795 rc = SQLITE_BUSY; 3993 rc = SQLITE_BUSY;
3796 break; 3994 break;
3797 } 3995 }
3798 allShared |= pX->sharedMask; 3996 allShared |= pX->sharedMask;
3799 } 3997 }
3800 3998
3801 /* Get shared locks at the system level, if necessary */ 3999 /* Get shared locks at the system level, if necessary */
3802 if( rc==SQLITE_OK ){ 4000 if( rc==SQLITE_OK ){
3803 if( (allShared & mask)==0 ){ 4001 if( (allShared & mask)==0 ){
3804 rc = winShmSystemLock(pShmNode, _SHM_RDLCK, ofst+WIN_SHM_BASE, n); 4002 rc = winShmSystemLock(pShmNode, WINSHM_RDLCK, ofst+WIN_SHM_BASE, n);
3805 }else{ 4003 }else{
3806 rc = SQLITE_OK; 4004 rc = SQLITE_OK;
3807 } 4005 }
3808 } 4006 }
3809 4007
3810 /* Get the local shared locks */ 4008 /* Get the local shared locks */
3811 if( rc==SQLITE_OK ){ 4009 if( rc==SQLITE_OK ){
3812 p->sharedMask |= mask; 4010 p->sharedMask |= mask;
3813 } 4011 }
3814 }else{ 4012 }else{
3815 /* Make sure no sibling connections hold locks that will block this 4013 /* Make sure no sibling connections hold locks that will block this
3816 ** lock. If any do, return SQLITE_BUSY right away. 4014 ** lock. If any do, return SQLITE_BUSY right away.
3817 */ 4015 */
3818 for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ 4016 for(pX=pShmNode->pFirst; pX; pX=pX->pNext){
3819 if( (pX->exclMask & mask)!=0 || (pX->sharedMask & mask)!=0 ){ 4017 if( (pX->exclMask & mask)!=0 || (pX->sharedMask & mask)!=0 ){
3820 rc = SQLITE_BUSY; 4018 rc = SQLITE_BUSY;
3821 break; 4019 break;
3822 } 4020 }
3823 } 4021 }
3824 4022
3825 /* Get the exclusive locks at the system level. Then if successful 4023 /* Get the exclusive locks at the system level. Then if successful
3826 ** also mark the local connection as being locked. 4024 ** also mark the local connection as being locked.
3827 */ 4025 */
3828 if( rc==SQLITE_OK ){ 4026 if( rc==SQLITE_OK ){
3829 rc = winShmSystemLock(pShmNode, _SHM_WRLCK, ofst+WIN_SHM_BASE, n); 4027 rc = winShmSystemLock(pShmNode, WINSHM_WRLCK, ofst+WIN_SHM_BASE, n);
3830 if( rc==SQLITE_OK ){ 4028 if( rc==SQLITE_OK ){
3831 assert( (p->sharedMask & mask)==0 ); 4029 assert( (p->sharedMask & mask)==0 );
3832 p->exclMask |= mask; 4030 p->exclMask |= mask;
3833 } 4031 }
3834 } 4032 }
3835 } 4033 }
3836 sqlite3_mutex_leave(pShmNode->mutex); 4034 sqlite3_mutex_leave(pShmNode->mutex);
3837 OSTRACE(("SHM-LOCK pid=%lu, id=%d, sharedMask=%03x, exclMask=%03x, rc=%s\n", 4035 OSTRACE(("SHM-LOCK pid=%lu, id=%d, sharedMask=%03x, exclMask=%03x, rc=%s\n",
3838 osGetCurrentProcessId(), p->id, p->sharedMask, p->exclMask, 4036 osGetCurrentProcessId(), p->id, p->sharedMask, p->exclMask,
3839 sqlite3ErrName(rc))); 4037 sqlite3ErrName(rc)));
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
3928 "winShmMap2", pDbFd->zPath); 4126 "winShmMap2", pDbFd->zPath);
3929 goto shmpage_out; 4127 goto shmpage_out;
3930 } 4128 }
3931 } 4129 }
3932 4130
3933 /* Map the requested memory region into this processes address space. */ 4131 /* Map the requested memory region into this processes address space. */
3934 apNew = (struct ShmRegion *)sqlite3_realloc64( 4132 apNew = (struct ShmRegion *)sqlite3_realloc64(
3935 pShmNode->aRegion, (iRegion+1)*sizeof(apNew[0]) 4133 pShmNode->aRegion, (iRegion+1)*sizeof(apNew[0])
3936 ); 4134 );
3937 if( !apNew ){ 4135 if( !apNew ){
3938 rc = SQLITE_IOERR_NOMEM; 4136 rc = SQLITE_IOERR_NOMEM_BKPT;
3939 goto shmpage_out; 4137 goto shmpage_out;
3940 } 4138 }
3941 pShmNode->aRegion = apNew; 4139 pShmNode->aRegion = apNew;
3942 4140
3943 while( pShmNode->nRegion<=iRegion ){ 4141 while( pShmNode->nRegion<=iRegion ){
3944 HANDLE hMap = NULL; /* file-mapping handle */ 4142 HANDLE hMap = NULL; /* file-mapping handle */
3945 void *pMap = 0; /* Mapped memory region */ 4143 void *pMap = 0; /* Mapped memory region */
3946 4144
3947 #if SQLITE_OS_WINRT 4145 #if SQLITE_OS_WINRT
3948 hMap = osCreateFileMappingFromApp(pShmNode->hFile.h, 4146 hMap = osCreateFileMappingFromApp(pShmNode->hFile.h,
3949 NULL, PAGE_READWRITE, nByte, NULL 4147 NULL, PAGE_READWRITE, nByte, NULL
3950 ); 4148 );
3951 #elif defined(SQLITE_WIN32_HAS_WIDE) 4149 #elif defined(SQLITE_WIN32_HAS_WIDE)
3952 hMap = osCreateFileMappingW(pShmNode->hFile.h, 4150 hMap = osCreateFileMappingW(pShmNode->hFile.h,
3953 NULL, PAGE_READWRITE, 0, nByte, NULL 4151 NULL, PAGE_READWRITE, 0, nByte, NULL
3954 ); 4152 );
3955 #elif defined(SQLITE_WIN32_HAS_ANSI) 4153 #elif defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_CREATEFILEMAPPINGA
3956 hMap = osCreateFileMappingA(pShmNode->hFile.h, 4154 hMap = osCreateFileMappingA(pShmNode->hFile.h,
3957 NULL, PAGE_READWRITE, 0, nByte, NULL 4155 NULL, PAGE_READWRITE, 0, nByte, NULL
3958 ); 4156 );
3959 #endif 4157 #endif
3960 OSTRACE(("SHM-MAP-CREATE pid=%lu, region=%d, size=%d, rc=%s\n", 4158 OSTRACE(("SHM-MAP-CREATE pid=%lu, region=%d, size=%d, rc=%s\n",
3961 osGetCurrentProcessId(), pShmNode->nRegion, nByte, 4159 osGetCurrentProcessId(), pShmNode->nRegion, nByte,
3962 hMap ? "ok" : "failed")); 4160 hMap ? "ok" : "failed"));
3963 if( hMap ){ 4161 if( hMap ){
3964 int iOffset = pShmNode->nRegion*szRegion; 4162 int iOffset = pShmNode->nRegion*szRegion;
3965 int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity; 4163 int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity;
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
4101 protect = PAGE_READWRITE; 4299 protect = PAGE_READWRITE;
4102 flags |= FILE_MAP_WRITE; 4300 flags |= FILE_MAP_WRITE;
4103 } 4301 }
4104 #endif 4302 #endif
4105 #if SQLITE_OS_WINRT 4303 #if SQLITE_OS_WINRT
4106 pFd->hMap = osCreateFileMappingFromApp(pFd->h, NULL, protect, nMap, NULL); 4304 pFd->hMap = osCreateFileMappingFromApp(pFd->h, NULL, protect, nMap, NULL);
4107 #elif defined(SQLITE_WIN32_HAS_WIDE) 4305 #elif defined(SQLITE_WIN32_HAS_WIDE)
4108 pFd->hMap = osCreateFileMappingW(pFd->h, NULL, protect, 4306 pFd->hMap = osCreateFileMappingW(pFd->h, NULL, protect,
4109 (DWORD)((nMap>>32) & 0xffffffff), 4307 (DWORD)((nMap>>32) & 0xffffffff),
4110 (DWORD)(nMap & 0xffffffff), NULL); 4308 (DWORD)(nMap & 0xffffffff), NULL);
4111 #elif defined(SQLITE_WIN32_HAS_ANSI) 4309 #elif defined(SQLITE_WIN32_HAS_ANSI) && SQLITE_WIN32_CREATEFILEMAPPINGA
4112 pFd->hMap = osCreateFileMappingA(pFd->h, NULL, protect, 4310 pFd->hMap = osCreateFileMappingA(pFd->h, NULL, protect,
4113 (DWORD)((nMap>>32) & 0xffffffff), 4311 (DWORD)((nMap>>32) & 0xffffffff),
4114 (DWORD)(nMap & 0xffffffff), NULL); 4312 (DWORD)(nMap & 0xffffffff), NULL);
4115 #endif 4313 #endif
4116 if( pFd->hMap==NULL ){ 4314 if( pFd->hMap==NULL ){
4117 pFd->lastErrno = osGetLastError(); 4315 pFd->lastErrno = osGetLastError();
4118 rc = winLogError(SQLITE_IOERR_MMAP, pFd->lastErrno, 4316 rc = winLogError(SQLITE_IOERR_MMAP, pFd->lastErrno,
4119 "winMapfile1", pFd->zPath); 4317 "winMapfile1", pFd->zPath);
4120 /* Log the error, but continue normal operation using xRead/xWrite */ 4318 /* Log the error, but continue normal operation using xRead/xWrite */
4121 OSTRACE(("MAP-FILE-CREATE pid=%lu, pFile=%p, rc=%s\n", 4319 OSTRACE(("MAP-FILE-CREATE pid=%lu, pFile=%p, rc=%s\n",
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
4262 winSectorSize, /* xSectorSize */ 4460 winSectorSize, /* xSectorSize */
4263 winDeviceCharacteristics, /* xDeviceCharacteristics */ 4461 winDeviceCharacteristics, /* xDeviceCharacteristics */
4264 winShmMap, /* xShmMap */ 4462 winShmMap, /* xShmMap */
4265 winShmLock, /* xShmLock */ 4463 winShmLock, /* xShmLock */
4266 winShmBarrier, /* xShmBarrier */ 4464 winShmBarrier, /* xShmBarrier */
4267 winShmUnmap, /* xShmUnmap */ 4465 winShmUnmap, /* xShmUnmap */
4268 winFetch, /* xFetch */ 4466 winFetch, /* xFetch */
4269 winUnfetch /* xUnfetch */ 4467 winUnfetch /* xUnfetch */
4270 }; 4468 };
4271 4469
4470 /*
4471 ** This vector defines all the methods that can operate on an
4472 ** sqlite3_file for win32 without performing any locking.
4473 */
4474 static const sqlite3_io_methods winIoNolockMethod = {
4475 3, /* iVersion */
4476 winClose, /* xClose */
4477 winRead, /* xRead */
4478 winWrite, /* xWrite */
4479 winTruncate, /* xTruncate */
4480 winSync, /* xSync */
4481 winFileSize, /* xFileSize */
4482 winNolockLock, /* xLock */
4483 winNolockUnlock, /* xUnlock */
4484 winNolockCheckReservedLock, /* xCheckReservedLock */
4485 winFileControl, /* xFileControl */
4486 winSectorSize, /* xSectorSize */
4487 winDeviceCharacteristics, /* xDeviceCharacteristics */
4488 winShmMap, /* xShmMap */
4489 winShmLock, /* xShmLock */
4490 winShmBarrier, /* xShmBarrier */
4491 winShmUnmap, /* xShmUnmap */
4492 winFetch, /* xFetch */
4493 winUnfetch /* xUnfetch */
4494 };
4495
4496 static winVfsAppData winAppData = {
4497 &winIoMethod, /* pMethod */
4498 0, /* pAppData */
4499 0 /* bNoLock */
4500 };
4501
4502 static winVfsAppData winNolockAppData = {
4503 &winIoNolockMethod, /* pMethod */
4504 0, /* pAppData */
4505 1 /* bNoLock */
4506 };
4507
4272 /**************************************************************************** 4508 /****************************************************************************
4273 **************************** sqlite3_vfs methods **************************** 4509 **************************** sqlite3_vfs methods ****************************
4274 ** 4510 **
4275 ** This division contains the implementation of methods on the 4511 ** This division contains the implementation of methods on the
4276 ** sqlite3_vfs object. 4512 ** sqlite3_vfs object.
4277 */ 4513 */
4278 4514
4279 #if defined(__CYGWIN__) 4515 #if defined(__CYGWIN__)
4280 /* 4516 /*
4281 ** Convert a filename from whatever the underlying operating system 4517 ** Convert a filename from whatever the underlying operating system
4282 ** supports for filenames into UTF-8. Space to hold the result is 4518 ** supports for filenames into UTF-8. Space to hold the result is
4283 ** obtained from malloc and must be freed by the calling function. 4519 ** obtained from malloc and must be freed by the calling function.
4284 */ 4520 */
4285 static char *winConvertToUtf8Filename(const void *zFilename){ 4521 static char *winConvertToUtf8Filename(const void *zFilename){
4286 char *zConverted = 0; 4522 char *zConverted = 0;
4287 if( osIsNT() ){ 4523 if( osIsNT() ){
4288 zConverted = winUnicodeToUtf8(zFilename); 4524 zConverted = winUnicodeToUtf8(zFilename);
4289 } 4525 }
4290 #ifdef SQLITE_WIN32_HAS_ANSI 4526 #ifdef SQLITE_WIN32_HAS_ANSI
4291 else{ 4527 else{
4292 zConverted = sqlite3_win32_mbcs_to_utf8(zFilename); 4528 zConverted = winMbcsToUtf8(zFilename, osAreFileApisANSI());
4293 } 4529 }
4294 #endif 4530 #endif
4295 /* caller will handle out of memory */ 4531 /* caller will handle out of memory */
4296 return zConverted; 4532 return zConverted;
4297 } 4533 }
4298 #endif 4534 #endif
4299 4535
4300 /* 4536 /*
4301 ** Convert a UTF-8 filename into whatever form the underlying 4537 ** Convert a UTF-8 filename into whatever form the underlying
4302 ** operating system wants filenames in. Space to hold the result 4538 ** operating system wants filenames in. Space to hold the result
4303 ** is obtained from malloc and must be freed by the calling 4539 ** is obtained from malloc and must be freed by the calling
4304 ** function. 4540 ** function.
4305 */ 4541 */
4306 static void *winConvertFromUtf8Filename(const char *zFilename){ 4542 static void *winConvertFromUtf8Filename(const char *zFilename){
4307 void *zConverted = 0; 4543 void *zConverted = 0;
4308 if( osIsNT() ){ 4544 if( osIsNT() ){
4309 zConverted = winUtf8ToUnicode(zFilename); 4545 zConverted = winUtf8ToUnicode(zFilename);
4310 } 4546 }
4311 #ifdef SQLITE_WIN32_HAS_ANSI 4547 #ifdef SQLITE_WIN32_HAS_ANSI
4312 else{ 4548 else{
4313 zConverted = sqlite3_win32_utf8_to_mbcs(zFilename); 4549 zConverted = winUtf8ToMbcs(zFilename, osAreFileApisANSI());
4314 } 4550 }
4315 #endif 4551 #endif
4316 /* caller will handle out of memory */ 4552 /* caller will handle out of memory */
4317 return zConverted; 4553 return zConverted;
4318 } 4554 }
4319 4555
4320 /* 4556 /*
4321 ** This function returns non-zero if the specified UTF-8 string buffer 4557 ** This function returns non-zero if the specified UTF-8 string buffer
4322 ** ends with a directory separator character or one was successfully 4558 ** ends with a directory separator character or one was successfully
4323 ** added to it. 4559 ** added to it.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
4358 */ 4594 */
4359 SimulateIOError( return SQLITE_IOERR ); 4595 SimulateIOError( return SQLITE_IOERR );
4360 4596
4361 /* Allocate a temporary buffer to store the fully qualified file 4597 /* Allocate a temporary buffer to store the fully qualified file
4362 ** name for the temporary file. If this fails, we cannot continue. 4598 ** name for the temporary file. If this fails, we cannot continue.
4363 */ 4599 */
4364 nMax = pVfs->mxPathname; nBuf = nMax + 2; 4600 nMax = pVfs->mxPathname; nBuf = nMax + 2;
4365 zBuf = sqlite3MallocZero( nBuf ); 4601 zBuf = sqlite3MallocZero( nBuf );
4366 if( !zBuf ){ 4602 if( !zBuf ){
4367 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); 4603 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n"));
4368 return SQLITE_IOERR_NOMEM; 4604 return SQLITE_IOERR_NOMEM_BKPT;
4369 } 4605 }
4370 4606
4371 /* Figure out the effective temporary directory. First, check if one 4607 /* Figure out the effective temporary directory. First, check if one
4372 ** has been explicitly set by the application; otherwise, use the one 4608 ** has been explicitly set by the application; otherwise, use the one
4373 ** configured by the operating system. 4609 ** configured by the operating system.
4374 */ 4610 */
4375 nDir = nMax - (nPre + 15); 4611 nDir = nMax - (nPre + 15);
4376 assert( nDir>0 ); 4612 assert( nDir>0 );
4377 if( sqlite3_temp_directory ){ 4613 if( sqlite3_temp_directory ){
4378 int nDirLen = sqlite3Strlen30(sqlite3_temp_directory); 4614 int nDirLen = sqlite3Strlen30(sqlite3_temp_directory);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
4416 /* If the path starts with a drive letter followed by the colon 4652 /* If the path starts with a drive letter followed by the colon
4417 ** character, assume it is already a native Win32 path; otherwise, 4653 ** character, assume it is already a native Win32 path; otherwise,
4418 ** it must be converted to a native Win32 path via the Cygwin API 4654 ** it must be converted to a native Win32 path via the Cygwin API
4419 ** prior to using it. 4655 ** prior to using it.
4420 */ 4656 */
4421 if( winIsDriveLetterAndColon(zDir) ){ 4657 if( winIsDriveLetterAndColon(zDir) ){
4422 zConverted = winConvertFromUtf8Filename(zDir); 4658 zConverted = winConvertFromUtf8Filename(zDir);
4423 if( !zConverted ){ 4659 if( !zConverted ){
4424 sqlite3_free(zBuf); 4660 sqlite3_free(zBuf);
4425 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); 4661 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n"));
4426 return SQLITE_IOERR_NOMEM; 4662 return SQLITE_IOERR_NOMEM_BKPT;
4427 } 4663 }
4428 if( winIsDir(zConverted) ){ 4664 if( winIsDir(zConverted) ){
4429 sqlite3_snprintf(nMax, zBuf, "%s", zDir); 4665 sqlite3_snprintf(nMax, zBuf, "%s", zDir);
4430 sqlite3_free(zConverted); 4666 sqlite3_free(zConverted);
4431 break; 4667 break;
4432 } 4668 }
4433 sqlite3_free(zConverted); 4669 sqlite3_free(zConverted);
4434 }else{ 4670 }else{
4435 zConverted = sqlite3MallocZero( nMax+1 ); 4671 zConverted = sqlite3MallocZero( nMax+1 );
4436 if( !zConverted ){ 4672 if( !zConverted ){
4437 sqlite3_free(zBuf); 4673 sqlite3_free(zBuf);
4438 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); 4674 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n"));
4439 return SQLITE_IOERR_NOMEM; 4675 return SQLITE_IOERR_NOMEM_BKPT;
4440 } 4676 }
4441 if( cygwin_conv_path( 4677 if( cygwin_conv_path(
4442 osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A, zDir, 4678 osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A, zDir,
4443 zConverted, nMax+1)<0 ){ 4679 zConverted, nMax+1)<0 ){
4444 sqlite3_free(zConverted); 4680 sqlite3_free(zConverted);
4445 sqlite3_free(zBuf); 4681 sqlite3_free(zBuf);
4446 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_CONVPATH\n")); 4682 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_CONVPATH\n"));
4447 return winLogError(SQLITE_IOERR_CONVPATH, (DWORD)errno, 4683 return winLogError(SQLITE_IOERR_CONVPATH, (DWORD)errno,
4448 "winGetTempname2", zDir); 4684 "winGetTempname2", zDir);
4449 } 4685 }
4450 if( winIsDir(zConverted) ){ 4686 if( winIsDir(zConverted) ){
4451 /* At this point, we know the candidate directory exists and should 4687 /* At this point, we know the candidate directory exists and should
4452 ** be used. However, we may need to convert the string containing 4688 ** be used. However, we may need to convert the string containing
4453 ** its name into UTF-8 (i.e. if it is UTF-16 right now). 4689 ** its name into UTF-8 (i.e. if it is UTF-16 right now).
4454 */ 4690 */
4455 char *zUtf8 = winConvertToUtf8Filename(zConverted); 4691 char *zUtf8 = winConvertToUtf8Filename(zConverted);
4456 if( !zUtf8 ){ 4692 if( !zUtf8 ){
4457 sqlite3_free(zConverted); 4693 sqlite3_free(zConverted);
4458 sqlite3_free(zBuf); 4694 sqlite3_free(zBuf);
4459 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); 4695 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n"));
4460 return SQLITE_IOERR_NOMEM; 4696 return SQLITE_IOERR_NOMEM_BKPT;
4461 } 4697 }
4462 sqlite3_snprintf(nMax, zBuf, "%s", zUtf8); 4698 sqlite3_snprintf(nMax, zBuf, "%s", zUtf8);
4463 sqlite3_free(zUtf8); 4699 sqlite3_free(zUtf8);
4464 sqlite3_free(zConverted); 4700 sqlite3_free(zConverted);
4465 break; 4701 break;
4466 } 4702 }
4467 sqlite3_free(zConverted); 4703 sqlite3_free(zConverted);
4468 } 4704 }
4469 } 4705 }
4470 } 4706 }
4471 #elif !SQLITE_OS_WINRT && !defined(__CYGWIN__) 4707 #elif !SQLITE_OS_WINRT && !defined(__CYGWIN__)
4472 else if( osIsNT() ){ 4708 else if( osIsNT() ){
4473 char *zMulti; 4709 char *zMulti;
4474 LPWSTR zWidePath = sqlite3MallocZero( nMax*sizeof(WCHAR) ); 4710 LPWSTR zWidePath = sqlite3MallocZero( nMax*sizeof(WCHAR) );
4475 if( !zWidePath ){ 4711 if( !zWidePath ){
4476 sqlite3_free(zBuf); 4712 sqlite3_free(zBuf);
4477 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); 4713 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n"));
4478 return SQLITE_IOERR_NOMEM; 4714 return SQLITE_IOERR_NOMEM_BKPT;
4479 } 4715 }
4480 if( osGetTempPathW(nMax, zWidePath)==0 ){ 4716 if( osGetTempPathW(nMax, zWidePath)==0 ){
4481 sqlite3_free(zWidePath); 4717 sqlite3_free(zWidePath);
4482 sqlite3_free(zBuf); 4718 sqlite3_free(zBuf);
4483 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_GETTEMPPATH\n")); 4719 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_GETTEMPPATH\n"));
4484 return winLogError(SQLITE_IOERR_GETTEMPPATH, osGetLastError(), 4720 return winLogError(SQLITE_IOERR_GETTEMPPATH, osGetLastError(),
4485 "winGetTempname2", 0); 4721 "winGetTempname2", 0);
4486 } 4722 }
4487 zMulti = winUnicodeToUtf8(zWidePath); 4723 zMulti = winUnicodeToUtf8(zWidePath);
4488 if( zMulti ){ 4724 if( zMulti ){
4489 sqlite3_snprintf(nMax, zBuf, "%s", zMulti); 4725 sqlite3_snprintf(nMax, zBuf, "%s", zMulti);
4490 sqlite3_free(zMulti); 4726 sqlite3_free(zMulti);
4491 sqlite3_free(zWidePath); 4727 sqlite3_free(zWidePath);
4492 }else{ 4728 }else{
4493 sqlite3_free(zWidePath); 4729 sqlite3_free(zWidePath);
4494 sqlite3_free(zBuf); 4730 sqlite3_free(zBuf);
4495 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); 4731 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n"));
4496 return SQLITE_IOERR_NOMEM; 4732 return SQLITE_IOERR_NOMEM_BKPT;
4497 } 4733 }
4498 } 4734 }
4499 #ifdef SQLITE_WIN32_HAS_ANSI 4735 #ifdef SQLITE_WIN32_HAS_ANSI
4500 else{ 4736 else{
4501 char *zUtf8; 4737 char *zUtf8;
4502 char *zMbcsPath = sqlite3MallocZero( nMax ); 4738 char *zMbcsPath = sqlite3MallocZero( nMax );
4503 if( !zMbcsPath ){ 4739 if( !zMbcsPath ){
4504 sqlite3_free(zBuf); 4740 sqlite3_free(zBuf);
4505 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); 4741 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n"));
4506 return SQLITE_IOERR_NOMEM; 4742 return SQLITE_IOERR_NOMEM_BKPT;
4507 } 4743 }
4508 if( osGetTempPathA(nMax, zMbcsPath)==0 ){ 4744 if( osGetTempPathA(nMax, zMbcsPath)==0 ){
4509 sqlite3_free(zBuf); 4745 sqlite3_free(zBuf);
4510 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_GETTEMPPATH\n")); 4746 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_GETTEMPPATH\n"));
4511 return winLogError(SQLITE_IOERR_GETTEMPPATH, osGetLastError(), 4747 return winLogError(SQLITE_IOERR_GETTEMPPATH, osGetLastError(),
4512 "winGetTempname3", 0); 4748 "winGetTempname3", 0);
4513 } 4749 }
4514 zUtf8 = sqlite3_win32_mbcs_to_utf8(zMbcsPath); 4750 zUtf8 = winMbcsToUtf8(zMbcsPath, osAreFileApisANSI());
4515 if( zUtf8 ){ 4751 if( zUtf8 ){
4516 sqlite3_snprintf(nMax, zBuf, "%s", zUtf8); 4752 sqlite3_snprintf(nMax, zBuf, "%s", zUtf8);
4517 sqlite3_free(zUtf8); 4753 sqlite3_free(zUtf8);
4518 }else{ 4754 }else{
4519 sqlite3_free(zBuf); 4755 sqlite3_free(zBuf);
4520 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n")); 4756 OSTRACE(("TEMP-FILENAME rc=SQLITE_IOERR_NOMEM\n"));
4521 return SQLITE_IOERR_NOMEM; 4757 return SQLITE_IOERR_NOMEM_BKPT;
4522 } 4758 }
4523 } 4759 }
4524 #endif /* SQLITE_WIN32_HAS_ANSI */ 4760 #endif /* SQLITE_WIN32_HAS_ANSI */
4525 #endif /* !SQLITE_OS_WINRT */ 4761 #endif /* !SQLITE_OS_WINRT */
4526 4762
4527 /* 4763 /*
4528 ** Check to make sure the temporary directory ends with an appropriate 4764 ** Check to make sure the temporary directory ends with an appropriate
4529 ** separator. If it does not and there is not enough space left to add 4765 ** separator. If it does not and there is not enough space left to add
4530 ** one, fail. 4766 ** one, fail.
4531 */ 4767 */
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
4594 attr = osGetFileAttributesA((char*)zConverted); 4830 attr = osGetFileAttributesA((char*)zConverted);
4595 #endif 4831 #endif
4596 } 4832 }
4597 return (attr!=INVALID_FILE_ATTRIBUTES) && (attr&FILE_ATTRIBUTE_DIRECTORY); 4833 return (attr!=INVALID_FILE_ATTRIBUTES) && (attr&FILE_ATTRIBUTE_DIRECTORY);
4598 } 4834 }
4599 4835
4600 /* 4836 /*
4601 ** Open a file. 4837 ** Open a file.
4602 */ 4838 */
4603 static int winOpen( 4839 static int winOpen(
4604 sqlite3_vfs *pVfs, /* Used to get maximum path name length */ 4840 sqlite3_vfs *pVfs, /* Used to get maximum path length and AppData */
4605 const char *zName, /* Name of the file (UTF-8) */ 4841 const char *zName, /* Name of the file (UTF-8) */
4606 sqlite3_file *id, /* Write the SQLite file handle here */ 4842 sqlite3_file *id, /* Write the SQLite file handle here */
4607 int flags, /* Open mode flags */ 4843 int flags, /* Open mode flags */
4608 int *pOutFlags /* Status return flags */ 4844 int *pOutFlags /* Status return flags */
4609 ){ 4845 ){
4610 HANDLE h; 4846 HANDLE h;
4611 DWORD lastErrno = 0; 4847 DWORD lastErrno = 0;
4612 DWORD dwDesiredAccess; 4848 DWORD dwDesiredAccess;
4613 DWORD dwShareMode; 4849 DWORD dwShareMode;
4614 DWORD dwCreationDisposition; 4850 DWORD dwCreationDisposition;
4615 DWORD dwFlagsAndAttributes = 0; 4851 DWORD dwFlagsAndAttributes = 0;
4616 #if SQLITE_OS_WINCE 4852 #if SQLITE_OS_WINCE
4617 int isTemp = 0; 4853 int isTemp = 0;
4618 #endif 4854 #endif
4855 winVfsAppData *pAppData;
4619 winFile *pFile = (winFile*)id; 4856 winFile *pFile = (winFile*)id;
4620 void *zConverted; /* Filename in OS encoding */ 4857 void *zConverted; /* Filename in OS encoding */
4621 const char *zUtf8Name = zName; /* Filename in UTF-8 encoding */ 4858 const char *zUtf8Name = zName; /* Filename in UTF-8 encoding */
4622 int cnt = 0; 4859 int cnt = 0;
4623 4860
4624 /* If argument zPath is a NULL pointer, this function is required to open 4861 /* If argument zPath is a NULL pointer, this function is required to open
4625 ** a temporary file. Use this buffer to store the file name in. 4862 ** a temporary file. Use this buffer to store the file name in.
4626 */ 4863 */
4627 char *zTmpname = 0; /* For temporary filename, if necessary. */ 4864 char *zTmpname = 0; /* For temporary filename, if necessary. */
4628 4865
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
4703 ** sqlite3_uri_parameter(). 4940 ** sqlite3_uri_parameter().
4704 */ 4941 */
4705 assert( (eType!=SQLITE_OPEN_MAIN_DB) || (flags & SQLITE_OPEN_URI) || 4942 assert( (eType!=SQLITE_OPEN_MAIN_DB) || (flags & SQLITE_OPEN_URI) ||
4706 zUtf8Name[sqlite3Strlen30(zUtf8Name)+1]==0 ); 4943 zUtf8Name[sqlite3Strlen30(zUtf8Name)+1]==0 );
4707 4944
4708 /* Convert the filename to the system encoding. */ 4945 /* Convert the filename to the system encoding. */
4709 zConverted = winConvertFromUtf8Filename(zUtf8Name); 4946 zConverted = winConvertFromUtf8Filename(zUtf8Name);
4710 if( zConverted==0 ){ 4947 if( zConverted==0 ){
4711 sqlite3_free(zTmpname); 4948 sqlite3_free(zTmpname);
4712 OSTRACE(("OPEN name=%s, rc=SQLITE_IOERR_NOMEM", zUtf8Name)); 4949 OSTRACE(("OPEN name=%s, rc=SQLITE_IOERR_NOMEM", zUtf8Name));
4713 return SQLITE_IOERR_NOMEM; 4950 return SQLITE_IOERR_NOMEM_BKPT;
4714 } 4951 }
4715 4952
4716 if( winIsDir(zConverted) ){ 4953 if( winIsDir(zConverted) ){
4717 sqlite3_free(zConverted); 4954 sqlite3_free(zConverted);
4718 sqlite3_free(zTmpname); 4955 sqlite3_free(zTmpname);
4719 OSTRACE(("OPEN name=%s, rc=SQLITE_CANTOPEN_ISDIR", zUtf8Name)); 4956 OSTRACE(("OPEN name=%s, rc=SQLITE_CANTOPEN_ISDIR", zUtf8Name));
4720 return SQLITE_CANTOPEN_ISDIR; 4957 return SQLITE_CANTOPEN_ISDIR;
4721 } 4958 }
4722 4959
4723 if( isReadWrite ){ 4960 if( isReadWrite ){
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
4830 *pOutFlags = SQLITE_OPEN_READWRITE; 5067 *pOutFlags = SQLITE_OPEN_READWRITE;
4831 }else{ 5068 }else{
4832 *pOutFlags = SQLITE_OPEN_READONLY; 5069 *pOutFlags = SQLITE_OPEN_READONLY;
4833 } 5070 }
4834 } 5071 }
4835 5072
4836 OSTRACE(("OPEN file=%p, name=%s, access=%lx, pOutFlags=%p, *pOutFlags=%d, " 5073 OSTRACE(("OPEN file=%p, name=%s, access=%lx, pOutFlags=%p, *pOutFlags=%d, "
4837 "rc=%s\n", h, zUtf8Name, dwDesiredAccess, pOutFlags, pOutFlags ? 5074 "rc=%s\n", h, zUtf8Name, dwDesiredAccess, pOutFlags, pOutFlags ?
4838 *pOutFlags : 0, (h==INVALID_HANDLE_VALUE) ? "failed" : "ok")); 5075 *pOutFlags : 0, (h==INVALID_HANDLE_VALUE) ? "failed" : "ok"));
4839 5076
5077 pAppData = (winVfsAppData*)pVfs->pAppData;
5078
4840 #if SQLITE_OS_WINCE 5079 #if SQLITE_OS_WINCE
4841 if( isReadWrite && eType==SQLITE_OPEN_MAIN_DB 5080 {
4842 && (rc = winceCreateLock(zName, pFile))!=SQLITE_OK 5081 if( isReadWrite && eType==SQLITE_OPEN_MAIN_DB
4843 ){ 5082 && ((pAppData==NULL) || !pAppData->bNoLock)
4844 osCloseHandle(h); 5083 && (rc = winceCreateLock(zName, pFile))!=SQLITE_OK
4845 sqlite3_free(zConverted); 5084 ){
4846 sqlite3_free(zTmpname); 5085 osCloseHandle(h);
4847 OSTRACE(("OPEN-CE-LOCK name=%s, rc=%s\n", zName, sqlite3ErrName(rc))); 5086 sqlite3_free(zConverted);
4848 return rc; 5087 sqlite3_free(zTmpname);
5088 OSTRACE(("OPEN-CE-LOCK name=%s, rc=%s\n", zName, sqlite3ErrName(rc)));
5089 return rc;
5090 }
4849 } 5091 }
4850 if( isTemp ){ 5092 if( isTemp ){
4851 pFile->zDeleteOnClose = zConverted; 5093 pFile->zDeleteOnClose = zConverted;
4852 }else 5094 }else
4853 #endif 5095 #endif
4854 { 5096 {
4855 sqlite3_free(zConverted); 5097 sqlite3_free(zConverted);
4856 } 5098 }
4857 5099
4858 sqlite3_free(zTmpname); 5100 sqlite3_free(zTmpname);
4859 pFile->pMethod = &winIoMethod; 5101 pFile->pMethod = pAppData ? pAppData->pMethod : &winIoMethod;
4860 pFile->pVfs = pVfs; 5102 pFile->pVfs = pVfs;
4861 pFile->h = h; 5103 pFile->h = h;
4862 if( isReadonly ){ 5104 if( isReadonly ){
4863 pFile->ctrlFlags |= WINFILE_RDONLY; 5105 pFile->ctrlFlags |= WINFILE_RDONLY;
4864 } 5106 }
4865 if( sqlite3_uri_boolean(zName, "psow", SQLITE_POWERSAFE_OVERWRITE) ){ 5107 if( sqlite3_uri_boolean(zName, "psow", SQLITE_POWERSAFE_OVERWRITE) ){
4866 pFile->ctrlFlags |= WINFILE_PSOW; 5108 pFile->ctrlFlags |= WINFILE_PSOW;
4867 } 5109 }
4868 pFile->lastErrno = NO_ERROR; 5110 pFile->lastErrno = NO_ERROR;
4869 pFile->zPath = zName; 5111 pFile->zPath = zName;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
4903 void *zConverted; 5145 void *zConverted;
4904 UNUSED_PARAMETER(pVfs); 5146 UNUSED_PARAMETER(pVfs);
4905 UNUSED_PARAMETER(syncDir); 5147 UNUSED_PARAMETER(syncDir);
4906 5148
4907 SimulateIOError(return SQLITE_IOERR_DELETE); 5149 SimulateIOError(return SQLITE_IOERR_DELETE);
4908 OSTRACE(("DELETE name=%s, syncDir=%d\n", zFilename, syncDir)); 5150 OSTRACE(("DELETE name=%s, syncDir=%d\n", zFilename, syncDir));
4909 5151
4910 zConverted = winConvertFromUtf8Filename(zFilename); 5152 zConverted = winConvertFromUtf8Filename(zFilename);
4911 if( zConverted==0 ){ 5153 if( zConverted==0 ){
4912 OSTRACE(("DELETE name=%s, rc=SQLITE_IOERR_NOMEM\n", zFilename)); 5154 OSTRACE(("DELETE name=%s, rc=SQLITE_IOERR_NOMEM\n", zFilename));
4913 return SQLITE_IOERR_NOMEM; 5155 return SQLITE_IOERR_NOMEM_BKPT;
4914 } 5156 }
4915 if( osIsNT() ){ 5157 if( osIsNT() ){
4916 do { 5158 do {
4917 #if SQLITE_OS_WINRT 5159 #if SQLITE_OS_WINRT
4918 WIN32_FILE_ATTRIBUTE_DATA sAttrData; 5160 WIN32_FILE_ATTRIBUTE_DATA sAttrData;
4919 memset(&sAttrData, 0, sizeof(sAttrData)); 5161 memset(&sAttrData, 0, sizeof(sAttrData));
4920 if ( osGetFileAttributesExW(zConverted, GetFileExInfoStandard, 5162 if ( osGetFileAttributesExW(zConverted, GetFileExInfoStandard,
4921 &sAttrData) ){ 5163 &sAttrData) ){
4922 attr = sAttrData.dwFileAttributes; 5164 attr = sAttrData.dwFileAttributes;
4923 }else{ 5165 }else{
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
5011 void *zConverted; 5253 void *zConverted;
5012 UNUSED_PARAMETER(pVfs); 5254 UNUSED_PARAMETER(pVfs);
5013 5255
5014 SimulateIOError( return SQLITE_IOERR_ACCESS; ); 5256 SimulateIOError( return SQLITE_IOERR_ACCESS; );
5015 OSTRACE(("ACCESS name=%s, flags=%x, pResOut=%p\n", 5257 OSTRACE(("ACCESS name=%s, flags=%x, pResOut=%p\n",
5016 zFilename, flags, pResOut)); 5258 zFilename, flags, pResOut));
5017 5259
5018 zConverted = winConvertFromUtf8Filename(zFilename); 5260 zConverted = winConvertFromUtf8Filename(zFilename);
5019 if( zConverted==0 ){ 5261 if( zConverted==0 ){
5020 OSTRACE(("ACCESS name=%s, rc=SQLITE_IOERR_NOMEM\n", zFilename)); 5262 OSTRACE(("ACCESS name=%s, rc=SQLITE_IOERR_NOMEM\n", zFilename));
5021 return SQLITE_IOERR_NOMEM; 5263 return SQLITE_IOERR_NOMEM_BKPT;
5022 } 5264 }
5023 if( osIsNT() ){ 5265 if( osIsNT() ){
5024 int cnt = 0; 5266 int cnt = 0;
5025 WIN32_FILE_ATTRIBUTE_DATA sAttrData; 5267 WIN32_FILE_ATTRIBUTE_DATA sAttrData;
5026 memset(&sAttrData, 0, sizeof(sAttrData)); 5268 memset(&sAttrData, 0, sizeof(sAttrData));
5027 while( !(rc = osGetFileAttributesExW((LPCWSTR)zConverted, 5269 while( !(rc = osGetFileAttributesExW((LPCWSTR)zConverted,
5028 GetFileExInfoStandard, 5270 GetFileExInfoStandard,
5029 &sAttrData)) && winRetryIoerr(&cnt, &lastErrno) ){} 5271 &sAttrData)) && winRetryIoerr(&cnt, &lastErrno) ){}
5030 if( rc ){ 5272 if( rc ){
5031 /* For an SQLITE_ACCESS_EXISTS query, treat a zero-length file 5273 /* For an SQLITE_ACCESS_EXISTS query, treat a zero-length file
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
5124 ** Turn a relative pathname into a full pathname. Write the full 5366 ** Turn a relative pathname into a full pathname. Write the full
5125 ** pathname into zOut[]. zOut[] will be at least pVfs->mxPathname 5367 ** pathname into zOut[]. zOut[] will be at least pVfs->mxPathname
5126 ** bytes in size. 5368 ** bytes in size.
5127 */ 5369 */
5128 static int winFullPathname( 5370 static int winFullPathname(
5129 sqlite3_vfs *pVfs, /* Pointer to vfs object */ 5371 sqlite3_vfs *pVfs, /* Pointer to vfs object */
5130 const char *zRelative, /* Possibly relative input path */ 5372 const char *zRelative, /* Possibly relative input path */
5131 int nFull, /* Size of output buffer in bytes */ 5373 int nFull, /* Size of output buffer in bytes */
5132 char *zFull /* Output buffer */ 5374 char *zFull /* Output buffer */
5133 ){ 5375 ){
5376 #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__)
5377 DWORD nByte;
5378 void *zConverted;
5379 char *zOut;
5380 #endif
5381
5382 /* If this path name begins with "/X:", where "X" is any alphabetic
5383 ** character, discard the initial "/" from the pathname.
5384 */
5385 if( zRelative[0]=='/' && winIsDriveLetterAndColon(zRelative+1) ){
5386 zRelative++;
5387 }
5134 5388
5135 #if defined(__CYGWIN__) 5389 #if defined(__CYGWIN__)
5136 SimulateIOError( return SQLITE_ERROR ); 5390 SimulateIOError( return SQLITE_ERROR );
5137 UNUSED_PARAMETER(nFull); 5391 UNUSED_PARAMETER(nFull);
5138 assert( nFull>=pVfs->mxPathname ); 5392 assert( nFull>=pVfs->mxPathname );
5139 if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){ 5393 if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){
5140 /* 5394 /*
5141 ** NOTE: We are dealing with a relative path name and the data 5395 ** NOTE: We are dealing with a relative path name and the data
5142 ** directory has been set. Therefore, use it as the basis 5396 ** directory has been set. Therefore, use it as the basis
5143 ** for converting the relative path name to an absolute 5397 ** for converting the relative path name to an absolute
5144 ** one by prepending the data directory and a slash. 5398 ** one by prepending the data directory and a slash.
5145 */ 5399 */
5146 char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 ); 5400 char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 );
5147 if( !zOut ){ 5401 if( !zOut ){
5148 return SQLITE_IOERR_NOMEM; 5402 return SQLITE_IOERR_NOMEM_BKPT;
5149 } 5403 }
5150 if( cygwin_conv_path( 5404 if( cygwin_conv_path(
5151 (osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A) | 5405 (osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A) |
5152 CCP_RELATIVE, zRelative, zOut, pVfs->mxPathname+1)<0 ){ 5406 CCP_RELATIVE, zRelative, zOut, pVfs->mxPathname+1)<0 ){
5153 sqlite3_free(zOut); 5407 sqlite3_free(zOut);
5154 return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno, 5408 return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno,
5155 "winFullPathname1", zRelative); 5409 "winFullPathname1", zRelative);
5156 }else{ 5410 }else{
5157 char *zUtf8 = winConvertToUtf8Filename(zOut); 5411 char *zUtf8 = winConvertToUtf8Filename(zOut);
5158 if( !zUtf8 ){ 5412 if( !zUtf8 ){
5159 sqlite3_free(zOut); 5413 sqlite3_free(zOut);
5160 return SQLITE_IOERR_NOMEM; 5414 return SQLITE_IOERR_NOMEM_BKPT;
5161 } 5415 }
5162 sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s", 5416 sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s",
5163 sqlite3_data_directory, winGetDirSep(), zUtf8); 5417 sqlite3_data_directory, winGetDirSep(), zUtf8);
5164 sqlite3_free(zUtf8); 5418 sqlite3_free(zUtf8);
5165 sqlite3_free(zOut); 5419 sqlite3_free(zOut);
5166 } 5420 }
5167 }else{ 5421 }else{
5168 char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 ); 5422 char *zOut = sqlite3MallocZero( pVfs->mxPathname+1 );
5169 if( !zOut ){ 5423 if( !zOut ){
5170 return SQLITE_IOERR_NOMEM; 5424 return SQLITE_IOERR_NOMEM_BKPT;
5171 } 5425 }
5172 if( cygwin_conv_path( 5426 if( cygwin_conv_path(
5173 (osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A), 5427 (osIsNT() ? CCP_POSIX_TO_WIN_W : CCP_POSIX_TO_WIN_A),
5174 zRelative, zOut, pVfs->mxPathname+1)<0 ){ 5428 zRelative, zOut, pVfs->mxPathname+1)<0 ){
5175 sqlite3_free(zOut); 5429 sqlite3_free(zOut);
5176 return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno, 5430 return winLogError(SQLITE_CANTOPEN_CONVPATH, (DWORD)errno,
5177 "winFullPathname2", zRelative); 5431 "winFullPathname2", zRelative);
5178 }else{ 5432 }else{
5179 char *zUtf8 = winConvertToUtf8Filename(zOut); 5433 char *zUtf8 = winConvertToUtf8Filename(zOut);
5180 if( !zUtf8 ){ 5434 if( !zUtf8 ){
5181 sqlite3_free(zOut); 5435 sqlite3_free(zOut);
5182 return SQLITE_IOERR_NOMEM; 5436 return SQLITE_IOERR_NOMEM_BKPT;
5183 } 5437 }
5184 sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zUtf8); 5438 sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zUtf8);
5185 sqlite3_free(zUtf8); 5439 sqlite3_free(zUtf8);
5186 sqlite3_free(zOut); 5440 sqlite3_free(zOut);
5187 } 5441 }
5188 } 5442 }
5189 return SQLITE_OK; 5443 return SQLITE_OK;
5190 #endif 5444 #endif
5191 5445
5192 #if (SQLITE_OS_WINCE || SQLITE_OS_WINRT) && !defined(__CYGWIN__) 5446 #if (SQLITE_OS_WINCE || SQLITE_OS_WINRT) && !defined(__CYGWIN__)
5193 SimulateIOError( return SQLITE_ERROR ); 5447 SimulateIOError( return SQLITE_ERROR );
5194 /* WinCE has no concept of a relative pathname, or so I am told. */ 5448 /* WinCE has no concept of a relative pathname, or so I am told. */
5195 /* WinRT has no way to convert a relative path to an absolute one. */ 5449 /* WinRT has no way to convert a relative path to an absolute one. */
5196 if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){ 5450 if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){
5197 /* 5451 /*
5198 ** NOTE: We are dealing with a relative path name and the data 5452 ** NOTE: We are dealing with a relative path name and the data
5199 ** directory has been set. Therefore, use it as the basis 5453 ** directory has been set. Therefore, use it as the basis
5200 ** for converting the relative path name to an absolute 5454 ** for converting the relative path name to an absolute
5201 ** one by prepending the data directory and a backslash. 5455 ** one by prepending the data directory and a backslash.
5202 */ 5456 */
5203 sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s", 5457 sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s",
5204 sqlite3_data_directory, winGetDirSep(), zRelative); 5458 sqlite3_data_directory, winGetDirSep(), zRelative);
5205 }else{ 5459 }else{
5206 sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zRelative); 5460 sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zRelative);
5207 } 5461 }
5208 return SQLITE_OK; 5462 return SQLITE_OK;
5209 #endif 5463 #endif
5210 5464
5211 #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__) 5465 #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && !defined(__CYGWIN__)
5212 DWORD nByte;
5213 void *zConverted;
5214 char *zOut;
5215
5216 /* If this path name begins with "/X:", where "X" is any alphabetic
5217 ** character, discard the initial "/" from the pathname.
5218 */
5219 if( zRelative[0]=='/' && winIsDriveLetterAndColon(zRelative+1) ){
5220 zRelative++;
5221 }
5222
5223 /* It's odd to simulate an io-error here, but really this is just 5466 /* It's odd to simulate an io-error here, but really this is just
5224 ** using the io-error infrastructure to test that SQLite handles this 5467 ** using the io-error infrastructure to test that SQLite handles this
5225 ** function failing. This function could fail if, for example, the 5468 ** function failing. This function could fail if, for example, the
5226 ** current working directory has been unlinked. 5469 ** current working directory has been unlinked.
5227 */ 5470 */
5228 SimulateIOError( return SQLITE_ERROR ); 5471 SimulateIOError( return SQLITE_ERROR );
5229 if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){ 5472 if ( sqlite3_data_directory && !winIsVerbatimPathname(zRelative) ){
5230 /* 5473 /*
5231 ** NOTE: We are dealing with a relative path name and the data 5474 ** NOTE: We are dealing with a relative path name and the data
5232 ** directory has been set. Therefore, use it as the basis 5475 ** directory has been set. Therefore, use it as the basis
5233 ** for converting the relative path name to an absolute 5476 ** for converting the relative path name to an absolute
5234 ** one by prepending the data directory and a backslash. 5477 ** one by prepending the data directory and a backslash.
5235 */ 5478 */
5236 sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s", 5479 sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s%c%s",
5237 sqlite3_data_directory, winGetDirSep(), zRelative); 5480 sqlite3_data_directory, winGetDirSep(), zRelative);
5238 return SQLITE_OK; 5481 return SQLITE_OK;
5239 } 5482 }
5240 zConverted = winConvertFromUtf8Filename(zRelative); 5483 zConverted = winConvertFromUtf8Filename(zRelative);
5241 if( zConverted==0 ){ 5484 if( zConverted==0 ){
5242 return SQLITE_IOERR_NOMEM; 5485 return SQLITE_IOERR_NOMEM_BKPT;
5243 } 5486 }
5244 if( osIsNT() ){ 5487 if( osIsNT() ){
5245 LPWSTR zTemp; 5488 LPWSTR zTemp;
5246 nByte = osGetFullPathNameW((LPCWSTR)zConverted, 0, 0, 0); 5489 nByte = osGetFullPathNameW((LPCWSTR)zConverted, 0, 0, 0);
5247 if( nByte==0 ){ 5490 if( nByte==0 ){
5248 sqlite3_free(zConverted); 5491 sqlite3_free(zConverted);
5249 return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), 5492 return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(),
5250 "winFullPathname1", zRelative); 5493 "winFullPathname1", zRelative);
5251 } 5494 }
5252 nByte += 3; 5495 nByte += 3;
5253 zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) ); 5496 zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) );
5254 if( zTemp==0 ){ 5497 if( zTemp==0 ){
5255 sqlite3_free(zConverted); 5498 sqlite3_free(zConverted);
5256 return SQLITE_IOERR_NOMEM; 5499 return SQLITE_IOERR_NOMEM_BKPT;
5257 } 5500 }
5258 nByte = osGetFullPathNameW((LPCWSTR)zConverted, nByte, zTemp, 0); 5501 nByte = osGetFullPathNameW((LPCWSTR)zConverted, nByte, zTemp, 0);
5259 if( nByte==0 ){ 5502 if( nByte==0 ){
5260 sqlite3_free(zConverted); 5503 sqlite3_free(zConverted);
5261 sqlite3_free(zTemp); 5504 sqlite3_free(zTemp);
5262 return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), 5505 return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(),
5263 "winFullPathname2", zRelative); 5506 "winFullPathname2", zRelative);
5264 } 5507 }
5265 sqlite3_free(zConverted); 5508 sqlite3_free(zConverted);
5266 zOut = winUnicodeToUtf8(zTemp); 5509 zOut = winUnicodeToUtf8(zTemp);
5267 sqlite3_free(zTemp); 5510 sqlite3_free(zTemp);
5268 } 5511 }
5269 #ifdef SQLITE_WIN32_HAS_ANSI 5512 #ifdef SQLITE_WIN32_HAS_ANSI
5270 else{ 5513 else{
5271 char *zTemp; 5514 char *zTemp;
5272 nByte = osGetFullPathNameA((char*)zConverted, 0, 0, 0); 5515 nByte = osGetFullPathNameA((char*)zConverted, 0, 0, 0);
5273 if( nByte==0 ){ 5516 if( nByte==0 ){
5274 sqlite3_free(zConverted); 5517 sqlite3_free(zConverted);
5275 return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), 5518 return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(),
5276 "winFullPathname3", zRelative); 5519 "winFullPathname3", zRelative);
5277 } 5520 }
5278 nByte += 3; 5521 nByte += 3;
5279 zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) ); 5522 zTemp = sqlite3MallocZero( nByte*sizeof(zTemp[0]) );
5280 if( zTemp==0 ){ 5523 if( zTemp==0 ){
5281 sqlite3_free(zConverted); 5524 sqlite3_free(zConverted);
5282 return SQLITE_IOERR_NOMEM; 5525 return SQLITE_IOERR_NOMEM_BKPT;
5283 } 5526 }
5284 nByte = osGetFullPathNameA((char*)zConverted, nByte, zTemp, 0); 5527 nByte = osGetFullPathNameA((char*)zConverted, nByte, zTemp, 0);
5285 if( nByte==0 ){ 5528 if( nByte==0 ){
5286 sqlite3_free(zConverted); 5529 sqlite3_free(zConverted);
5287 sqlite3_free(zTemp); 5530 sqlite3_free(zTemp);
5288 return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(), 5531 return winLogError(SQLITE_CANTOPEN_FULLPATH, osGetLastError(),
5289 "winFullPathname4", zRelative); 5532 "winFullPathname4", zRelative);
5290 } 5533 }
5291 sqlite3_free(zConverted); 5534 sqlite3_free(zConverted);
5292 zOut = sqlite3_win32_mbcs_to_utf8(zTemp); 5535 zOut = winMbcsToUtf8(zTemp, osAreFileApisANSI());
5293 sqlite3_free(zTemp); 5536 sqlite3_free(zTemp);
5294 } 5537 }
5295 #endif 5538 #endif
5296 if( zOut ){ 5539 if( zOut ){
5297 sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zOut); 5540 sqlite3_snprintf(MIN(nFull, pVfs->mxPathname), zFull, "%s", zOut);
5298 sqlite3_free(zOut); 5541 sqlite3_free(zOut);
5299 return SQLITE_OK; 5542 return SQLITE_OK;
5300 }else{ 5543 }else{
5301 return SQLITE_IOERR_NOMEM; 5544 return SQLITE_IOERR_NOMEM_BKPT;
5302 } 5545 }
5303 #endif 5546 #endif
5304 } 5547 }
5305 5548
5306 #ifndef SQLITE_OMIT_LOAD_EXTENSION 5549 #ifndef SQLITE_OMIT_LOAD_EXTENSION
5307 /* 5550 /*
5308 ** Interfaces for opening a shared library, finding entry points 5551 ** Interfaces for opening a shared library, finding entry points
5309 ** within the shared library, and closing the shared library. 5552 ** within the shared library, and closing the shared library.
5310 */ 5553 */
5311 static void *winDlOpen(sqlite3_vfs *pVfs, const char *zFilename){ 5554 static void *winDlOpen(sqlite3_vfs *pVfs, const char *zFilename){
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
5366 osFreeLibrary((HANDLE)pHandle); 5609 osFreeLibrary((HANDLE)pHandle);
5367 OSTRACE(("DLCLOSE handle=%p\n", (void*)pHandle)); 5610 OSTRACE(("DLCLOSE handle=%p\n", (void*)pHandle));
5368 } 5611 }
5369 #else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */ 5612 #else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */
5370 #define winDlOpen 0 5613 #define winDlOpen 0
5371 #define winDlError 0 5614 #define winDlError 0
5372 #define winDlSym 0 5615 #define winDlSym 0
5373 #define winDlClose 0 5616 #define winDlClose 0
5374 #endif 5617 #endif
5375 5618
5619 /* State information for the randomness gatherer. */
5620 typedef struct EntropyGatherer EntropyGatherer;
5621 struct EntropyGatherer {
5622 unsigned char *a; /* Gather entropy into this buffer */
5623 int na; /* Size of a[] in bytes */
5624 int i; /* XOR next input into a[i] */
5625 int nXor; /* Number of XOR operations done */
5626 };
5627
5628 #if !defined(SQLITE_TEST) && !defined(SQLITE_OMIT_RANDOMNESS)
5629 /* Mix sz bytes of entropy into p. */
5630 static void xorMemory(EntropyGatherer *p, unsigned char *x, int sz){
5631 int j, k;
5632 for(j=0, k=p->i; j<sz; j++){
5633 p->a[k++] ^= x[j];
5634 if( k>=p->na ) k = 0;
5635 }
5636 p->i = k;
5637 p->nXor += sz;
5638 }
5639 #endif /* !defined(SQLITE_TEST) && !defined(SQLITE_OMIT_RANDOMNESS) */
5376 5640
5377 /* 5641 /*
5378 ** Write up to nBuf bytes of randomness into zBuf. 5642 ** Write up to nBuf bytes of randomness into zBuf.
5379 */ 5643 */
5380 static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ 5644 static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
5381 int n = 0; 5645 #if defined(SQLITE_TEST) || defined(SQLITE_OMIT_RANDOMNESS)
5382 UNUSED_PARAMETER(pVfs); 5646 UNUSED_PARAMETER(pVfs);
5383 #if defined(SQLITE_TEST) || defined(SQLITE_OMIT_RANDOMNESS)
5384 n = nBuf;
5385 memset(zBuf, 0, nBuf); 5647 memset(zBuf, 0, nBuf);
5648 return nBuf;
5386 #else 5649 #else
5387 if( sizeof(SYSTEMTIME)<=nBuf-n ){ 5650 EntropyGatherer e;
5651 UNUSED_PARAMETER(pVfs);
5652 memset(zBuf, 0, nBuf);
5653 #if defined(_MSC_VER) && _MSC_VER>=1400 && !SQLITE_OS_WINCE
5654 rand_s((unsigned int*)zBuf); /* rand_s() is not available with MinGW */
5655 #endif /* defined(_MSC_VER) && _MSC_VER>=1400 */
5656 e.a = (unsigned char*)zBuf;
5657 e.na = nBuf;
5658 e.nXor = 0;
5659 e.i = 0;
5660 {
5388 SYSTEMTIME x; 5661 SYSTEMTIME x;
5389 osGetSystemTime(&x); 5662 osGetSystemTime(&x);
5390 memcpy(&zBuf[n], &x, sizeof(x)); 5663 xorMemory(&e, (unsigned char*)&x, sizeof(SYSTEMTIME));
5391 n += sizeof(x);
5392 } 5664 }
5393 if( sizeof(DWORD)<=nBuf-n ){ 5665 {
5394 DWORD pid = osGetCurrentProcessId(); 5666 DWORD pid = osGetCurrentProcessId();
5395 memcpy(&zBuf[n], &pid, sizeof(pid)); 5667 xorMemory(&e, (unsigned char*)&pid, sizeof(DWORD));
5396 n += sizeof(pid);
5397 } 5668 }
5398 #if SQLITE_OS_WINRT 5669 #if SQLITE_OS_WINRT
5399 if( sizeof(ULONGLONG)<=nBuf-n ){ 5670 {
5400 ULONGLONG cnt = osGetTickCount64(); 5671 ULONGLONG cnt = osGetTickCount64();
5401 memcpy(&zBuf[n], &cnt, sizeof(cnt)); 5672 xorMemory(&e, (unsigned char*)&cnt, sizeof(ULONGLONG));
5402 n += sizeof(cnt);
5403 } 5673 }
5404 #else 5674 #else
5405 if( sizeof(DWORD)<=nBuf-n ){ 5675 {
5406 DWORD cnt = osGetTickCount(); 5676 DWORD cnt = osGetTickCount();
5407 memcpy(&zBuf[n], &cnt, sizeof(cnt)); 5677 xorMemory(&e, (unsigned char*)&cnt, sizeof(DWORD));
5408 n += sizeof(cnt);
5409 } 5678 }
5410 #endif 5679 #endif /* SQLITE_OS_WINRT */
5411 if( sizeof(LARGE_INTEGER)<=nBuf-n ){ 5680 {
5412 LARGE_INTEGER i; 5681 LARGE_INTEGER i;
5413 osQueryPerformanceCounter(&i); 5682 osQueryPerformanceCounter(&i);
5414 memcpy(&zBuf[n], &i, sizeof(i)); 5683 xorMemory(&e, (unsigned char*)&i, sizeof(LARGE_INTEGER));
5415 n += sizeof(i);
5416 } 5684 }
5417 #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID 5685 #if !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID
5418 if( sizeof(UUID)<=nBuf-n ){ 5686 {
5419 UUID id; 5687 UUID id;
5420 memset(&id, 0, sizeof(UUID)); 5688 memset(&id, 0, sizeof(UUID));
5421 osUuidCreate(&id); 5689 osUuidCreate(&id);
5422 memcpy(&zBuf[n], &id, sizeof(UUID)); 5690 xorMemory(&e, (unsigned char*)&id, sizeof(UUID));
5423 n += sizeof(UUID);
5424 }
5425 if( sizeof(UUID)<=nBuf-n ){
5426 UUID id;
5427 memset(&id, 0, sizeof(UUID)); 5691 memset(&id, 0, sizeof(UUID));
5428 osUuidCreateSequential(&id); 5692 osUuidCreateSequential(&id);
5429 memcpy(&zBuf[n], &id, sizeof(UUID)); 5693 xorMemory(&e, (unsigned char*)&id, sizeof(UUID));
5430 n += sizeof(UUID);
5431 } 5694 }
5432 #endif 5695 #endif /* !SQLITE_OS_WINCE && !SQLITE_OS_WINRT && SQLITE_WIN32_USE_UUID */
5433 #endif /* defined(SQLITE_TEST) || defined(SQLITE_ZERO_PRNG_SEED) */ 5696 return e.nXor>nBuf ? nBuf : e.nXor;
5434 return n; 5697 #endif /* defined(SQLITE_TEST) || defined(SQLITE_OMIT_RANDOMNESS) */
5435 } 5698 }
5436 5699
5437 5700
5438 /* 5701 /*
5439 ** Sleep for a little while. Return the amount of time slept. 5702 ** Sleep for a little while. Return the amount of time slept.
5440 */ 5703 */
5441 static int winSleep(sqlite3_vfs *pVfs, int microsec){ 5704 static int winSleep(sqlite3_vfs *pVfs, int microsec){
5442 sqlite3_win32_sleep((microsec+999)/1000); 5705 sqlite3_win32_sleep((microsec+999)/1000);
5443 UNUSED_PARAMETER(pVfs); 5706 UNUSED_PARAMETER(pVfs);
5444 return ((microsec+999)/1000)*1000; 5707 return ((microsec+999)/1000)*1000;
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
5540 ** int xGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ 5803 ** int xGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
5541 ** assert(zBuf[0]=='\0'); 5804 ** assert(zBuf[0]=='\0');
5542 ** return 0; 5805 ** return 0;
5543 ** } 5806 ** }
5544 ** 5807 **
5545 ** However if an error message is supplied, it will be incorporated 5808 ** However if an error message is supplied, it will be incorporated
5546 ** by sqlite into the error message available to the user using 5809 ** by sqlite into the error message available to the user using
5547 ** sqlite3_errmsg(), possibly making IO errors easier to debug. 5810 ** sqlite3_errmsg(), possibly making IO errors easier to debug.
5548 */ 5811 */
5549 static int winGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ 5812 static int winGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){
5813 DWORD e = osGetLastError();
5550 UNUSED_PARAMETER(pVfs); 5814 UNUSED_PARAMETER(pVfs);
5551 return winGetLastErrorMsg(osGetLastError(), nBuf, zBuf); 5815 if( nBuf>0 ) winGetLastErrorMsg(e, nBuf, zBuf);
5816 return e;
5552 } 5817 }
5553 5818
5554 /* 5819 /*
5555 ** Initialize and deinitialize the operating system interface. 5820 ** Initialize and deinitialize the operating system interface.
5556 */ 5821 */
5557 int sqlite3_os_init(void){ 5822 int sqlite3_os_init(void){
5558 static sqlite3_vfs winVfs = { 5823 static sqlite3_vfs winVfs = {
5559 3, /* iVersion */ 5824 3, /* iVersion */
5560 sizeof(winFile), /* szOsFile */ 5825 sizeof(winFile), /* szOsFile */
5561 SQLITE_WIN32_MAX_PATH_BYTES, /* mxPathname */ 5826 SQLITE_WIN32_MAX_PATH_BYTES, /* mxPathname */
5562 0, /* pNext */ 5827 0, /* pNext */
5563 "win32", /* zName */ 5828 "win32", /* zName */
5564 0, /* pAppData */ 5829 &winAppData, /* pAppData */
5565 winOpen, /* xOpen */ 5830 winOpen, /* xOpen */
5566 winDelete, /* xDelete */ 5831 winDelete, /* xDelete */
5567 winAccess, /* xAccess */ 5832 winAccess, /* xAccess */
5568 winFullPathname, /* xFullPathname */ 5833 winFullPathname, /* xFullPathname */
5569 winDlOpen, /* xDlOpen */ 5834 winDlOpen, /* xDlOpen */
5570 winDlError, /* xDlError */ 5835 winDlError, /* xDlError */
5571 winDlSym, /* xDlSym */ 5836 winDlSym, /* xDlSym */
5572 winDlClose, /* xDlClose */ 5837 winDlClose, /* xDlClose */
5573 winRandomness, /* xRandomness */ 5838 winRandomness, /* xRandomness */
5574 winSleep, /* xSleep */ 5839 winSleep, /* xSleep */
5575 winCurrentTime, /* xCurrentTime */ 5840 winCurrentTime, /* xCurrentTime */
5576 winGetLastError, /* xGetLastError */ 5841 winGetLastError, /* xGetLastError */
5577 winCurrentTimeInt64, /* xCurrentTimeInt64 */ 5842 winCurrentTimeInt64, /* xCurrentTimeInt64 */
5578 winSetSystemCall, /* xSetSystemCall */ 5843 winSetSystemCall, /* xSetSystemCall */
5579 winGetSystemCall, /* xGetSystemCall */ 5844 winGetSystemCall, /* xGetSystemCall */
5580 winNextSystemCall, /* xNextSystemCall */ 5845 winNextSystemCall, /* xNextSystemCall */
5581 }; 5846 };
5582 #if defined(SQLITE_WIN32_HAS_WIDE) 5847 #if defined(SQLITE_WIN32_HAS_WIDE)
5583 static sqlite3_vfs winLongPathVfs = { 5848 static sqlite3_vfs winLongPathVfs = {
5584 3, /* iVersion */ 5849 3, /* iVersion */
5585 sizeof(winFile), /* szOsFile */ 5850 sizeof(winFile), /* szOsFile */
5586 SQLITE_WINNT_MAX_PATH_BYTES, /* mxPathname */ 5851 SQLITE_WINNT_MAX_PATH_BYTES, /* mxPathname */
5587 0, /* pNext */ 5852 0, /* pNext */
5588 "win32-longpath", /* zName */ 5853 "win32-longpath", /* zName */
5589 0, /* pAppData */ 5854 &winAppData, /* pAppData */
5590 winOpen, /* xOpen */ 5855 winOpen, /* xOpen */
5591 winDelete, /* xDelete */ 5856 winDelete, /* xDelete */
5592 winAccess, /* xAccess */ 5857 winAccess, /* xAccess */
5593 winFullPathname, /* xFullPathname */ 5858 winFullPathname, /* xFullPathname */
5594 winDlOpen, /* xDlOpen */ 5859 winDlOpen, /* xDlOpen */
5595 winDlError, /* xDlError */ 5860 winDlError, /* xDlError */
5596 winDlSym, /* xDlSym */ 5861 winDlSym, /* xDlSym */
5597 winDlClose, /* xDlClose */ 5862 winDlClose, /* xDlClose */
5598 winRandomness, /* xRandomness */ 5863 winRandomness, /* xRandomness */
5599 winSleep, /* xSleep */ 5864 winSleep, /* xSleep */
5600 winCurrentTime, /* xCurrentTime */ 5865 winCurrentTime, /* xCurrentTime */
5601 winGetLastError, /* xGetLastError */ 5866 winGetLastError, /* xGetLastError */
5602 winCurrentTimeInt64, /* xCurrentTimeInt64 */ 5867 winCurrentTimeInt64, /* xCurrentTimeInt64 */
5603 winSetSystemCall, /* xSetSystemCall */ 5868 winSetSystemCall, /* xSetSystemCall */
5604 winGetSystemCall, /* xGetSystemCall */ 5869 winGetSystemCall, /* xGetSystemCall */
5605 winNextSystemCall, /* xNextSystemCall */ 5870 winNextSystemCall, /* xNextSystemCall */
5871 };
5872 #endif
5873 static sqlite3_vfs winNolockVfs = {
5874 3, /* iVersion */
5875 sizeof(winFile), /* szOsFile */
5876 SQLITE_WIN32_MAX_PATH_BYTES, /* mxPathname */
5877 0, /* pNext */
5878 "win32-none", /* zName */
5879 &winNolockAppData, /* pAppData */
5880 winOpen, /* xOpen */
5881 winDelete, /* xDelete */
5882 winAccess, /* xAccess */
5883 winFullPathname, /* xFullPathname */
5884 winDlOpen, /* xDlOpen */
5885 winDlError, /* xDlError */
5886 winDlSym, /* xDlSym */
5887 winDlClose, /* xDlClose */
5888 winRandomness, /* xRandomness */
5889 winSleep, /* xSleep */
5890 winCurrentTime, /* xCurrentTime */
5891 winGetLastError, /* xGetLastError */
5892 winCurrentTimeInt64, /* xCurrentTimeInt64 */
5893 winSetSystemCall, /* xSetSystemCall */
5894 winGetSystemCall, /* xGetSystemCall */
5895 winNextSystemCall, /* xNextSystemCall */
5896 };
5897 #if defined(SQLITE_WIN32_HAS_WIDE)
5898 static sqlite3_vfs winLongPathNolockVfs = {
5899 3, /* iVersion */
5900 sizeof(winFile), /* szOsFile */
5901 SQLITE_WINNT_MAX_PATH_BYTES, /* mxPathname */
5902 0, /* pNext */
5903 "win32-longpath-none", /* zName */
5904 &winNolockAppData, /* pAppData */
5905 winOpen, /* xOpen */
5906 winDelete, /* xDelete */
5907 winAccess, /* xAccess */
5908 winFullPathname, /* xFullPathname */
5909 winDlOpen, /* xDlOpen */
5910 winDlError, /* xDlError */
5911 winDlSym, /* xDlSym */
5912 winDlClose, /* xDlClose */
5913 winRandomness, /* xRandomness */
5914 winSleep, /* xSleep */
5915 winCurrentTime, /* xCurrentTime */
5916 winGetLastError, /* xGetLastError */
5917 winCurrentTimeInt64, /* xCurrentTimeInt64 */
5918 winSetSystemCall, /* xSetSystemCall */
5919 winGetSystemCall, /* xGetSystemCall */
5920 winNextSystemCall, /* xNextSystemCall */
5606 }; 5921 };
5607 #endif 5922 #endif
5608 5923
5609 /* Double-check that the aSyscall[] array has been constructed 5924 /* Double-check that the aSyscall[] array has been constructed
5610 ** correctly. See ticket [bb3a86e890c8e96ab] */ 5925 ** correctly. See ticket [bb3a86e890c8e96ab] */
5611 assert( ArraySize(aSyscall)==80 ); 5926 assert( ArraySize(aSyscall)==80 );
5612 5927
5613 /* get memory map allocation granularity */ 5928 /* get memory map allocation granularity */
5614 memset(&winSysInfo, 0, sizeof(SYSTEM_INFO)); 5929 memset(&winSysInfo, 0, sizeof(SYSTEM_INFO));
5615 #if SQLITE_OS_WINRT 5930 #if SQLITE_OS_WINRT
5616 osGetNativeSystemInfo(&winSysInfo); 5931 osGetNativeSystemInfo(&winSysInfo);
5617 #else 5932 #else
5618 osGetSystemInfo(&winSysInfo); 5933 osGetSystemInfo(&winSysInfo);
5619 #endif 5934 #endif
5620 assert( winSysInfo.dwAllocationGranularity>0 ); 5935 assert( winSysInfo.dwAllocationGranularity>0 );
5621 assert( winSysInfo.dwPageSize>0 ); 5936 assert( winSysInfo.dwPageSize>0 );
5622 5937
5623 sqlite3_vfs_register(&winVfs, 1); 5938 sqlite3_vfs_register(&winVfs, 1);
5624 5939
5625 #if defined(SQLITE_WIN32_HAS_WIDE) 5940 #if defined(SQLITE_WIN32_HAS_WIDE)
5626 sqlite3_vfs_register(&winLongPathVfs, 0); 5941 sqlite3_vfs_register(&winLongPathVfs, 0);
5627 #endif 5942 #endif
5628 5943
5944 sqlite3_vfs_register(&winNolockVfs, 0);
5945
5946 #if defined(SQLITE_WIN32_HAS_WIDE)
5947 sqlite3_vfs_register(&winLongPathNolockVfs, 0);
5948 #endif
5949
5629 return SQLITE_OK; 5950 return SQLITE_OK;
5630 } 5951 }
5631 5952
5632 int sqlite3_os_end(void){ 5953 int sqlite3_os_end(void){
5633 #if SQLITE_OS_WINRT 5954 #if SQLITE_OS_WINRT
5634 if( sleepObj!=NULL ){ 5955 if( sleepObj!=NULL ){
5635 osCloseHandle(sleepObj); 5956 osCloseHandle(sleepObj);
5636 sleepObj = NULL; 5957 sleepObj = NULL;
5637 } 5958 }
5638 #endif 5959 #endif
5639 return SQLITE_OK; 5960 return SQLITE_OK;
5640 } 5961 }
5641 5962
5642 CHROMIUM_SQLITE_API 5963 CHROMIUM_SQLITE_API
5643 void chromium_sqlite3_initialize_win_sqlite3_file(sqlite3_file* file, HANDLE han dle) { 5964 void chromium_sqlite3_initialize_win_sqlite3_file(sqlite3_file* file, HANDLE han dle) {
5644 winFile* winSQLite3File = (winFile*)file; 5965 winFile* winSQLite3File = (winFile*)file;
5645 memset(file, 0, sizeof(*file)); 5966 memset(file, 0, sizeof(*file));
5646 winSQLite3File->pMethod = &winIoMethod; 5967 winSQLite3File->pMethod = &winIoMethod;
5647 winSQLite3File->h = handle; 5968 winSQLite3File->h = handle;
5648 } 5969 }
5649 5970
5650 #endif /* SQLITE_OS_WIN */ 5971 #endif /* SQLITE_OS_WIN */
OLDNEW
« no previous file with comments | « third_party/sqlite/src/src/os_win.h ('k') | third_party/sqlite/src/src/pager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698