1/* 2** 2004 May 22 3** 4** The author disclaims copyright to this source code. In place of 5** a legal notice, here is a blessing: 6** 7** May you do good and not evil. 8** May you find forgiveness for yourself and forgive others. 9** May you share freely, never taking more than you give. 10** 11****************************************************************************** 12** 13** This file contains code that is specific to windows. 14*/ 15#include "sqliteInt.h" 16#if SQLITE_OS_WIN /* This file is used for windows only */ 17 18 19/* 20** A Note About Memory Allocation: 21** 22** This driver uses malloc()/free() directly rather than going through 23** the SQLite-wrappers sqlite3_malloc()/sqlite3_free(). Those wrappers 24** are designed for use on embedded systems where memory is scarce and 25** malloc failures happen frequently. Win32 does not typically run on 26** embedded systems, and when it does the developers normally have bigger 27** problems to worry about than running out of memory. So there is not 28** a compelling need to use the wrappers. 29** 30** But there is a good reason to not use the wrappers. If we use the 31** wrappers then we will get simulated malloc() failures within this 32** driver. And that causes all kinds of problems for our tests. We 33** could enhance SQLite to deal with simulated malloc failures within 34** the OS driver, but the code to deal with those failure would not 35** be exercised on Linux (which does not need to malloc() in the driver) 36** and so we would have difficulty writing coverage tests for that 37** code. Better to leave the code out, we think. 38** 39** The point of this discussion is as follows: When creating a new 40** OS layer for an embedded system, if you use this file as an example, 41** avoid the use of malloc()/free(). Those routines work ok on windows 42** desktops but not so well in embedded systems. 43*/ 44 45#include <winbase.h> 46 47#ifdef __CYGWIN__ 48# include <sys/cygwin.h> 49#endif 50 51/* 52** Macros used to determine whether or not to use threads. 53*/ 54#if defined(THREADSAFE) && THREADSAFE 55# define SQLITE_W32_THREADS 1 56#endif 57 58/* 59** Include code that is common to all os_*.c files 60*/ 61#include "os_common.h" 62 63/* 64** Some microsoft compilers lack this definition. 65*/ 66#ifndef INVALID_FILE_ATTRIBUTES 67# define INVALID_FILE_ATTRIBUTES ((DWORD)-1) 68#endif 69 70/* 71** Determine if we are dealing with WindowsCE - which has a much 72** reduced API. 73*/ 74#if SQLITE_OS_WINCE 75# define AreFileApisANSI() 1 76# define FormatMessageW(a,b,c,d,e,f,g) 0 77#endif 78 79/* Forward references */ 80typedef struct winShm winShm; /* A connection to shared-memory */ 81typedef struct winShmNode winShmNode; /* A region of shared-memory */ 82 83/* 84** WinCE lacks native support for file locking so we have to fake it 85** with some code of our own. 86*/ 87#if SQLITE_OS_WINCE 88typedef struct winceLock { 89 int nReaders; /* Number of reader locks obtained */ 90 BOOL bPending; /* Indicates a pending lock has been obtained */ 91 BOOL bReserved; /* Indicates a reserved lock has been obtained */ 92 BOOL bExclusive; /* Indicates an exclusive lock has been obtained */ 93} winceLock; 94#endif 95 96/* 97** The winFile structure is a subclass of sqlite3_file* specific to the win32 98** portability layer. 99*/ 100typedef struct winFile winFile; 101struct winFile { 102 const sqlite3_io_methods *pMethod; /*** Must be first ***/ 103 sqlite3_vfs *pVfs; /* The VFS used to open this file */ 104 HANDLE h; /* Handle for accessing the file */ 105 unsigned char locktype; /* Type of lock currently held on this file */ 106 short sharedLockByte; /* Randomly chosen byte used as a shared lock */ 107 DWORD lastErrno; /* The Windows errno from the last I/O error */ 108 DWORD sectorSize; /* Sector size of the device file is on */ 109 winShm *pShm; /* Instance of shared memory on this file */ 110 const char *zPath; /* Full pathname of this file */ 111 int szChunk; /* Chunk size configured by FCNTL_CHUNK_SIZE */ 112#if SQLITE_OS_WINCE 113 WCHAR *zDeleteOnClose; /* Name of file to delete when closing */ 114 HANDLE hMutex; /* Mutex used to control access to shared lock */ 115 HANDLE hShared; /* Shared memory segment used for locking */ 116 winceLock local; /* Locks obtained by this instance of winFile */ 117 winceLock *shared; /* Global shared lock memory for the file */ 118#endif 119}; 120 121/* 122** Forward prototypes. 123*/ 124static int getSectorSize( 125 sqlite3_vfs *pVfs, 126 const char *zRelative /* UTF-8 file name */ 127); 128 129/* 130** The following variable is (normally) set once and never changes 131** thereafter. It records whether the operating system is Win95 132** or WinNT. 133** 134** 0: Operating system unknown. 135** 1: Operating system is Win95. 136** 2: Operating system is WinNT. 137** 138** In order to facilitate testing on a WinNT system, the test fixture 139** can manually set this value to 1 to emulate Win98 behavior. 140*/ 141#ifdef SQLITE_TEST 142int sqlite3_os_type = 0; 143#else 144static int sqlite3_os_type = 0; 145#endif 146 147/* 148** Return true (non-zero) if we are running under WinNT, Win2K, WinXP, 149** or WinCE. Return false (zero) for Win95, Win98, or WinME. 150** 151** Here is an interesting observation: Win95, Win98, and WinME lack 152** the LockFileEx() API. But we can still statically link against that 153** API as long as we don't call it when running Win95/98/ME. A call to 154** this routine is used to determine if the host is Win95/98/ME or 155** WinNT/2K/XP so that we will know whether or not we can safely call 156** the LockFileEx() API. 157*/ 158#if SQLITE_OS_WINCE 159# define isNT() (1) 160#else 161 static int isNT(void){ 162 if( sqlite3_os_type==0 ){ 163 OSVERSIONINFO sInfo; 164 sInfo.dwOSVersionInfoSize = sizeof(sInfo); 165 GetVersionEx(&sInfo); 166 sqlite3_os_type = sInfo.dwPlatformId==VER_PLATFORM_WIN32_NT ? 2 : 1; 167 } 168 return sqlite3_os_type==2; 169 } 170#endif /* SQLITE_OS_WINCE */ 171 172/* 173** Convert a UTF-8 string to microsoft unicode (UTF-16?). 174** 175** Space to hold the returned string is obtained from malloc. 176*/ 177static WCHAR *utf8ToUnicode(const char *zFilename){ 178 int nChar; 179 WCHAR *zWideFilename; 180 181 nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, NULL, 0); 182 zWideFilename = malloc( nChar*sizeof(zWideFilename[0]) ); 183 if( zWideFilename==0 ){ 184 return 0; 185 } 186 nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, zWideFilename, nChar); 187 if( nChar==0 ){ 188 free(zWideFilename); 189 zWideFilename = 0; 190 } 191 return zWideFilename; 192} 193 194/* 195** Convert microsoft unicode to UTF-8. Space to hold the returned string is 196** obtained from malloc(). 197*/ 198static char *unicodeToUtf8(const WCHAR *zWideFilename){ 199 int nByte; 200 char *zFilename; 201 202 nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, 0, 0, 0, 0); 203 zFilename = malloc( nByte ); 204 if( zFilename==0 ){ 205 return 0; 206 } 207 nByte = WideCharToMultiByte(CP_UTF8, 0, zWideFilename, -1, zFilename, nByte, 208 0, 0); 209 if( nByte == 0 ){ 210 free(zFilename); 211 zFilename = 0; 212 } 213 return zFilename; 214} 215 216/* 217** Convert an ansi string to microsoft unicode, based on the 218** current codepage settings for file apis. 219** 220** Space to hold the returned string is obtained 221** from malloc. 222*/ 223static WCHAR *mbcsToUnicode(const char *zFilename){ 224 int nByte; 225 WCHAR *zMbcsFilename; 226 int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP; 227 228 nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, NULL,0)*sizeof(WCHAR); 229 zMbcsFilename = malloc( nByte*sizeof(zMbcsFilename[0]) ); 230 if( zMbcsFilename==0 ){ 231 return 0; 232 } 233 nByte = MultiByteToWideChar(codepage, 0, zFilename, -1, zMbcsFilename, nByte); 234 if( nByte==0 ){ 235 free(zMbcsFilename); 236 zMbcsFilename = 0; 237 } 238 return zMbcsFilename; 239} 240 241/* 242** Convert microsoft unicode to multibyte character string, based on the 243** user's Ansi codepage. 244** 245** Space to hold the returned string is obtained from 246** malloc(). 247*/ 248static char *unicodeToMbcs(const WCHAR *zWideFilename){ 249 int nByte; 250 char *zFilename; 251 int codepage = AreFileApisANSI() ? CP_ACP : CP_OEMCP; 252 253 nByte = WideCharToMultiByte(codepage, 0, zWideFilename, -1, 0, 0, 0, 0); 254 zFilename = malloc( nByte ); 255 if( zFilename==0 ){ 256 return 0; 257 } 258 nByte = WideCharToMultiByte(codepage, 0, zWideFilename, -1, zFilename, nByte, 259 0, 0); 260 if( nByte == 0 ){ 261 free(zFilename); 262 zFilename = 0; 263 } 264 return zFilename; 265} 266 267/* 268** Convert multibyte character string to UTF-8. Space to hold the 269** returned string is obtained from malloc(). 270*/ 271char *sqlite3_win32_mbcs_to_utf8(const char *zFilename){ 272 char *zFilenameUtf8; 273 WCHAR *zTmpWide; 274 275 zTmpWide = mbcsToUnicode(zFilename); 276 if( zTmpWide==0 ){ 277 return 0; 278 } 279 zFilenameUtf8 = unicodeToUtf8(zTmpWide); 280 free(zTmpWide); 281 return zFilenameUtf8; 282} 283 284/* 285** Convert UTF-8 to multibyte character string. Space to hold the 286** returned string is obtained from malloc(). 287*/ 288static char *utf8ToMbcs(const char *zFilename){ 289 char *zFilenameMbcs; 290 WCHAR *zTmpWide; 291 292 zTmpWide = utf8ToUnicode(zFilename); 293 if( zTmpWide==0 ){ 294 return 0; 295 } 296 zFilenameMbcs = unicodeToMbcs(zTmpWide); 297 free(zTmpWide); 298 return zFilenameMbcs; 299} 300 301#if SQLITE_OS_WINCE 302/************************************************************************* 303** This section contains code for WinCE only. 304*/ 305/* 306** WindowsCE does not have a localtime() function. So create a 307** substitute. 308*/ 309#include <time.h> 310struct tm *__cdecl localtime(const time_t *t) 311{ 312 static struct tm y; 313 FILETIME uTm, lTm; 314 SYSTEMTIME pTm; 315 sqlite3_int64 t64; 316 t64 = *t; 317 t64 = (t64 + 11644473600)*10000000; 318 uTm.dwLowDateTime = (DWORD)(t64 & 0xFFFFFFFF); 319 uTm.dwHighDateTime= (DWORD)(t64 >> 32); 320 FileTimeToLocalFileTime(&uTm,&lTm); 321 FileTimeToSystemTime(&lTm,&pTm); 322 y.tm_year = pTm.wYear - 1900; 323 y.tm_mon = pTm.wMonth - 1; 324 y.tm_wday = pTm.wDayOfWeek; 325 y.tm_mday = pTm.wDay; 326 y.tm_hour = pTm.wHour; 327 y.tm_min = pTm.wMinute; 328 y.tm_sec = pTm.wSecond; 329 return &y; 330} 331 332/* This will never be called, but defined to make the code compile */ 333#define GetTempPathA(a,b) 334 335#define LockFile(a,b,c,d,e) winceLockFile(&a, b, c, d, e) 336#define UnlockFile(a,b,c,d,e) winceUnlockFile(&a, b, c, d, e) 337#define LockFileEx(a,b,c,d,e,f) winceLockFileEx(&a, b, c, d, e, f) 338 339#define HANDLE_TO_WINFILE(a) (winFile*)&((char*)a)[-(int)offsetof(winFile,h)] 340 341/* 342** Acquire a lock on the handle h 343*/ 344static void winceMutexAcquire(HANDLE h){ 345 DWORD dwErr; 346 do { 347 dwErr = WaitForSingleObject(h, INFINITE); 348 } while (dwErr != WAIT_OBJECT_0 && dwErr != WAIT_ABANDONED); 349} 350/* 351** Release a lock acquired by winceMutexAcquire() 352*/ 353#define winceMutexRelease(h) ReleaseMutex(h) 354 355/* 356** Create the mutex and shared memory used for locking in the file 357** descriptor pFile 358*/ 359static BOOL winceCreateLock(const char *zFilename, winFile *pFile){ 360 WCHAR *zTok; 361 WCHAR *zName = utf8ToUnicode(zFilename); 362 BOOL bInit = TRUE; 363 364 /* Initialize the local lockdata */ 365 ZeroMemory(&pFile->local, sizeof(pFile->local)); 366 367 /* Replace the backslashes from the filename and lowercase it 368 ** to derive a mutex name. */ 369 zTok = CharLowerW(zName); 370 for (;*zTok;zTok++){ 371 if (*zTok == '\\') *zTok = '_'; 372 } 373 374 /* Create/open the named mutex */ 375 pFile->hMutex = CreateMutexW(NULL, FALSE, zName); 376 if (!pFile->hMutex){ 377 pFile->lastErrno = GetLastError(); 378 free(zName); 379 return FALSE; 380 } 381 382 /* Acquire the mutex before continuing */ 383 winceMutexAcquire(pFile->hMutex); 384 385 /* Since the names of named mutexes, semaphores, file mappings etc are 386 ** case-sensitive, take advantage of that by uppercasing the mutex name 387 ** and using that as the shared filemapping name. 388 */ 389 CharUpperW(zName); 390 pFile->hShared = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, 391 PAGE_READWRITE, 0, sizeof(winceLock), 392 zName); 393 394 /* Set a flag that indicates we're the first to create the memory so it 395 ** must be zero-initialized */ 396 if (GetLastError() == ERROR_ALREADY_EXISTS){ 397 bInit = FALSE; 398 } 399 400 free(zName); 401 402 /* If we succeeded in making the shared memory handle, map it. */ 403 if (pFile->hShared){ 404 pFile->shared = (winceLock*)MapViewOfFile(pFile->hShared, 405 FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, sizeof(winceLock)); 406 /* If mapping failed, close the shared memory handle and erase it */ 407 if (!pFile->shared){ 408 pFile->lastErrno = GetLastError(); 409 CloseHandle(pFile->hShared); 410 pFile->hShared = NULL; 411 } 412 } 413 414 /* If shared memory could not be created, then close the mutex and fail */ 415 if (pFile->hShared == NULL){ 416 winceMutexRelease(pFile->hMutex); 417 CloseHandle(pFile->hMutex); 418 pFile->hMutex = NULL; 419 return FALSE; 420 } 421 422 /* Initialize the shared memory if we're supposed to */ 423 if (bInit) { 424 ZeroMemory(pFile->shared, sizeof(winceLock)); 425 } 426 427 winceMutexRelease(pFile->hMutex); 428 return TRUE; 429} 430 431/* 432** Destroy the part of winFile that deals with wince locks 433*/ 434static void winceDestroyLock(winFile *pFile){ 435 if (pFile->hMutex){ 436 /* Acquire the mutex */ 437 winceMutexAcquire(pFile->hMutex); 438 439 /* The following blocks should probably assert in debug mode, but they 440 are to cleanup in case any locks remained open */ 441 if (pFile->local.nReaders){ 442 pFile->shared->nReaders --; 443 } 444 if (pFile->local.bReserved){ 445 pFile->shared->bReserved = FALSE; 446 } 447 if (pFile->local.bPending){ 448 pFile->shared->bPending = FALSE; 449 } 450 if (pFile->local.bExclusive){ 451 pFile->shared->bExclusive = FALSE; 452 } 453 454 /* De-reference and close our copy of the shared memory handle */ 455 UnmapViewOfFile(pFile->shared); 456 CloseHandle(pFile->hShared); 457 458 /* Done with the mutex */ 459 winceMutexRelease(pFile->hMutex); 460 CloseHandle(pFile->hMutex); 461 pFile->hMutex = NULL; 462 } 463} 464 465/* 466** An implementation of the LockFile() API of windows for wince 467*/ 468static BOOL winceLockFile( 469 HANDLE *phFile, 470 DWORD dwFileOffsetLow, 471 DWORD dwFileOffsetHigh, 472 DWORD nNumberOfBytesToLockLow, 473 DWORD nNumberOfBytesToLockHigh 474){ 475 winFile *pFile = HANDLE_TO_WINFILE(phFile); 476 BOOL bReturn = FALSE; 477 478 UNUSED_PARAMETER(dwFileOffsetHigh); 479 UNUSED_PARAMETER(nNumberOfBytesToLockHigh); 480 481 if (!pFile->hMutex) return TRUE; 482 winceMutexAcquire(pFile->hMutex); 483 484 /* Wanting an exclusive lock? */ 485 if (dwFileOffsetLow == (DWORD)SHARED_FIRST 486 && nNumberOfBytesToLockLow == (DWORD)SHARED_SIZE){ 487 if (pFile->shared->nReaders == 0 && pFile->shared->bExclusive == 0){ 488 pFile->shared->bExclusive = TRUE; 489 pFile->local.bExclusive = TRUE; 490 bReturn = TRUE; 491 } 492 } 493 494 /* Want a read-only lock? */ 495 else if (dwFileOffsetLow == (DWORD)SHARED_FIRST && 496 nNumberOfBytesToLockLow == 1){ 497 if (pFile->shared->bExclusive == 0){ 498 pFile->local.nReaders ++; 499 if (pFile->local.nReaders == 1){ 500 pFile->shared->nReaders ++; 501 } 502 bReturn = TRUE; 503 } 504 } 505 506 /* Want a pending lock? */ 507 else if (dwFileOffsetLow == (DWORD)PENDING_BYTE && nNumberOfBytesToLockLow == 1){ 508 /* If no pending lock has been acquired, then acquire it */ 509 if (pFile->shared->bPending == 0) { 510 pFile->shared->bPending = TRUE; 511 pFile->local.bPending = TRUE; 512 bReturn = TRUE; 513 } 514 } 515 516 /* Want a reserved lock? */ 517 else if (dwFileOffsetLow == (DWORD)RESERVED_BYTE && nNumberOfBytesToLockLow == 1){ 518 if (pFile->shared->bReserved == 0) { 519 pFile->shared->bReserved = TRUE; 520 pFile->local.bReserved = TRUE; 521 bReturn = TRUE; 522 } 523 } 524 525 winceMutexRelease(pFile->hMutex); 526 return bReturn; 527} 528 529/* 530** An implementation of the UnlockFile API of windows for wince 531*/ 532static BOOL winceUnlockFile( 533 HANDLE *phFile, 534 DWORD dwFileOffsetLow, 535 DWORD dwFileOffsetHigh, 536 DWORD nNumberOfBytesToUnlockLow, 537 DWORD nNumberOfBytesToUnlockHigh 538){ 539 winFile *pFile = HANDLE_TO_WINFILE(phFile); 540 BOOL bReturn = FALSE; 541 542 UNUSED_PARAMETER(dwFileOffsetHigh); 543 UNUSED_PARAMETER(nNumberOfBytesToUnlockHigh); 544 545 if (!pFile->hMutex) return TRUE; 546 winceMutexAcquire(pFile->hMutex); 547 548 /* Releasing a reader lock or an exclusive lock */ 549 if (dwFileOffsetLow == (DWORD)SHARED_FIRST){ 550 /* Did we have an exclusive lock? */ 551 if (pFile->local.bExclusive){ 552 assert(nNumberOfBytesToUnlockLow == (DWORD)SHARED_SIZE); 553 pFile->local.bExclusive = FALSE; 554 pFile->shared->bExclusive = FALSE; 555 bReturn = TRUE; 556 } 557 558 /* Did we just have a reader lock? */ 559 else if (pFile->local.nReaders){ 560 assert(nNumberOfBytesToUnlockLow == (DWORD)SHARED_SIZE || nNumberOfBytesToUnlockLow == 1); 561 pFile->local.nReaders --; 562 if (pFile->local.nReaders == 0) 563 { 564 pFile->shared->nReaders --; 565 } 566 bReturn = TRUE; 567 } 568 } 569 570 /* Releasing a pending lock */ 571 else if (dwFileOffsetLow == (DWORD)PENDING_BYTE && nNumberOfBytesToUnlockLow == 1){ 572 if (pFile->local.bPending){ 573 pFile->local.bPending = FALSE; 574 pFile->shared->bPending = FALSE; 575 bReturn = TRUE; 576 } 577 } 578 /* Releasing a reserved lock */ 579 else if (dwFileOffsetLow == (DWORD)RESERVED_BYTE && nNumberOfBytesToUnlockLow == 1){ 580 if (pFile->local.bReserved) { 581 pFile->local.bReserved = FALSE; 582 pFile->shared->bReserved = FALSE; 583 bReturn = TRUE; 584 } 585 } 586 587 winceMutexRelease(pFile->hMutex); 588 return bReturn; 589} 590 591/* 592** An implementation of the LockFileEx() API of windows for wince 593*/ 594static BOOL winceLockFileEx( 595 HANDLE *phFile, 596 DWORD dwFlags, 597 DWORD dwReserved, 598 DWORD nNumberOfBytesToLockLow, 599 DWORD nNumberOfBytesToLockHigh, 600 LPOVERLAPPED lpOverlapped 601){ 602 UNUSED_PARAMETER(dwReserved); 603 UNUSED_PARAMETER(nNumberOfBytesToLockHigh); 604 605 /* If the caller wants a shared read lock, forward this call 606 ** to winceLockFile */ 607 if (lpOverlapped->Offset == (DWORD)SHARED_FIRST && 608 dwFlags == 1 && 609 nNumberOfBytesToLockLow == (DWORD)SHARED_SIZE){ 610 return winceLockFile(phFile, SHARED_FIRST, 0, 1, 0); 611 } 612 return FALSE; 613} 614/* 615** End of the special code for wince 616*****************************************************************************/ 617#endif /* SQLITE_OS_WINCE */ 618 619/***************************************************************************** 620** The next group of routines implement the I/O methods specified 621** by the sqlite3_io_methods object. 622******************************************************************************/ 623 624/* 625** Some microsoft compilers lack this definition. 626*/ 627#ifndef INVALID_SET_FILE_POINTER 628# define INVALID_SET_FILE_POINTER ((DWORD)-1) 629#endif 630 631/* 632** Move the current position of the file handle passed as the first 633** argument to offset iOffset within the file. If successful, return 0. 634** Otherwise, set pFile->lastErrno and return non-zero. 635*/ 636static int seekWinFile(winFile *pFile, sqlite3_int64 iOffset){ 637 LONG upperBits; /* Most sig. 32 bits of new offset */ 638 LONG lowerBits; /* Least sig. 32 bits of new offset */ 639 DWORD dwRet; /* Value returned by SetFilePointer() */ 640 641 upperBits = (LONG)((iOffset>>32) & 0x7fffffff); 642 lowerBits = (LONG)(iOffset & 0xffffffff); 643 644 /* API oddity: If successful, SetFilePointer() returns a dword 645 ** containing the lower 32-bits of the new file-offset. Or, if it fails, 646 ** it returns INVALID_SET_FILE_POINTER. However according to MSDN, 647 ** INVALID_SET_FILE_POINTER may also be a valid new offset. So to determine 648 ** whether an error has actually occured, it is also necessary to call 649 ** GetLastError(). 650 */ 651 dwRet = SetFilePointer(pFile->h, lowerBits, &upperBits, FILE_BEGIN); 652 if( (dwRet==INVALID_SET_FILE_POINTER && GetLastError()!=NO_ERROR) ){ 653 pFile->lastErrno = GetLastError(); 654 return 1; 655 } 656 657 return 0; 658} 659 660/* 661** Close a file. 662** 663** It is reported that an attempt to close a handle might sometimes 664** fail. This is a very unreasonable result, but windows is notorious 665** for being unreasonable so I do not doubt that it might happen. If 666** the close fails, we pause for 100 milliseconds and try again. As 667** many as MX_CLOSE_ATTEMPT attempts to close the handle are made before 668** giving up and returning an error. 669*/ 670#define MX_CLOSE_ATTEMPT 3 671static int winClose(sqlite3_file *id){ 672 int rc, cnt = 0; 673 winFile *pFile = (winFile*)id; 674 675 assert( id!=0 ); 676 assert( pFile->pShm==0 ); 677 OSTRACE(("CLOSE %d\n", pFile->h)); 678 do{ 679 rc = CloseHandle(pFile->h); 680 /* SimulateIOError( rc=0; cnt=MX_CLOSE_ATTEMPT; ); */ 681 }while( rc==0 && ++cnt < MX_CLOSE_ATTEMPT && (Sleep(100), 1) ); 682#if SQLITE_OS_WINCE 683#define WINCE_DELETION_ATTEMPTS 3 684 winceDestroyLock(pFile); 685 if( pFile->zDeleteOnClose ){ 686 int cnt = 0; 687 while( 688 DeleteFileW(pFile->zDeleteOnClose)==0 689 && GetFileAttributesW(pFile->zDeleteOnClose)!=0xffffffff 690 && cnt++ < WINCE_DELETION_ATTEMPTS 691 ){ 692 Sleep(100); /* Wait a little before trying again */ 693 } 694 free(pFile->zDeleteOnClose); 695 } 696#endif 697 OSTRACE(("CLOSE %d %s\n", pFile->h, rc ? "ok" : "failed")); 698 OpenCounter(-1); 699 return rc ? SQLITE_OK : SQLITE_IOERR; 700} 701 702/* 703** Read data from a file into a buffer. Return SQLITE_OK if all 704** bytes were read successfully and SQLITE_IOERR if anything goes 705** wrong. 706*/ 707static int winRead( 708 sqlite3_file *id, /* File to read from */ 709 void *pBuf, /* Write content into this buffer */ 710 int amt, /* Number of bytes to read */ 711 sqlite3_int64 offset /* Begin reading at this offset */ 712){ 713 winFile *pFile = (winFile*)id; /* file handle */ 714 DWORD nRead; /* Number of bytes actually read from file */ 715 716 assert( id!=0 ); 717 SimulateIOError(return SQLITE_IOERR_READ); 718 OSTRACE(("READ %d lock=%d\n", pFile->h, pFile->locktype)); 719 720 if( seekWinFile(pFile, offset) ){ 721 return SQLITE_FULL; 722 } 723 if( !ReadFile(pFile->h, pBuf, amt, &nRead, 0) ){ 724 pFile->lastErrno = GetLastError(); 725 return SQLITE_IOERR_READ; 726 } 727 if( nRead<(DWORD)amt ){ 728 /* Unread parts of the buffer must be zero-filled */ 729 memset(&((char*)pBuf)[nRead], 0, amt-nRead); 730 return SQLITE_IOERR_SHORT_READ; 731 } 732 733 return SQLITE_OK; 734} 735 736/* 737** Write data from a buffer into a file. Return SQLITE_OK on success 738** or some other error code on failure. 739*/ 740static int winWrite( 741 sqlite3_file *id, /* File to write into */ 742 const void *pBuf, /* The bytes to be written */ 743 int amt, /* Number of bytes to write */ 744 sqlite3_int64 offset /* Offset into the file to begin writing at */ 745){ 746 int rc; /* True if error has occured, else false */ 747 winFile *pFile = (winFile*)id; /* File handle */ 748 749 assert( amt>0 ); 750 assert( pFile ); 751 SimulateIOError(return SQLITE_IOERR_WRITE); 752 SimulateDiskfullError(return SQLITE_FULL); 753 754 OSTRACE(("WRITE %d lock=%d\n", pFile->h, pFile->locktype)); 755 756 rc = seekWinFile(pFile, offset); 757 if( rc==0 ){ 758 u8 *aRem = (u8 *)pBuf; /* Data yet to be written */ 759 int nRem = amt; /* Number of bytes yet to be written */ 760 DWORD nWrite; /* Bytes written by each WriteFile() call */ 761 762 while( nRem>0 && WriteFile(pFile->h, aRem, nRem, &nWrite, 0) && nWrite>0 ){ 763 aRem += nWrite; 764 nRem -= nWrite; 765 } 766 if( nRem>0 ){ 767 pFile->lastErrno = GetLastError(); 768 rc = 1; 769 } 770 } 771 772 if( rc ){ 773 if( pFile->lastErrno==ERROR_HANDLE_DISK_FULL ){ 774 return SQLITE_FULL; 775 } 776 return SQLITE_IOERR_WRITE; 777 } 778 return SQLITE_OK; 779} 780 781/* 782** Truncate an open file to a specified size 783*/ 784static int winTruncate(sqlite3_file *id, sqlite3_int64 nByte){ 785 winFile *pFile = (winFile*)id; /* File handle object */ 786 int rc = SQLITE_OK; /* Return code for this function */ 787 788 assert( pFile ); 789 790 OSTRACE(("TRUNCATE %d %lld\n", pFile->h, nByte)); 791 SimulateIOError(return SQLITE_IOERR_TRUNCATE); 792 793 /* If the user has configured a chunk-size for this file, truncate the 794 ** file so that it consists of an integer number of chunks (i.e. the 795 ** actual file size after the operation may be larger than the requested 796 ** size). 797 */ 798 if( pFile->szChunk ){ 799 nByte = ((nByte + pFile->szChunk - 1)/pFile->szChunk) * pFile->szChunk; 800 } 801 802 /* SetEndOfFile() returns non-zero when successful, or zero when it fails. */ 803 if( seekWinFile(pFile, nByte) ){ 804 rc = SQLITE_IOERR_TRUNCATE; 805 }else if( 0==SetEndOfFile(pFile->h) ){ 806 pFile->lastErrno = GetLastError(); 807 rc = SQLITE_IOERR_TRUNCATE; 808 } 809 810 OSTRACE(("TRUNCATE %d %lld %s\n", pFile->h, nByte, rc ? "failed" : "ok")); 811 return rc; 812} 813 814#ifdef SQLITE_TEST 815/* 816** Count the number of fullsyncs and normal syncs. This is used to test 817** that syncs and fullsyncs are occuring at the right times. 818*/ 819int sqlite3_sync_count = 0; 820int sqlite3_fullsync_count = 0; 821#endif 822 823/* 824** Make sure all writes to a particular file are committed to disk. 825*/ 826static int winSync(sqlite3_file *id, int flags){ 827#if !defined(NDEBUG) || !defined(SQLITE_NO_SYNC) || defined(SQLITE_DEBUG) 828 winFile *pFile = (winFile*)id; 829#else 830 UNUSED_PARAMETER(id); 831#endif 832 833 assert( pFile ); 834 /* Check that one of SQLITE_SYNC_NORMAL or FULL was passed */ 835 assert((flags&0x0F)==SQLITE_SYNC_NORMAL 836 || (flags&0x0F)==SQLITE_SYNC_FULL 837 ); 838 839 OSTRACE(("SYNC %d lock=%d\n", pFile->h, pFile->locktype)); 840 841#ifndef SQLITE_TEST 842 UNUSED_PARAMETER(flags); 843#else 844 if( flags & SQLITE_SYNC_FULL ){ 845 sqlite3_fullsync_count++; 846 } 847 sqlite3_sync_count++; 848#endif 849 850 /* Unix cannot, but some systems may return SQLITE_FULL from here. This 851 ** line is to test that doing so does not cause any problems. 852 */ 853 SimulateDiskfullError( return SQLITE_FULL ); 854 SimulateIOError( return SQLITE_IOERR; ); 855 856 /* If we compiled with the SQLITE_NO_SYNC flag, then syncing is a 857 ** no-op 858 */ 859#ifdef SQLITE_NO_SYNC 860 return SQLITE_OK; 861#else 862 if( FlushFileBuffers(pFile->h) ){ 863 return SQLITE_OK; 864 }else{ 865 pFile->lastErrno = GetLastError(); 866 return SQLITE_IOERR; 867 } 868#endif 869} 870 871/* 872** Determine the current size of a file in bytes 873*/ 874static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){ 875 DWORD upperBits; 876 DWORD lowerBits; 877 winFile *pFile = (winFile*)id; 878 DWORD error; 879 880 assert( id!=0 ); 881 SimulateIOError(return SQLITE_IOERR_FSTAT); 882 lowerBits = GetFileSize(pFile->h, &upperBits); 883 if( (lowerBits == INVALID_FILE_SIZE) 884 && ((error = GetLastError()) != NO_ERROR) ) 885 { 886 pFile->lastErrno = error; 887 return SQLITE_IOERR_FSTAT; 888 } 889 *pSize = (((sqlite3_int64)upperBits)<<32) + lowerBits; 890 return SQLITE_OK; 891} 892 893/* 894** LOCKFILE_FAIL_IMMEDIATELY is undefined on some Windows systems. 895*/ 896#ifndef LOCKFILE_FAIL_IMMEDIATELY 897# define LOCKFILE_FAIL_IMMEDIATELY 1 898#endif 899 900/* 901** Acquire a reader lock. 902** Different API routines are called depending on whether or not this 903** is Win95 or WinNT. 904*/ 905static int getReadLock(winFile *pFile){ 906 int res; 907 if( isNT() ){ 908 OVERLAPPED ovlp; 909 ovlp.Offset = SHARED_FIRST; 910 ovlp.OffsetHigh = 0; 911 ovlp.hEvent = 0; 912 res = LockFileEx(pFile->h, LOCKFILE_FAIL_IMMEDIATELY, 913 0, SHARED_SIZE, 0, &ovlp); 914/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. 915*/ 916#if SQLITE_OS_WINCE==0 917 }else{ 918 int lk; 919 sqlite3_randomness(sizeof(lk), &lk); 920 pFile->sharedLockByte = (short)((lk & 0x7fffffff)%(SHARED_SIZE - 1)); 921 res = LockFile(pFile->h, SHARED_FIRST+pFile->sharedLockByte, 0, 1, 0); 922#endif 923 } 924 if( res == 0 ){ 925 pFile->lastErrno = GetLastError(); 926 } 927 return res; 928} 929 930/* 931** Undo a readlock 932*/ 933static int unlockReadLock(winFile *pFile){ 934 int res; 935 if( isNT() ){ 936 res = UnlockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); 937/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. 938*/ 939#if SQLITE_OS_WINCE==0 940 }else{ 941 res = UnlockFile(pFile->h, SHARED_FIRST + pFile->sharedLockByte, 0, 1, 0); 942#endif 943 } 944 if( res == 0 ){ 945 pFile->lastErrno = GetLastError(); 946 } 947 return res; 948} 949 950/* 951** Lock the file with the lock specified by parameter locktype - one 952** of the following: 953** 954** (1) SHARED_LOCK 955** (2) RESERVED_LOCK 956** (3) PENDING_LOCK 957** (4) EXCLUSIVE_LOCK 958** 959** Sometimes when requesting one lock state, additional lock states 960** are inserted in between. The locking might fail on one of the later 961** transitions leaving the lock state different from what it started but 962** still short of its goal. The following chart shows the allowed 963** transitions and the inserted intermediate states: 964** 965** UNLOCKED -> SHARED 966** SHARED -> RESERVED 967** SHARED -> (PENDING) -> EXCLUSIVE 968** RESERVED -> (PENDING) -> EXCLUSIVE 969** PENDING -> EXCLUSIVE 970** 971** This routine will only increase a lock. The winUnlock() routine 972** erases all locks at once and returns us immediately to locking level 0. 973** It is not possible to lower the locking level one step at a time. You 974** must go straight to locking level 0. 975*/ 976static int winLock(sqlite3_file *id, int locktype){ 977 int rc = SQLITE_OK; /* Return code from subroutines */ 978 int res = 1; /* Result of a windows lock call */ 979 int newLocktype; /* Set pFile->locktype to this value before exiting */ 980 int gotPendingLock = 0;/* True if we acquired a PENDING lock this time */ 981 winFile *pFile = (winFile*)id; 982 DWORD error = NO_ERROR; 983 984 assert( id!=0 ); 985 OSTRACE(("LOCK %d %d was %d(%d)\n", 986 pFile->h, locktype, pFile->locktype, pFile->sharedLockByte)); 987 988 /* If there is already a lock of this type or more restrictive on the 989 ** OsFile, do nothing. Don't use the end_lock: exit path, as 990 ** sqlite3OsEnterMutex() hasn't been called yet. 991 */ 992 if( pFile->locktype>=locktype ){ 993 return SQLITE_OK; 994 } 995 996 /* Make sure the locking sequence is correct 997 */ 998 assert( pFile->locktype!=NO_LOCK || locktype==SHARED_LOCK ); 999 assert( locktype!=PENDING_LOCK ); 1000 assert( locktype!=RESERVED_LOCK || pFile->locktype==SHARED_LOCK ); 1001 1002 /* Lock the PENDING_LOCK byte if we need to acquire a PENDING lock or 1003 ** a SHARED lock. If we are acquiring a SHARED lock, the acquisition of 1004 ** the PENDING_LOCK byte is temporary. 1005 */ 1006 newLocktype = pFile->locktype; 1007 if( (pFile->locktype==NO_LOCK) 1008 || ( (locktype==EXCLUSIVE_LOCK) 1009 && (pFile->locktype==RESERVED_LOCK)) 1010 ){ 1011 int cnt = 3; 1012 while( cnt-->0 && (res = LockFile(pFile->h, PENDING_BYTE, 0, 1, 0))==0 ){ 1013 /* Try 3 times to get the pending lock. The pending lock might be 1014 ** held by another reader process who will release it momentarily. 1015 */ 1016 OSTRACE(("could not get a PENDING lock. cnt=%d\n", cnt)); 1017 Sleep(1); 1018 } 1019 gotPendingLock = res; 1020 if( !res ){ 1021 error = GetLastError(); 1022 } 1023 } 1024 1025 /* Acquire a shared lock 1026 */ 1027 if( locktype==SHARED_LOCK && res ){ 1028 assert( pFile->locktype==NO_LOCK ); 1029 res = getReadLock(pFile); 1030 if( res ){ 1031 newLocktype = SHARED_LOCK; 1032 }else{ 1033 error = GetLastError(); 1034 } 1035 } 1036 1037 /* Acquire a RESERVED lock 1038 */ 1039 if( locktype==RESERVED_LOCK && res ){ 1040 assert( pFile->locktype==SHARED_LOCK ); 1041 res = LockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); 1042 if( res ){ 1043 newLocktype = RESERVED_LOCK; 1044 }else{ 1045 error = GetLastError(); 1046 } 1047 } 1048 1049 /* Acquire a PENDING lock 1050 */ 1051 if( locktype==EXCLUSIVE_LOCK && res ){ 1052 newLocktype = PENDING_LOCK; 1053 gotPendingLock = 0; 1054 } 1055 1056 /* Acquire an EXCLUSIVE lock 1057 */ 1058 if( locktype==EXCLUSIVE_LOCK && res ){ 1059 assert( pFile->locktype>=SHARED_LOCK ); 1060 res = unlockReadLock(pFile); 1061 OSTRACE(("unreadlock = %d\n", res)); 1062 res = LockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); 1063 if( res ){ 1064 newLocktype = EXCLUSIVE_LOCK; 1065 }else{ 1066 error = GetLastError(); 1067 OSTRACE(("error-code = %d\n", error)); 1068 getReadLock(pFile); 1069 } 1070 } 1071 1072 /* If we are holding a PENDING lock that ought to be released, then 1073 ** release it now. 1074 */ 1075 if( gotPendingLock && locktype==SHARED_LOCK ){ 1076 UnlockFile(pFile->h, PENDING_BYTE, 0, 1, 0); 1077 } 1078 1079 /* Update the state of the lock has held in the file descriptor then 1080 ** return the appropriate result code. 1081 */ 1082 if( res ){ 1083 rc = SQLITE_OK; 1084 }else{ 1085 OSTRACE(("LOCK FAILED %d trying for %d but got %d\n", pFile->h, 1086 locktype, newLocktype)); 1087 pFile->lastErrno = error; 1088 rc = SQLITE_BUSY; 1089 } 1090 pFile->locktype = (u8)newLocktype; 1091 return rc; 1092} 1093 1094/* 1095** This routine checks if there is a RESERVED lock held on the specified 1096** file by this or any other process. If such a lock is held, return 1097** non-zero, otherwise zero. 1098*/ 1099static int winCheckReservedLock(sqlite3_file *id, int *pResOut){ 1100 int rc; 1101 winFile *pFile = (winFile*)id; 1102 1103 SimulateIOError( return SQLITE_IOERR_CHECKRESERVEDLOCK; ); 1104 1105 assert( id!=0 ); 1106 if( pFile->locktype>=RESERVED_LOCK ){ 1107 rc = 1; 1108 OSTRACE(("TEST WR-LOCK %d %d (local)\n", pFile->h, rc)); 1109 }else{ 1110 rc = LockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); 1111 if( rc ){ 1112 UnlockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); 1113 } 1114 rc = !rc; 1115 OSTRACE(("TEST WR-LOCK %d %d (remote)\n", pFile->h, rc)); 1116 } 1117 *pResOut = rc; 1118 return SQLITE_OK; 1119} 1120 1121/* 1122** Lower the locking level on file descriptor id to locktype. locktype 1123** must be either NO_LOCK or SHARED_LOCK. 1124** 1125** If the locking level of the file descriptor is already at or below 1126** the requested locking level, this routine is a no-op. 1127** 1128** It is not possible for this routine to fail if the second argument 1129** is NO_LOCK. If the second argument is SHARED_LOCK then this routine 1130** might return SQLITE_IOERR; 1131*/ 1132static int winUnlock(sqlite3_file *id, int locktype){ 1133 int type; 1134 winFile *pFile = (winFile*)id; 1135 int rc = SQLITE_OK; 1136 assert( pFile!=0 ); 1137 assert( locktype<=SHARED_LOCK ); 1138 OSTRACE(("UNLOCK %d to %d was %d(%d)\n", pFile->h, locktype, 1139 pFile->locktype, pFile->sharedLockByte)); 1140 type = pFile->locktype; 1141 if( type>=EXCLUSIVE_LOCK ){ 1142 UnlockFile(pFile->h, SHARED_FIRST, 0, SHARED_SIZE, 0); 1143 if( locktype==SHARED_LOCK && !getReadLock(pFile) ){ 1144 /* This should never happen. We should always be able to 1145 ** reacquire the read lock */ 1146 rc = SQLITE_IOERR_UNLOCK; 1147 } 1148 } 1149 if( type>=RESERVED_LOCK ){ 1150 UnlockFile(pFile->h, RESERVED_BYTE, 0, 1, 0); 1151 } 1152 if( locktype==NO_LOCK && type>=SHARED_LOCK ){ 1153 unlockReadLock(pFile); 1154 } 1155 if( type>=PENDING_LOCK ){ 1156 UnlockFile(pFile->h, PENDING_BYTE, 0, 1, 0); 1157 } 1158 pFile->locktype = (u8)locktype; 1159 return rc; 1160} 1161 1162/* 1163** Control and query of the open file handle. 1164*/ 1165static int winFileControl(sqlite3_file *id, int op, void *pArg){ 1166 switch( op ){ 1167 case SQLITE_FCNTL_LOCKSTATE: { 1168 *(int*)pArg = ((winFile*)id)->locktype; 1169 return SQLITE_OK; 1170 } 1171 case SQLITE_LAST_ERRNO: { 1172 *(int*)pArg = (int)((winFile*)id)->lastErrno; 1173 return SQLITE_OK; 1174 } 1175 case SQLITE_FCNTL_CHUNK_SIZE: { 1176 ((winFile*)id)->szChunk = *(int *)pArg; 1177 return SQLITE_OK; 1178 } 1179 case SQLITE_FCNTL_SIZE_HINT: { 1180 sqlite3_int64 sz = *(sqlite3_int64*)pArg; 1181 SimulateIOErrorBenign(1); 1182 winTruncate(id, sz); 1183 SimulateIOErrorBenign(0); 1184 return SQLITE_OK; 1185 } 1186 case SQLITE_FCNTL_SYNC_OMITTED: { 1187 return SQLITE_OK; 1188 } 1189 } 1190 return SQLITE_NOTFOUND; 1191} 1192 1193/* 1194** Return the sector size in bytes of the underlying block device for 1195** the specified file. This is almost always 512 bytes, but may be 1196** larger for some devices. 1197** 1198** SQLite code assumes this function cannot fail. It also assumes that 1199** if two files are created in the same file-system directory (i.e. 1200** a database and its journal file) that the sector size will be the 1201** same for both. 1202*/ 1203static int winSectorSize(sqlite3_file *id){ 1204 assert( id!=0 ); 1205 return (int)(((winFile*)id)->sectorSize); 1206} 1207 1208/* 1209** Return a vector of device characteristics. 1210*/ 1211static int winDeviceCharacteristics(sqlite3_file *id){ 1212 UNUSED_PARAMETER(id); 1213 return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN; 1214} 1215 1216#ifndef SQLITE_OMIT_WAL 1217 1218/* 1219** Windows will only let you create file view mappings 1220** on allocation size granularity boundaries. 1221** During sqlite3_os_init() we do a GetSystemInfo() 1222** to get the granularity size. 1223*/ 1224SYSTEM_INFO winSysInfo; 1225 1226/* 1227** Helper functions to obtain and relinquish the global mutex. The 1228** global mutex is used to protect the winLockInfo objects used by 1229** this file, all of which may be shared by multiple threads. 1230** 1231** Function winShmMutexHeld() is used to assert() that the global mutex 1232** is held when required. This function is only used as part of assert() 1233** statements. e.g. 1234** 1235** winShmEnterMutex() 1236** assert( winShmMutexHeld() ); 1237** winShmLeaveMutex() 1238*/ 1239static void winShmEnterMutex(void){ 1240 sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); 1241} 1242static void winShmLeaveMutex(void){ 1243 sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); 1244} 1245#ifdef SQLITE_DEBUG 1246static int winShmMutexHeld(void) { 1247 return sqlite3_mutex_held(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); 1248} 1249#endif 1250 1251/* 1252** Object used to represent a single file opened and mmapped to provide 1253** shared memory. When multiple threads all reference the same 1254** log-summary, each thread has its own winFile object, but they all 1255** point to a single instance of this object. In other words, each 1256** log-summary is opened only once per process. 1257** 1258** winShmMutexHeld() must be true when creating or destroying 1259** this object or while reading or writing the following fields: 1260** 1261** nRef 1262** pNext 1263** 1264** The following fields are read-only after the object is created: 1265** 1266** fid 1267** zFilename 1268** 1269** Either winShmNode.mutex must be held or winShmNode.nRef==0 and 1270** winShmMutexHeld() is true when reading or writing any other field 1271** in this structure. 1272** 1273*/ 1274struct winShmNode { 1275 sqlite3_mutex *mutex; /* Mutex to access this object */ 1276 char *zFilename; /* Name of the file */ 1277 winFile hFile; /* File handle from winOpen */ 1278 1279 int szRegion; /* Size of shared-memory regions */ 1280 int nRegion; /* Size of array apRegion */ 1281 struct ShmRegion { 1282 HANDLE hMap; /* File handle from CreateFileMapping */ 1283 void *pMap; 1284 } *aRegion; 1285 DWORD lastErrno; /* The Windows errno from the last I/O error */ 1286 1287 int nRef; /* Number of winShm objects pointing to this */ 1288 winShm *pFirst; /* All winShm objects pointing to this */ 1289 winShmNode *pNext; /* Next in list of all winShmNode objects */ 1290#ifdef SQLITE_DEBUG 1291 u8 nextShmId; /* Next available winShm.id value */ 1292#endif 1293}; 1294 1295/* 1296** A global array of all winShmNode objects. 1297** 1298** The winShmMutexHeld() must be true while reading or writing this list. 1299*/ 1300static winShmNode *winShmNodeList = 0; 1301 1302/* 1303** Structure used internally by this VFS to record the state of an 1304** open shared memory connection. 1305** 1306** The following fields are initialized when this object is created and 1307** are read-only thereafter: 1308** 1309** winShm.pShmNode 1310** winShm.id 1311** 1312** All other fields are read/write. The winShm.pShmNode->mutex must be held 1313** while accessing any read/write fields. 1314*/ 1315struct winShm { 1316 winShmNode *pShmNode; /* The underlying winShmNode object */ 1317 winShm *pNext; /* Next winShm with the same winShmNode */ 1318 u8 hasMutex; /* True if holding the winShmNode mutex */ 1319 u16 sharedMask; /* Mask of shared locks held */ 1320 u16 exclMask; /* Mask of exclusive locks held */ 1321#ifdef SQLITE_DEBUG 1322 u8 id; /* Id of this connection with its winShmNode */ 1323#endif 1324}; 1325 1326/* 1327** Constants used for locking 1328*/ 1329#define WIN_SHM_BASE ((22+SQLITE_SHM_NLOCK)*4) /* first lock byte */ 1330#define WIN_SHM_DMS (WIN_SHM_BASE+SQLITE_SHM_NLOCK) /* deadman switch */ 1331 1332/* 1333** Apply advisory locks for all n bytes beginning at ofst. 1334*/ 1335#define _SHM_UNLCK 1 1336#define _SHM_RDLCK 2 1337#define _SHM_WRLCK 3 1338static int winShmSystemLock( 1339 winShmNode *pFile, /* Apply locks to this open shared-memory segment */ 1340 int lockType, /* _SHM_UNLCK, _SHM_RDLCK, or _SHM_WRLCK */ 1341 int ofst, /* Offset to first byte to be locked/unlocked */ 1342 int nByte /* Number of bytes to lock or unlock */ 1343){ 1344 OVERLAPPED ovlp; 1345 DWORD dwFlags; 1346 int rc = 0; /* Result code form Lock/UnlockFileEx() */ 1347 1348 /* Access to the winShmNode object is serialized by the caller */ 1349 assert( sqlite3_mutex_held(pFile->mutex) || pFile->nRef==0 ); 1350 1351 /* Initialize the locking parameters */ 1352 dwFlags = LOCKFILE_FAIL_IMMEDIATELY; 1353 if( lockType == _SHM_WRLCK ) dwFlags |= LOCKFILE_EXCLUSIVE_LOCK; 1354 1355 memset(&ovlp, 0, sizeof(OVERLAPPED)); 1356 ovlp.Offset = ofst; 1357 1358 /* Release/Acquire the system-level lock */ 1359 if( lockType==_SHM_UNLCK ){ 1360 rc = UnlockFileEx(pFile->hFile.h, 0, nByte, 0, &ovlp); 1361 }else{ 1362 rc = LockFileEx(pFile->hFile.h, dwFlags, 0, nByte, 0, &ovlp); 1363 } 1364 1365 if( rc!= 0 ){ 1366 rc = SQLITE_OK; 1367 }else{ 1368 pFile->lastErrno = GetLastError(); 1369 rc = SQLITE_BUSY; 1370 } 1371 1372 OSTRACE(("SHM-LOCK %d %s %s 0x%08lx\n", 1373 pFile->hFile.h, 1374 rc==SQLITE_OK ? "ok" : "failed", 1375 lockType==_SHM_UNLCK ? "UnlockFileEx" : "LockFileEx", 1376 pFile->lastErrno)); 1377 1378 return rc; 1379} 1380 1381/* Forward references to VFS methods */ 1382static int winOpen(sqlite3_vfs*,const char*,sqlite3_file*,int,int*); 1383static int winDelete(sqlite3_vfs *,const char*,int); 1384 1385/* 1386** Purge the winShmNodeList list of all entries with winShmNode.nRef==0. 1387** 1388** This is not a VFS shared-memory method; it is a utility function called 1389** by VFS shared-memory methods. 1390*/ 1391static void winShmPurge(sqlite3_vfs *pVfs, int deleteFlag){ 1392 winShmNode **pp; 1393 winShmNode *p; 1394 BOOL bRc; 1395 assert( winShmMutexHeld() ); 1396 pp = &winShmNodeList; 1397 while( (p = *pp)!=0 ){ 1398 if( p->nRef==0 ){ 1399 int i; 1400 if( p->mutex ) sqlite3_mutex_free(p->mutex); 1401 for(i=0; i<p->nRegion; i++){ 1402 bRc = UnmapViewOfFile(p->aRegion[i].pMap); 1403 OSTRACE(("SHM-PURGE pid-%d unmap region=%d %s\n", 1404 (int)GetCurrentProcessId(), i, 1405 bRc ? "ok" : "failed")); 1406 bRc = CloseHandle(p->aRegion[i].hMap); 1407 OSTRACE(("SHM-PURGE pid-%d close region=%d %s\n", 1408 (int)GetCurrentProcessId(), i, 1409 bRc ? "ok" : "failed")); 1410 } 1411 if( p->hFile.h != INVALID_HANDLE_VALUE ){ 1412 SimulateIOErrorBenign(1); 1413 winClose((sqlite3_file *)&p->hFile); 1414 SimulateIOErrorBenign(0); 1415 } 1416 if( deleteFlag ){ 1417 SimulateIOErrorBenign(1); 1418 winDelete(pVfs, p->zFilename, 0); 1419 SimulateIOErrorBenign(0); 1420 } 1421 *pp = p->pNext; 1422 sqlite3_free(p->aRegion); 1423 sqlite3_free(p); 1424 }else{ 1425 pp = &p->pNext; 1426 } 1427 } 1428} 1429 1430/* 1431** Open the shared-memory area associated with database file pDbFd. 1432** 1433** When opening a new shared-memory file, if no other instances of that 1434** file are currently open, in this process or in other processes, then 1435** the file must be truncated to zero length or have its header cleared. 1436*/ 1437static int winOpenSharedMemory(winFile *pDbFd){ 1438 struct winShm *p; /* The connection to be opened */ 1439 struct winShmNode *pShmNode = 0; /* The underlying mmapped file */ 1440 int rc; /* Result code */ 1441 struct winShmNode *pNew; /* Newly allocated winShmNode */ 1442 int nName; /* Size of zName in bytes */ 1443 1444 assert( pDbFd->pShm==0 ); /* Not previously opened */ 1445 1446 /* Allocate space for the new sqlite3_shm object. Also speculatively 1447 ** allocate space for a new winShmNode and filename. 1448 */ 1449 p = sqlite3_malloc( sizeof(*p) ); 1450 if( p==0 ) return SQLITE_NOMEM; 1451 memset(p, 0, sizeof(*p)); 1452 nName = sqlite3Strlen30(pDbFd->zPath); 1453 pNew = sqlite3_malloc( sizeof(*pShmNode) + nName + 15 ); 1454 if( pNew==0 ){ 1455 sqlite3_free(p); 1456 return SQLITE_NOMEM; 1457 } 1458 memset(pNew, 0, sizeof(*pNew)); 1459 pNew->zFilename = (char*)&pNew[1]; 1460 sqlite3_snprintf(nName+15, pNew->zFilename, "%s-shm", pDbFd->zPath); 1461 1462 /* Look to see if there is an existing winShmNode that can be used. 1463 ** If no matching winShmNode currently exists, create a new one. 1464 */ 1465 winShmEnterMutex(); 1466 for(pShmNode = winShmNodeList; pShmNode; pShmNode=pShmNode->pNext){ 1467 /* TBD need to come up with better match here. Perhaps 1468 ** use FILE_ID_BOTH_DIR_INFO Structure. 1469 */ 1470 if( sqlite3StrICmp(pShmNode->zFilename, pNew->zFilename)==0 ) break; 1471 } 1472 if( pShmNode ){ 1473 sqlite3_free(pNew); 1474 }else{ 1475 pShmNode = pNew; 1476 pNew = 0; 1477 ((winFile*)(&pShmNode->hFile))->h = INVALID_HANDLE_VALUE; 1478 pShmNode->pNext = winShmNodeList; 1479 winShmNodeList = pShmNode; 1480 1481 pShmNode->mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_FAST); 1482 if( pShmNode->mutex==0 ){ 1483 rc = SQLITE_NOMEM; 1484 goto shm_open_err; 1485 } 1486 1487 rc = winOpen(pDbFd->pVfs, 1488 pShmNode->zFilename, /* Name of the file (UTF-8) */ 1489 (sqlite3_file*)&pShmNode->hFile, /* File handle here */ 1490 SQLITE_OPEN_WAL | SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, /* Mode flags */ 1491 0); 1492 if( SQLITE_OK!=rc ){ 1493 rc = SQLITE_CANTOPEN_BKPT; 1494 goto shm_open_err; 1495 } 1496 1497 /* Check to see if another process is holding the dead-man switch. 1498 ** If not, truncate the file to zero length. 1499 */ 1500 if( winShmSystemLock(pShmNode, _SHM_WRLCK, WIN_SHM_DMS, 1)==SQLITE_OK ){ 1501 rc = winTruncate((sqlite3_file *)&pShmNode->hFile, 0); 1502 if( rc!=SQLITE_OK ){ 1503 rc = SQLITE_IOERR_SHMOPEN; 1504 } 1505 } 1506 if( rc==SQLITE_OK ){ 1507 winShmSystemLock(pShmNode, _SHM_UNLCK, WIN_SHM_DMS, 1); 1508 rc = winShmSystemLock(pShmNode, _SHM_RDLCK, WIN_SHM_DMS, 1); 1509 } 1510 if( rc ) goto shm_open_err; 1511 } 1512 1513 /* Make the new connection a child of the winShmNode */ 1514 p->pShmNode = pShmNode; 1515#ifdef SQLITE_DEBUG 1516 p->id = pShmNode->nextShmId++; 1517#endif 1518 pShmNode->nRef++; 1519 pDbFd->pShm = p; 1520 winShmLeaveMutex(); 1521 1522 /* The reference count on pShmNode has already been incremented under 1523 ** the cover of the winShmEnterMutex() mutex and the pointer from the 1524 ** new (struct winShm) object to the pShmNode has been set. All that is 1525 ** left to do is to link the new object into the linked list starting 1526 ** at pShmNode->pFirst. This must be done while holding the pShmNode->mutex 1527 ** mutex. 1528 */ 1529 sqlite3_mutex_enter(pShmNode->mutex); 1530 p->pNext = pShmNode->pFirst; 1531 pShmNode->pFirst = p; 1532 sqlite3_mutex_leave(pShmNode->mutex); 1533 return SQLITE_OK; 1534 1535 /* Jump here on any error */ 1536shm_open_err: 1537 winShmSystemLock(pShmNode, _SHM_UNLCK, WIN_SHM_DMS, 1); 1538 winShmPurge(pDbFd->pVfs, 0); /* This call frees pShmNode if required */ 1539 sqlite3_free(p); 1540 sqlite3_free(pNew); 1541 winShmLeaveMutex(); 1542 return rc; 1543} 1544 1545/* 1546** Close a connection to shared-memory. Delete the underlying 1547** storage if deleteFlag is true. 1548*/ 1549static int winShmUnmap( 1550 sqlite3_file *fd, /* Database holding shared memory */ 1551 int deleteFlag /* Delete after closing if true */ 1552){ 1553 winFile *pDbFd; /* Database holding shared-memory */ 1554 winShm *p; /* The connection to be closed */ 1555 winShmNode *pShmNode; /* The underlying shared-memory file */ 1556 winShm **pp; /* For looping over sibling connections */ 1557 1558 pDbFd = (winFile*)fd; 1559 p = pDbFd->pShm; 1560 if( p==0 ) return SQLITE_OK; 1561 pShmNode = p->pShmNode; 1562 1563 /* Remove connection p from the set of connections associated 1564 ** with pShmNode */ 1565 sqlite3_mutex_enter(pShmNode->mutex); 1566 for(pp=&pShmNode->pFirst; (*pp)!=p; pp = &(*pp)->pNext){} 1567 *pp = p->pNext; 1568 1569 /* Free the connection p */ 1570 sqlite3_free(p); 1571 pDbFd->pShm = 0; 1572 sqlite3_mutex_leave(pShmNode->mutex); 1573 1574 /* If pShmNode->nRef has reached 0, then close the underlying 1575 ** shared-memory file, too */ 1576 winShmEnterMutex(); 1577 assert( pShmNode->nRef>0 ); 1578 pShmNode->nRef--; 1579 if( pShmNode->nRef==0 ){ 1580 winShmPurge(pDbFd->pVfs, deleteFlag); 1581 } 1582 winShmLeaveMutex(); 1583 1584 return SQLITE_OK; 1585} 1586 1587/* 1588** Change the lock state for a shared-memory segment. 1589*/ 1590static int winShmLock( 1591 sqlite3_file *fd, /* Database file holding the shared memory */ 1592 int ofst, /* First lock to acquire or release */ 1593 int n, /* Number of locks to acquire or release */ 1594 int flags /* What to do with the lock */ 1595){ 1596 winFile *pDbFd = (winFile*)fd; /* Connection holding shared memory */ 1597 winShm *p = pDbFd->pShm; /* The shared memory being locked */ 1598 winShm *pX; /* For looping over all siblings */ 1599 winShmNode *pShmNode = p->pShmNode; 1600 int rc = SQLITE_OK; /* Result code */ 1601 u16 mask; /* Mask of locks to take or release */ 1602 1603 assert( ofst>=0 && ofst+n<=SQLITE_SHM_NLOCK ); 1604 assert( n>=1 ); 1605 assert( flags==(SQLITE_SHM_LOCK | SQLITE_SHM_SHARED) 1606 || flags==(SQLITE_SHM_LOCK | SQLITE_SHM_EXCLUSIVE) 1607 || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_SHARED) 1608 || flags==(SQLITE_SHM_UNLOCK | SQLITE_SHM_EXCLUSIVE) ); 1609 assert( n==1 || (flags & SQLITE_SHM_EXCLUSIVE)!=0 ); 1610 1611 mask = (u16)((1U<<(ofst+n)) - (1U<<ofst)); 1612 assert( n>1 || mask==(1<<ofst) ); 1613 sqlite3_mutex_enter(pShmNode->mutex); 1614 if( flags & SQLITE_SHM_UNLOCK ){ 1615 u16 allMask = 0; /* Mask of locks held by siblings */ 1616 1617 /* See if any siblings hold this same lock */ 1618 for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ 1619 if( pX==p ) continue; 1620 assert( (pX->exclMask & (p->exclMask|p->sharedMask))==0 ); 1621 allMask |= pX->sharedMask; 1622 } 1623 1624 /* Unlock the system-level locks */ 1625 if( (mask & allMask)==0 ){ 1626 rc = winShmSystemLock(pShmNode, _SHM_UNLCK, ofst+WIN_SHM_BASE, n); 1627 }else{ 1628 rc = SQLITE_OK; 1629 } 1630 1631 /* Undo the local locks */ 1632 if( rc==SQLITE_OK ){ 1633 p->exclMask &= ~mask; 1634 p->sharedMask &= ~mask; 1635 } 1636 }else if( flags & SQLITE_SHM_SHARED ){ 1637 u16 allShared = 0; /* Union of locks held by connections other than "p" */ 1638 1639 /* Find out which shared locks are already held by sibling connections. 1640 ** If any sibling already holds an exclusive lock, go ahead and return 1641 ** SQLITE_BUSY. 1642 */ 1643 for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ 1644 if( (pX->exclMask & mask)!=0 ){ 1645 rc = SQLITE_BUSY; 1646 break; 1647 } 1648 allShared |= pX->sharedMask; 1649 } 1650 1651 /* Get shared locks at the system level, if necessary */ 1652 if( rc==SQLITE_OK ){ 1653 if( (allShared & mask)==0 ){ 1654 rc = winShmSystemLock(pShmNode, _SHM_RDLCK, ofst+WIN_SHM_BASE, n); 1655 }else{ 1656 rc = SQLITE_OK; 1657 } 1658 } 1659 1660 /* Get the local shared locks */ 1661 if( rc==SQLITE_OK ){ 1662 p->sharedMask |= mask; 1663 } 1664 }else{ 1665 /* Make sure no sibling connections hold locks that will block this 1666 ** lock. If any do, return SQLITE_BUSY right away. 1667 */ 1668 for(pX=pShmNode->pFirst; pX; pX=pX->pNext){ 1669 if( (pX->exclMask & mask)!=0 || (pX->sharedMask & mask)!=0 ){ 1670 rc = SQLITE_BUSY; 1671 break; 1672 } 1673 } 1674 1675 /* Get the exclusive locks at the system level. Then if successful 1676 ** also mark the local connection as being locked. 1677 */ 1678 if( rc==SQLITE_OK ){ 1679 rc = winShmSystemLock(pShmNode, _SHM_WRLCK, ofst+WIN_SHM_BASE, n); 1680 if( rc==SQLITE_OK ){ 1681 assert( (p->sharedMask & mask)==0 ); 1682 p->exclMask |= mask; 1683 } 1684 } 1685 } 1686 sqlite3_mutex_leave(pShmNode->mutex); 1687 OSTRACE(("SHM-LOCK shmid-%d, pid-%d got %03x,%03x %s\n", 1688 p->id, (int)GetCurrentProcessId(), p->sharedMask, p->exclMask, 1689 rc ? "failed" : "ok")); 1690 return rc; 1691} 1692 1693/* 1694** Implement a memory barrier or memory fence on shared memory. 1695** 1696** All loads and stores begun before the barrier must complete before 1697** any load or store begun after the barrier. 1698*/ 1699static void winShmBarrier( 1700 sqlite3_file *fd /* Database holding the shared memory */ 1701){ 1702 UNUSED_PARAMETER(fd); 1703 /* MemoryBarrier(); // does not work -- do not know why not */ 1704 winShmEnterMutex(); 1705 winShmLeaveMutex(); 1706} 1707 1708/* 1709** This function is called to obtain a pointer to region iRegion of the 1710** shared-memory associated with the database file fd. Shared-memory regions 1711** are numbered starting from zero. Each shared-memory region is szRegion 1712** bytes in size. 1713** 1714** If an error occurs, an error code is returned and *pp is set to NULL. 1715** 1716** Otherwise, if the isWrite parameter is 0 and the requested shared-memory 1717** region has not been allocated (by any client, including one running in a 1718** separate process), then *pp is set to NULL and SQLITE_OK returned. If 1719** isWrite is non-zero and the requested shared-memory region has not yet 1720** been allocated, it is allocated by this function. 1721** 1722** If the shared-memory region has already been allocated or is allocated by 1723** this call as described above, then it is mapped into this processes 1724** address space (if it is not already), *pp is set to point to the mapped 1725** memory and SQLITE_OK returned. 1726*/ 1727static int winShmMap( 1728 sqlite3_file *fd, /* Handle open on database file */ 1729 int iRegion, /* Region to retrieve */ 1730 int szRegion, /* Size of regions */ 1731 int isWrite, /* True to extend file if necessary */ 1732 void volatile **pp /* OUT: Mapped memory */ 1733){ 1734 winFile *pDbFd = (winFile*)fd; 1735 winShm *p = pDbFd->pShm; 1736 winShmNode *pShmNode; 1737 int rc = SQLITE_OK; 1738 1739 if( !p ){ 1740 rc = winOpenSharedMemory(pDbFd); 1741 if( rc!=SQLITE_OK ) return rc; 1742 p = pDbFd->pShm; 1743 } 1744 pShmNode = p->pShmNode; 1745 1746 sqlite3_mutex_enter(pShmNode->mutex); 1747 assert( szRegion==pShmNode->szRegion || pShmNode->nRegion==0 ); 1748 1749 if( pShmNode->nRegion<=iRegion ){ 1750 struct ShmRegion *apNew; /* New aRegion[] array */ 1751 int nByte = (iRegion+1)*szRegion; /* Minimum required file size */ 1752 sqlite3_int64 sz; /* Current size of wal-index file */ 1753 1754 pShmNode->szRegion = szRegion; 1755 1756 /* The requested region is not mapped into this processes address space. 1757 ** Check to see if it has been allocated (i.e. if the wal-index file is 1758 ** large enough to contain the requested region). 1759 */ 1760 rc = winFileSize((sqlite3_file *)&pShmNode->hFile, &sz); 1761 if( rc!=SQLITE_OK ){ 1762 rc = SQLITE_IOERR_SHMSIZE; 1763 goto shmpage_out; 1764 } 1765 1766 if( sz<nByte ){ 1767 /* The requested memory region does not exist. If isWrite is set to 1768 ** zero, exit early. *pp will be set to NULL and SQLITE_OK returned. 1769 ** 1770 ** Alternatively, if isWrite is non-zero, use ftruncate() to allocate 1771 ** the requested memory region. 1772 */ 1773 if( !isWrite ) goto shmpage_out; 1774 rc = winTruncate((sqlite3_file *)&pShmNode->hFile, nByte); 1775 if( rc!=SQLITE_OK ){ 1776 rc = SQLITE_IOERR_SHMSIZE; 1777 goto shmpage_out; 1778 } 1779 } 1780 1781 /* Map the requested memory region into this processes address space. */ 1782 apNew = (struct ShmRegion *)sqlite3_realloc( 1783 pShmNode->aRegion, (iRegion+1)*sizeof(apNew[0]) 1784 ); 1785 if( !apNew ){ 1786 rc = SQLITE_IOERR_NOMEM; 1787 goto shmpage_out; 1788 } 1789 pShmNode->aRegion = apNew; 1790 1791 while( pShmNode->nRegion<=iRegion ){ 1792 HANDLE hMap; /* file-mapping handle */ 1793 void *pMap = 0; /* Mapped memory region */ 1794 1795 hMap = CreateFileMapping(pShmNode->hFile.h, 1796 NULL, PAGE_READWRITE, 0, nByte, NULL 1797 ); 1798 OSTRACE(("SHM-MAP pid-%d create region=%d nbyte=%d %s\n", 1799 (int)GetCurrentProcessId(), pShmNode->nRegion, nByte, 1800 hMap ? "ok" : "failed")); 1801 if( hMap ){ 1802 int iOffset = pShmNode->nRegion*szRegion; 1803 int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity; 1804 pMap = MapViewOfFile(hMap, FILE_MAP_WRITE | FILE_MAP_READ, 1805 0, iOffset - iOffsetShift, szRegion + iOffsetShift 1806 ); 1807 OSTRACE(("SHM-MAP pid-%d map region=%d offset=%d size=%d %s\n", 1808 (int)GetCurrentProcessId(), pShmNode->nRegion, iOffset, szRegion, 1809 pMap ? "ok" : "failed")); 1810 } 1811 if( !pMap ){ 1812 pShmNode->lastErrno = GetLastError(); 1813 rc = SQLITE_IOERR; 1814 if( hMap ) CloseHandle(hMap); 1815 goto shmpage_out; 1816 } 1817 1818 pShmNode->aRegion[pShmNode->nRegion].pMap = pMap; 1819 pShmNode->aRegion[pShmNode->nRegion].hMap = hMap; 1820 pShmNode->nRegion++; 1821 } 1822 } 1823 1824shmpage_out: 1825 if( pShmNode->nRegion>iRegion ){ 1826 int iOffset = iRegion*szRegion; 1827 int iOffsetShift = iOffset % winSysInfo.dwAllocationGranularity; 1828 char *p = (char *)pShmNode->aRegion[iRegion].pMap; 1829 *pp = (void *)&p[iOffsetShift]; 1830 }else{ 1831 *pp = 0; 1832 } 1833 sqlite3_mutex_leave(pShmNode->mutex); 1834 return rc; 1835} 1836 1837#else 1838# define winShmMap 0 1839# define winShmLock 0 1840# define winShmBarrier 0 1841# define winShmUnmap 0 1842#endif /* #ifndef SQLITE_OMIT_WAL */ 1843 1844/* 1845** Here ends the implementation of all sqlite3_file methods. 1846** 1847********************** End sqlite3_file Methods ******************************* 1848******************************************************************************/ 1849 1850/* 1851** This vector defines all the methods that can operate on an 1852** sqlite3_file for win32. 1853*/ 1854static const sqlite3_io_methods winIoMethod = { 1855 2, /* iVersion */ 1856 winClose, /* xClose */ 1857 winRead, /* xRead */ 1858 winWrite, /* xWrite */ 1859 winTruncate, /* xTruncate */ 1860 winSync, /* xSync */ 1861 winFileSize, /* xFileSize */ 1862 winLock, /* xLock */ 1863 winUnlock, /* xUnlock */ 1864 winCheckReservedLock, /* xCheckReservedLock */ 1865 winFileControl, /* xFileControl */ 1866 winSectorSize, /* xSectorSize */ 1867 winDeviceCharacteristics, /* xDeviceCharacteristics */ 1868 winShmMap, /* xShmMap */ 1869 winShmLock, /* xShmLock */ 1870 winShmBarrier, /* xShmBarrier */ 1871 winShmUnmap /* xShmUnmap */ 1872}; 1873 1874/**************************************************************************** 1875**************************** sqlite3_vfs methods **************************** 1876** 1877** This division contains the implementation of methods on the 1878** sqlite3_vfs object. 1879*/ 1880 1881/* 1882** Convert a UTF-8 filename into whatever form the underlying 1883** operating system wants filenames in. Space to hold the result 1884** is obtained from malloc and must be freed by the calling 1885** function. 1886*/ 1887static void *convertUtf8Filename(const char *zFilename){ 1888 void *zConverted = 0; 1889 if( isNT() ){ 1890 zConverted = utf8ToUnicode(zFilename); 1891/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. 1892*/ 1893#if SQLITE_OS_WINCE==0 1894 }else{ 1895 zConverted = utf8ToMbcs(zFilename); 1896#endif 1897 } 1898 /* caller will handle out of memory */ 1899 return zConverted; 1900} 1901 1902/* 1903** Create a temporary file name in zBuf. zBuf must be big enough to 1904** hold at pVfs->mxPathname characters. 1905*/ 1906static int getTempname(int nBuf, char *zBuf){ 1907 static char zChars[] = 1908 "abcdefghijklmnopqrstuvwxyz" 1909 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 1910 "0123456789"; 1911 size_t i, j; 1912 char zTempPath[MAX_PATH+1]; 1913 1914 /* It's odd to simulate an io-error here, but really this is just 1915 ** using the io-error infrastructure to test that SQLite handles this 1916 ** function failing. 1917 */ 1918 SimulateIOError( return SQLITE_IOERR ); 1919 1920 if( sqlite3_temp_directory ){ 1921 sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", sqlite3_temp_directory); 1922 }else if( isNT() ){ 1923 char *zMulti; 1924 WCHAR zWidePath[MAX_PATH]; 1925 GetTempPathW(MAX_PATH-30, zWidePath); 1926 zMulti = unicodeToUtf8(zWidePath); 1927 if( zMulti ){ 1928 sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", zMulti); 1929 free(zMulti); 1930 }else{ 1931 return SQLITE_NOMEM; 1932 } 1933/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. 1934** Since the ASCII version of these Windows API do not exist for WINCE, 1935** it's important to not reference them for WINCE builds. 1936*/ 1937#if SQLITE_OS_WINCE==0 1938 }else{ 1939 char *zUtf8; 1940 char zMbcsPath[MAX_PATH]; 1941 GetTempPathA(MAX_PATH-30, zMbcsPath); 1942 zUtf8 = sqlite3_win32_mbcs_to_utf8(zMbcsPath); 1943 if( zUtf8 ){ 1944 sqlite3_snprintf(MAX_PATH-30, zTempPath, "%s", zUtf8); 1945 free(zUtf8); 1946 }else{ 1947 return SQLITE_NOMEM; 1948 } 1949#endif 1950 } 1951 1952 /* Check that the output buffer is large enough for the temporary file 1953 ** name. If it is not, return SQLITE_ERROR. 1954 */ 1955 if( (sqlite3Strlen30(zTempPath) + sqlite3Strlen30(SQLITE_TEMP_FILE_PREFIX) + 17) >= nBuf ){ 1956 return SQLITE_ERROR; 1957 } 1958 1959 for(i=sqlite3Strlen30(zTempPath); i>0 && zTempPath[i-1]=='\\'; i--){} 1960 zTempPath[i] = 0; 1961 1962 sqlite3_snprintf(nBuf-17, zBuf, 1963 "%s\\"SQLITE_TEMP_FILE_PREFIX, zTempPath); 1964 j = sqlite3Strlen30(zBuf); 1965 sqlite3_randomness(15, &zBuf[j]); 1966 for(i=0; i<15; i++, j++){ 1967 zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ]; 1968 } 1969 zBuf[j] = 0; 1970 1971 OSTRACE(("TEMP FILENAME: %s\n", zBuf)); 1972 return SQLITE_OK; 1973} 1974 1975/* 1976** The return value of getLastErrorMsg 1977** is zero if the error message fits in the buffer, or non-zero 1978** otherwise (if the message was truncated). 1979*/ 1980static int getLastErrorMsg(int nBuf, char *zBuf){ 1981 /* FormatMessage returns 0 on failure. Otherwise it 1982 ** returns the number of TCHARs written to the output 1983 ** buffer, excluding the terminating null char. 1984 */ 1985 DWORD error = GetLastError(); 1986 DWORD dwLen = 0; 1987 char *zOut = 0; 1988 1989 if( isNT() ){ 1990 WCHAR *zTempWide = NULL; 1991 dwLen = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 1992 NULL, 1993 error, 1994 0, 1995 (LPWSTR) &zTempWide, 1996 0, 1997 0); 1998 if( dwLen > 0 ){ 1999 /* allocate a buffer and convert to UTF8 */ 2000 zOut = unicodeToUtf8(zTempWide); 2001 /* free the system buffer allocated by FormatMessage */ 2002 LocalFree(zTempWide); 2003 } 2004/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. 2005** Since the ASCII version of these Windows API do not exist for WINCE, 2006** it's important to not reference them for WINCE builds. 2007*/ 2008#if SQLITE_OS_WINCE==0 2009 }else{ 2010 char *zTemp = NULL; 2011 dwLen = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 2012 NULL, 2013 error, 2014 0, 2015 (LPSTR) &zTemp, 2016 0, 2017 0); 2018 if( dwLen > 0 ){ 2019 /* allocate a buffer and convert to UTF8 */ 2020 zOut = sqlite3_win32_mbcs_to_utf8(zTemp); 2021 /* free the system buffer allocated by FormatMessage */ 2022 LocalFree(zTemp); 2023 } 2024#endif 2025 } 2026 if( 0 == dwLen ){ 2027 sqlite3_snprintf(nBuf, zBuf, "OsError 0x%x (%u)", error, error); 2028 }else{ 2029 /* copy a maximum of nBuf chars to output buffer */ 2030 sqlite3_snprintf(nBuf, zBuf, "%s", zOut); 2031 /* free the UTF8 buffer */ 2032 free(zOut); 2033 } 2034 return 0; 2035} 2036 2037/* 2038** Open a file. 2039*/ 2040static int winOpen( 2041 sqlite3_vfs *pVfs, /* Not used */ 2042 const char *zName, /* Name of the file (UTF-8) */ 2043 sqlite3_file *id, /* Write the SQLite file handle here */ 2044 int flags, /* Open mode flags */ 2045 int *pOutFlags /* Status return flags */ 2046){ 2047 HANDLE h; 2048 DWORD dwDesiredAccess; 2049 DWORD dwShareMode; 2050 DWORD dwCreationDisposition; 2051 DWORD dwFlagsAndAttributes = 0; 2052#if SQLITE_OS_WINCE 2053 int isTemp = 0; 2054#endif 2055 winFile *pFile = (winFile*)id; 2056 void *zConverted; /* Filename in OS encoding */ 2057 const char *zUtf8Name = zName; /* Filename in UTF-8 encoding */ 2058 2059 /* If argument zPath is a NULL pointer, this function is required to open 2060 ** a temporary file. Use this buffer to store the file name in. 2061 */ 2062 char zTmpname[MAX_PATH+1]; /* Buffer used to create temp filename */ 2063 2064 int rc = SQLITE_OK; /* Function Return Code */ 2065#if !defined(NDEBUG) || SQLITE_OS_WINCE 2066 int eType = flags&0xFFFFFF00; /* Type of file to open */ 2067#endif 2068 2069 int isExclusive = (flags & SQLITE_OPEN_EXCLUSIVE); 2070 int isDelete = (flags & SQLITE_OPEN_DELETEONCLOSE); 2071 int isCreate = (flags & SQLITE_OPEN_CREATE); 2072#ifndef NDEBUG 2073 int isReadonly = (flags & SQLITE_OPEN_READONLY); 2074#endif 2075 int isReadWrite = (flags & SQLITE_OPEN_READWRITE); 2076 2077#ifndef NDEBUG 2078 int isOpenJournal = (isCreate && ( 2079 eType==SQLITE_OPEN_MASTER_JOURNAL 2080 || eType==SQLITE_OPEN_MAIN_JOURNAL 2081 || eType==SQLITE_OPEN_WAL 2082 )); 2083#endif 2084 2085 /* Check the following statements are true: 2086 ** 2087 ** (a) Exactly one of the READWRITE and READONLY flags must be set, and 2088 ** (b) if CREATE is set, then READWRITE must also be set, and 2089 ** (c) if EXCLUSIVE is set, then CREATE must also be set. 2090 ** (d) if DELETEONCLOSE is set, then CREATE must also be set. 2091 */ 2092 assert((isReadonly==0 || isReadWrite==0) && (isReadWrite || isReadonly)); 2093 assert(isCreate==0 || isReadWrite); 2094 assert(isExclusive==0 || isCreate); 2095 assert(isDelete==0 || isCreate); 2096 2097 /* The main DB, main journal, WAL file and master journal are never 2098 ** automatically deleted. Nor are they ever temporary files. */ 2099 assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_DB ); 2100 assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MAIN_JOURNAL ); 2101 assert( (!isDelete && zName) || eType!=SQLITE_OPEN_MASTER_JOURNAL ); 2102 assert( (!isDelete && zName) || eType!=SQLITE_OPEN_WAL ); 2103 2104 /* Assert that the upper layer has set one of the "file-type" flags. */ 2105 assert( eType==SQLITE_OPEN_MAIN_DB || eType==SQLITE_OPEN_TEMP_DB 2106 || eType==SQLITE_OPEN_MAIN_JOURNAL || eType==SQLITE_OPEN_TEMP_JOURNAL 2107 || eType==SQLITE_OPEN_SUBJOURNAL || eType==SQLITE_OPEN_MASTER_JOURNAL 2108 || eType==SQLITE_OPEN_TRANSIENT_DB || eType==SQLITE_OPEN_WAL 2109 ); 2110 2111 assert( id!=0 ); 2112 UNUSED_PARAMETER(pVfs); 2113 2114 pFile->h = INVALID_HANDLE_VALUE; 2115 2116 /* If the second argument to this function is NULL, generate a 2117 ** temporary file name to use 2118 */ 2119 if( !zUtf8Name ){ 2120 assert(isDelete && !isOpenJournal); 2121 rc = getTempname(MAX_PATH+1, zTmpname); 2122 if( rc!=SQLITE_OK ){ 2123 return rc; 2124 } 2125 zUtf8Name = zTmpname; 2126 } 2127 2128 /* Convert the filename to the system encoding. */ 2129 zConverted = convertUtf8Filename(zUtf8Name); 2130 if( zConverted==0 ){ 2131 return SQLITE_NOMEM; 2132 } 2133 2134 if( isReadWrite ){ 2135 dwDesiredAccess = GENERIC_READ | GENERIC_WRITE; 2136 }else{ 2137 dwDesiredAccess = GENERIC_READ; 2138 } 2139 2140 /* SQLITE_OPEN_EXCLUSIVE is used to make sure that a new file is 2141 ** created. SQLite doesn't use it to indicate "exclusive access" 2142 ** as it is usually understood. 2143 */ 2144 if( isExclusive ){ 2145 /* Creates a new file, only if it does not already exist. */ 2146 /* If the file exists, it fails. */ 2147 dwCreationDisposition = CREATE_NEW; 2148 }else if( isCreate ){ 2149 /* Open existing file, or create if it doesn't exist */ 2150 dwCreationDisposition = OPEN_ALWAYS; 2151 }else{ 2152 /* Opens a file, only if it exists. */ 2153 dwCreationDisposition = OPEN_EXISTING; 2154 } 2155 2156 dwShareMode = FILE_SHARE_READ | FILE_SHARE_WRITE; 2157 2158 if( isDelete ){ 2159#if SQLITE_OS_WINCE 2160 dwFlagsAndAttributes = FILE_ATTRIBUTE_HIDDEN; 2161 isTemp = 1; 2162#else 2163 dwFlagsAndAttributes = FILE_ATTRIBUTE_TEMPORARY 2164 | FILE_ATTRIBUTE_HIDDEN 2165 | FILE_FLAG_DELETE_ON_CLOSE; 2166#endif 2167 }else{ 2168 dwFlagsAndAttributes = FILE_ATTRIBUTE_NORMAL; 2169 } 2170 /* Reports from the internet are that performance is always 2171 ** better if FILE_FLAG_RANDOM_ACCESS is used. Ticket #2699. */ 2172#if SQLITE_OS_WINCE 2173 dwFlagsAndAttributes |= FILE_FLAG_RANDOM_ACCESS; 2174#endif 2175 2176 if( isNT() ){ 2177 h = CreateFileW((WCHAR*)zConverted, 2178 dwDesiredAccess, 2179 dwShareMode, 2180 NULL, 2181 dwCreationDisposition, 2182 dwFlagsAndAttributes, 2183 NULL 2184 ); 2185/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. 2186** Since the ASCII version of these Windows API do not exist for WINCE, 2187** it's important to not reference them for WINCE builds. 2188*/ 2189#if SQLITE_OS_WINCE==0 2190 }else{ 2191 h = CreateFileA((char*)zConverted, 2192 dwDesiredAccess, 2193 dwShareMode, 2194 NULL, 2195 dwCreationDisposition, 2196 dwFlagsAndAttributes, 2197 NULL 2198 ); 2199#endif 2200 } 2201 2202 OSTRACE(("OPEN %d %s 0x%lx %s\n", 2203 h, zName, dwDesiredAccess, 2204 h==INVALID_HANDLE_VALUE ? "failed" : "ok")); 2205 2206 if( h==INVALID_HANDLE_VALUE ){ 2207 pFile->lastErrno = GetLastError(); 2208 free(zConverted); 2209 if( isReadWrite ){ 2210 return winOpen(pVfs, zName, id, 2211 ((flags|SQLITE_OPEN_READONLY)&~(SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE)), pOutFlags); 2212 }else{ 2213 return SQLITE_CANTOPEN_BKPT; 2214 } 2215 } 2216 2217 if( pOutFlags ){ 2218 if( isReadWrite ){ 2219 *pOutFlags = SQLITE_OPEN_READWRITE; 2220 }else{ 2221 *pOutFlags = SQLITE_OPEN_READONLY; 2222 } 2223 } 2224 2225 memset(pFile, 0, sizeof(*pFile)); 2226 pFile->pMethod = &winIoMethod; 2227 pFile->h = h; 2228 pFile->lastErrno = NO_ERROR; 2229 pFile->pVfs = pVfs; 2230 pFile->pShm = 0; 2231 pFile->zPath = zName; 2232 pFile->sectorSize = getSectorSize(pVfs, zUtf8Name); 2233 2234#if SQLITE_OS_WINCE 2235 if( isReadWrite && eType==SQLITE_OPEN_MAIN_DB 2236 && !winceCreateLock(zName, pFile) 2237 ){ 2238 CloseHandle(h); 2239 free(zConverted); 2240 return SQLITE_CANTOPEN_BKPT; 2241 } 2242 if( isTemp ){ 2243 pFile->zDeleteOnClose = zConverted; 2244 }else 2245#endif 2246 { 2247 free(zConverted); 2248 } 2249 2250 OpenCounter(+1); 2251 return rc; 2252} 2253 2254/* 2255** Delete the named file. 2256** 2257** Note that windows does not allow a file to be deleted if some other 2258** process has it open. Sometimes a virus scanner or indexing program 2259** will open a journal file shortly after it is created in order to do 2260** whatever it does. While this other process is holding the 2261** file open, we will be unable to delete it. To work around this 2262** problem, we delay 100 milliseconds and try to delete again. Up 2263** to MX_DELETION_ATTEMPTs deletion attempts are run before giving 2264** up and returning an error. 2265*/ 2266#define MX_DELETION_ATTEMPTS 5 2267static int winDelete( 2268 sqlite3_vfs *pVfs, /* Not used on win32 */ 2269 const char *zFilename, /* Name of file to delete */ 2270 int syncDir /* Not used on win32 */ 2271){ 2272 int cnt = 0; 2273 DWORD rc; 2274 DWORD error = 0; 2275 void *zConverted; 2276 UNUSED_PARAMETER(pVfs); 2277 UNUSED_PARAMETER(syncDir); 2278 2279 SimulateIOError(return SQLITE_IOERR_DELETE); 2280 zConverted = convertUtf8Filename(zFilename); 2281 if( zConverted==0 ){ 2282 return SQLITE_NOMEM; 2283 } 2284 if( isNT() ){ 2285 do{ 2286 DeleteFileW(zConverted); 2287 }while( ( ((rc = GetFileAttributesW(zConverted)) != INVALID_FILE_ATTRIBUTES) 2288 || ((error = GetLastError()) == ERROR_ACCESS_DENIED)) 2289 && (++cnt < MX_DELETION_ATTEMPTS) 2290 && (Sleep(100), 1) ); 2291/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. 2292** Since the ASCII version of these Windows API do not exist for WINCE, 2293** it's important to not reference them for WINCE builds. 2294*/ 2295#if SQLITE_OS_WINCE==0 2296 }else{ 2297 do{ 2298 DeleteFileA(zConverted); 2299 }while( ( ((rc = GetFileAttributesA(zConverted)) != INVALID_FILE_ATTRIBUTES) 2300 || ((error = GetLastError()) == ERROR_ACCESS_DENIED)) 2301 && (++cnt < MX_DELETION_ATTEMPTS) 2302 && (Sleep(100), 1) ); 2303#endif 2304 } 2305 free(zConverted); 2306 OSTRACE(("DELETE \"%s\" %s\n", zFilename, 2307 ( (rc==INVALID_FILE_ATTRIBUTES) && (error==ERROR_FILE_NOT_FOUND)) ? 2308 "ok" : "failed" )); 2309 2310 return ( (rc == INVALID_FILE_ATTRIBUTES) 2311 && (error == ERROR_FILE_NOT_FOUND)) ? SQLITE_OK : SQLITE_IOERR_DELETE; 2312} 2313 2314/* 2315** Check the existance and status of a file. 2316*/ 2317static int winAccess( 2318 sqlite3_vfs *pVfs, /* Not used on win32 */ 2319 const char *zFilename, /* Name of file to check */ 2320 int flags, /* Type of test to make on this file */ 2321 int *pResOut /* OUT: Result */ 2322){ 2323 DWORD attr; 2324 int rc = 0; 2325 void *zConverted; 2326 UNUSED_PARAMETER(pVfs); 2327 2328 SimulateIOError( return SQLITE_IOERR_ACCESS; ); 2329 zConverted = convertUtf8Filename(zFilename); 2330 if( zConverted==0 ){ 2331 return SQLITE_NOMEM; 2332 } 2333 if( isNT() ){ 2334 WIN32_FILE_ATTRIBUTE_DATA sAttrData; 2335 memset(&sAttrData, 0, sizeof(sAttrData)); 2336 if( GetFileAttributesExW((WCHAR*)zConverted, 2337 GetFileExInfoStandard, 2338 &sAttrData) ){ 2339 /* For an SQLITE_ACCESS_EXISTS query, treat a zero-length file 2340 ** as if it does not exist. 2341 */ 2342 if( flags==SQLITE_ACCESS_EXISTS 2343 && sAttrData.nFileSizeHigh==0 2344 && sAttrData.nFileSizeLow==0 ){ 2345 attr = INVALID_FILE_ATTRIBUTES; 2346 }else{ 2347 attr = sAttrData.dwFileAttributes; 2348 } 2349 }else{ 2350 if( GetLastError()!=ERROR_FILE_NOT_FOUND ){ 2351 free(zConverted); 2352 return SQLITE_IOERR_ACCESS; 2353 }else{ 2354 attr = INVALID_FILE_ATTRIBUTES; 2355 } 2356 } 2357/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. 2358** Since the ASCII version of these Windows API do not exist for WINCE, 2359** it's important to not reference them for WINCE builds. 2360*/ 2361#if SQLITE_OS_WINCE==0 2362 }else{ 2363 attr = GetFileAttributesA((char*)zConverted); 2364#endif 2365 } 2366 free(zConverted); 2367 switch( flags ){ 2368 case SQLITE_ACCESS_READ: 2369 case SQLITE_ACCESS_EXISTS: 2370 rc = attr!=INVALID_FILE_ATTRIBUTES; 2371 break; 2372 case SQLITE_ACCESS_READWRITE: 2373 rc = (attr & FILE_ATTRIBUTE_READONLY)==0; 2374 break; 2375 default: 2376 assert(!"Invalid flags argument"); 2377 } 2378 *pResOut = rc; 2379 return SQLITE_OK; 2380} 2381 2382 2383/* 2384** Turn a relative pathname into a full pathname. Write the full 2385** pathname into zOut[]. zOut[] will be at least pVfs->mxPathname 2386** bytes in size. 2387*/ 2388static int winFullPathname( 2389 sqlite3_vfs *pVfs, /* Pointer to vfs object */ 2390 const char *zRelative, /* Possibly relative input path */ 2391 int nFull, /* Size of output buffer in bytes */ 2392 char *zFull /* Output buffer */ 2393){ 2394 2395#if defined(__CYGWIN__) 2396 SimulateIOError( return SQLITE_ERROR ); 2397 UNUSED_PARAMETER(nFull); 2398 cygwin_conv_to_full_win32_path(zRelative, zFull); 2399 return SQLITE_OK; 2400#endif 2401 2402#if SQLITE_OS_WINCE 2403 SimulateIOError( return SQLITE_ERROR ); 2404 UNUSED_PARAMETER(nFull); 2405 /* WinCE has no concept of a relative pathname, or so I am told. */ 2406 sqlite3_snprintf(pVfs->mxPathname, zFull, "%s", zRelative); 2407 return SQLITE_OK; 2408#endif 2409 2410#if !SQLITE_OS_WINCE && !defined(__CYGWIN__) 2411 int nByte; 2412 void *zConverted; 2413 char *zOut; 2414 2415 /* It's odd to simulate an io-error here, but really this is just 2416 ** using the io-error infrastructure to test that SQLite handles this 2417 ** function failing. This function could fail if, for example, the 2418 ** current working directory has been unlinked. 2419 */ 2420 SimulateIOError( return SQLITE_ERROR ); 2421 UNUSED_PARAMETER(nFull); 2422 zConverted = convertUtf8Filename(zRelative); 2423 if( isNT() ){ 2424 WCHAR *zTemp; 2425 nByte = GetFullPathNameW((WCHAR*)zConverted, 0, 0, 0) + 3; 2426 zTemp = malloc( nByte*sizeof(zTemp[0]) ); 2427 if( zTemp==0 ){ 2428 free(zConverted); 2429 return SQLITE_NOMEM; 2430 } 2431 GetFullPathNameW((WCHAR*)zConverted, nByte, zTemp, 0); 2432 free(zConverted); 2433 zOut = unicodeToUtf8(zTemp); 2434 free(zTemp); 2435/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. 2436** Since the ASCII version of these Windows API do not exist for WINCE, 2437** it's important to not reference them for WINCE builds. 2438*/ 2439#if SQLITE_OS_WINCE==0 2440 }else{ 2441 char *zTemp; 2442 nByte = GetFullPathNameA((char*)zConverted, 0, 0, 0) + 3; 2443 zTemp = malloc( nByte*sizeof(zTemp[0]) ); 2444 if( zTemp==0 ){ 2445 free(zConverted); 2446 return SQLITE_NOMEM; 2447 } 2448 GetFullPathNameA((char*)zConverted, nByte, zTemp, 0); 2449 free(zConverted); 2450 zOut = sqlite3_win32_mbcs_to_utf8(zTemp); 2451 free(zTemp); 2452#endif 2453 } 2454 if( zOut ){ 2455 sqlite3_snprintf(pVfs->mxPathname, zFull, "%s", zOut); 2456 free(zOut); 2457 return SQLITE_OK; 2458 }else{ 2459 return SQLITE_NOMEM; 2460 } 2461#endif 2462} 2463 2464/* 2465** Get the sector size of the device used to store 2466** file. 2467*/ 2468static int getSectorSize( 2469 sqlite3_vfs *pVfs, 2470 const char *zRelative /* UTF-8 file name */ 2471){ 2472 DWORD bytesPerSector = SQLITE_DEFAULT_SECTOR_SIZE; 2473 /* GetDiskFreeSpace is not supported under WINCE */ 2474#if SQLITE_OS_WINCE 2475 UNUSED_PARAMETER(pVfs); 2476 UNUSED_PARAMETER(zRelative); 2477#else 2478 char zFullpath[MAX_PATH+1]; 2479 int rc; 2480 DWORD dwRet = 0; 2481 DWORD dwDummy; 2482 2483 /* 2484 ** We need to get the full path name of the file 2485 ** to get the drive letter to look up the sector 2486 ** size. 2487 */ 2488 SimulateIOErrorBenign(1); 2489 rc = winFullPathname(pVfs, zRelative, MAX_PATH, zFullpath); 2490 SimulateIOErrorBenign(0); 2491 if( rc == SQLITE_OK ) 2492 { 2493 void *zConverted = convertUtf8Filename(zFullpath); 2494 if( zConverted ){ 2495 if( isNT() ){ 2496 /* trim path to just drive reference */ 2497 WCHAR *p = zConverted; 2498 for(;*p;p++){ 2499 if( *p == '\\' ){ 2500 *p = '\0'; 2501 break; 2502 } 2503 } 2504 dwRet = GetDiskFreeSpaceW((WCHAR*)zConverted, 2505 &dwDummy, 2506 &bytesPerSector, 2507 &dwDummy, 2508 &dwDummy); 2509 }else{ 2510 /* trim path to just drive reference */ 2511 char *p = (char *)zConverted; 2512 for(;*p;p++){ 2513 if( *p == '\\' ){ 2514 *p = '\0'; 2515 break; 2516 } 2517 } 2518 dwRet = GetDiskFreeSpaceA((char*)zConverted, 2519 &dwDummy, 2520 &bytesPerSector, 2521 &dwDummy, 2522 &dwDummy); 2523 } 2524 free(zConverted); 2525 } 2526 if( !dwRet ){ 2527 bytesPerSector = SQLITE_DEFAULT_SECTOR_SIZE; 2528 } 2529 } 2530#endif 2531 return (int) bytesPerSector; 2532} 2533 2534#ifndef SQLITE_OMIT_LOAD_EXTENSION 2535/* 2536** Interfaces for opening a shared library, finding entry points 2537** within the shared library, and closing the shared library. 2538*/ 2539/* 2540** Interfaces for opening a shared library, finding entry points 2541** within the shared library, and closing the shared library. 2542*/ 2543static void *winDlOpen(sqlite3_vfs *pVfs, const char *zFilename){ 2544 HANDLE h; 2545 void *zConverted = convertUtf8Filename(zFilename); 2546 UNUSED_PARAMETER(pVfs); 2547 if( zConverted==0 ){ 2548 return 0; 2549 } 2550 if( isNT() ){ 2551 h = LoadLibraryW((WCHAR*)zConverted); 2552/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed. 2553** Since the ASCII version of these Windows API do not exist for WINCE, 2554** it's important to not reference them for WINCE builds. 2555*/ 2556#if SQLITE_OS_WINCE==0 2557 }else{ 2558 h = LoadLibraryA((char*)zConverted); 2559#endif 2560 } 2561 free(zConverted); 2562 return (void*)h; 2563} 2564static void winDlError(sqlite3_vfs *pVfs, int nBuf, char *zBufOut){ 2565 UNUSED_PARAMETER(pVfs); 2566 getLastErrorMsg(nBuf, zBufOut); 2567} 2568void (*winDlSym(sqlite3_vfs *pVfs, void *pHandle, const char *zSymbol))(void){ 2569 UNUSED_PARAMETER(pVfs); 2570#if SQLITE_OS_WINCE 2571 /* The GetProcAddressA() routine is only available on wince. */ 2572 return (void(*)(void))GetProcAddressA((HANDLE)pHandle, zSymbol); 2573#else 2574 /* All other windows platforms expect GetProcAddress() to take 2575 ** an Ansi string regardless of the _UNICODE setting */ 2576 return (void(*)(void))GetProcAddress((HANDLE)pHandle, zSymbol); 2577#endif 2578} 2579void winDlClose(sqlite3_vfs *pVfs, void *pHandle){ 2580 UNUSED_PARAMETER(pVfs); 2581 FreeLibrary((HANDLE)pHandle); 2582} 2583#else /* if SQLITE_OMIT_LOAD_EXTENSION is defined: */ 2584 #define winDlOpen 0 2585 #define winDlError 0 2586 #define winDlSym 0 2587 #define winDlClose 0 2588#endif 2589 2590 2591/* 2592** Write up to nBuf bytes of randomness into zBuf. 2593*/ 2594static int winRandomness(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ 2595 int n = 0; 2596 UNUSED_PARAMETER(pVfs); 2597#if defined(SQLITE_TEST) 2598 n = nBuf; 2599 memset(zBuf, 0, nBuf); 2600#else 2601 if( sizeof(SYSTEMTIME)<=nBuf-n ){ 2602 SYSTEMTIME x; 2603 GetSystemTime(&x); 2604 memcpy(&zBuf[n], &x, sizeof(x)); 2605 n += sizeof(x); 2606 } 2607 if( sizeof(DWORD)<=nBuf-n ){ 2608 DWORD pid = GetCurrentProcessId(); 2609 memcpy(&zBuf[n], &pid, sizeof(pid)); 2610 n += sizeof(pid); 2611 } 2612 if( sizeof(DWORD)<=nBuf-n ){ 2613 DWORD cnt = GetTickCount(); 2614 memcpy(&zBuf[n], &cnt, sizeof(cnt)); 2615 n += sizeof(cnt); 2616 } 2617 if( sizeof(LARGE_INTEGER)<=nBuf-n ){ 2618 LARGE_INTEGER i; 2619 QueryPerformanceCounter(&i); 2620 memcpy(&zBuf[n], &i, sizeof(i)); 2621 n += sizeof(i); 2622 } 2623#endif 2624 return n; 2625} 2626 2627 2628/* 2629** Sleep for a little while. Return the amount of time slept. 2630*/ 2631static int winSleep(sqlite3_vfs *pVfs, int microsec){ 2632 Sleep((microsec+999)/1000); 2633 UNUSED_PARAMETER(pVfs); 2634 return ((microsec+999)/1000)*1000; 2635} 2636 2637/* 2638** The following variable, if set to a non-zero value, is interpreted as 2639** the number of seconds since 1970 and is used to set the result of 2640** sqlite3OsCurrentTime() during testing. 2641*/ 2642#ifdef SQLITE_TEST 2643int sqlite3_current_time = 0; /* Fake system time in seconds since 1970. */ 2644#endif 2645 2646/* 2647** Find the current time (in Universal Coordinated Time). Write into *piNow 2648** the current time and date as a Julian Day number times 86_400_000. In 2649** other words, write into *piNow the number of milliseconds since the Julian 2650** epoch of noon in Greenwich on November 24, 4714 B.C according to the 2651** proleptic Gregorian calendar. 2652** 2653** On success, return 0. Return 1 if the time and date cannot be found. 2654*/ 2655static int winCurrentTimeInt64(sqlite3_vfs *pVfs, sqlite3_int64 *piNow){ 2656 /* FILETIME structure is a 64-bit value representing the number of 2657 100-nanosecond intervals since January 1, 1601 (= JD 2305813.5). 2658 */ 2659 FILETIME ft; 2660 static const sqlite3_int64 winFiletimeEpoch = 23058135*(sqlite3_int64)8640000; 2661#ifdef SQLITE_TEST 2662 static const sqlite3_int64 unixEpoch = 24405875*(sqlite3_int64)8640000; 2663#endif 2664 /* 2^32 - to avoid use of LL and warnings in gcc */ 2665 static const sqlite3_int64 max32BitValue = 2666 (sqlite3_int64)2000000000 + (sqlite3_int64)2000000000 + (sqlite3_int64)294967296; 2667 2668#if SQLITE_OS_WINCE 2669 SYSTEMTIME time; 2670 GetSystemTime(&time); 2671 /* if SystemTimeToFileTime() fails, it returns zero. */ 2672 if (!SystemTimeToFileTime(&time,&ft)){ 2673 return 1; 2674 } 2675#else 2676 GetSystemTimeAsFileTime( &ft ); 2677#endif 2678 2679 *piNow = winFiletimeEpoch + 2680 ((((sqlite3_int64)ft.dwHighDateTime)*max32BitValue) + 2681 (sqlite3_int64)ft.dwLowDateTime)/(sqlite3_int64)10000; 2682 2683#ifdef SQLITE_TEST 2684 if( sqlite3_current_time ){ 2685 *piNow = 1000*(sqlite3_int64)sqlite3_current_time + unixEpoch; 2686 } 2687#endif 2688 UNUSED_PARAMETER(pVfs); 2689 return 0; 2690} 2691 2692/* 2693** Find the current time (in Universal Coordinated Time). Write the 2694** current time and date as a Julian Day number into *prNow and 2695** return 0. Return 1 if the time and date cannot be found. 2696*/ 2697int winCurrentTime(sqlite3_vfs *pVfs, double *prNow){ 2698 int rc; 2699 sqlite3_int64 i; 2700 rc = winCurrentTimeInt64(pVfs, &i); 2701 if( !rc ){ 2702 *prNow = i/86400000.0; 2703 } 2704 return rc; 2705} 2706 2707/* 2708** The idea is that this function works like a combination of 2709** GetLastError() and FormatMessage() on windows (or errno and 2710** strerror_r() on unix). After an error is returned by an OS 2711** function, SQLite calls this function with zBuf pointing to 2712** a buffer of nBuf bytes. The OS layer should populate the 2713** buffer with a nul-terminated UTF-8 encoded error message 2714** describing the last IO error to have occurred within the calling 2715** thread. 2716** 2717** If the error message is too large for the supplied buffer, 2718** it should be truncated. The return value of xGetLastError 2719** is zero if the error message fits in the buffer, or non-zero 2720** otherwise (if the message was truncated). If non-zero is returned, 2721** then it is not necessary to include the nul-terminator character 2722** in the output buffer. 2723** 2724** Not supplying an error message will have no adverse effect 2725** on SQLite. It is fine to have an implementation that never 2726** returns an error message: 2727** 2728** int xGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ 2729** assert(zBuf[0]=='\0'); 2730** return 0; 2731** } 2732** 2733** However if an error message is supplied, it will be incorporated 2734** by sqlite into the error message available to the user using 2735** sqlite3_errmsg(), possibly making IO errors easier to debug. 2736*/ 2737static int winGetLastError(sqlite3_vfs *pVfs, int nBuf, char *zBuf){ 2738 UNUSED_PARAMETER(pVfs); 2739 return getLastErrorMsg(nBuf, zBuf); 2740} 2741 2742 2743 2744/* 2745** Initialize and deinitialize the operating system interface. 2746*/ 2747int sqlite3_os_init(void){ 2748 static sqlite3_vfs winVfs = { 2749 3, /* iVersion */ 2750 sizeof(winFile), /* szOsFile */ 2751 MAX_PATH, /* mxPathname */ 2752 0, /* pNext */ 2753 "win32", /* zName */ 2754 0, /* pAppData */ 2755 winOpen, /* xOpen */ 2756 winDelete, /* xDelete */ 2757 winAccess, /* xAccess */ 2758 winFullPathname, /* xFullPathname */ 2759 winDlOpen, /* xDlOpen */ 2760 winDlError, /* xDlError */ 2761 winDlSym, /* xDlSym */ 2762 winDlClose, /* xDlClose */ 2763 winRandomness, /* xRandomness */ 2764 winSleep, /* xSleep */ 2765 winCurrentTime, /* xCurrentTime */ 2766 winGetLastError, /* xGetLastError */ 2767 winCurrentTimeInt64, /* xCurrentTimeInt64 */ 2768 0, /* xSetSystemCall */ 2769 0, /* xGetSystemCall */ 2770 0, /* xNextSystemCall */ 2771 }; 2772 2773#ifndef SQLITE_OMIT_WAL 2774 /* get memory map allocation granularity */ 2775 memset(&winSysInfo, 0, sizeof(SYSTEM_INFO)); 2776 GetSystemInfo(&winSysInfo); 2777 assert(winSysInfo.dwAllocationGranularity > 0); 2778#endif 2779 2780 sqlite3_vfs_register(&winVfs, 1); 2781 return SQLITE_OK; 2782} 2783int sqlite3_os_end(void){ 2784 return SQLITE_OK; 2785} 2786 2787void chromium_sqlite3_initialize_win_sqlite3_file(sqlite3_file* file, HANDLE handle) { 2788 winFile* winSQLite3File = (winFile*)file; 2789 memset(file, 0, sizeof(*file)); 2790 winSQLite3File->pMethod = &winIoMethod; 2791 winSQLite3File->h = handle; 2792} 2793 2794#endif /* SQLITE_OS_WIN */ 2795