/ Hex Artifact Content
Login

Artifact 386f8c034b177b672f7819ddc5d80be6c8d593ac:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43  mmon.h"../*.** C
02a0: 6f 6d 70 69 6c 69 6e 67 20 61 6e 64 20 75 73 69  ompiling and usi
02b0: 6e 67 20 57 41 4c 20 6d 6f 64 65 20 72 65 71 75  ng WAL mode requ
02c0: 69 72 65 73 20 73 65 76 65 72 61 6c 20 41 50 49  ires several API
02d0: 73 20 74 68 61 74 20 61 72 65 20 6f 6e 6c 79 0a  s that are only.
02e0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ** available in 
02f0: 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d  Windows platform
0300: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e  s based on the N
0310: 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66  T kernel..*/.#if
0320: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e   !SQLITE_OS_WINN
0330: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
0340: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 23  LITE_OMIT_WAL).#
0350: 20 65 72 72 6f 72 20 22 57 41 4c 20 6d 6f 64 65   error "WAL mode
0360: 20 72 65 71 75 69 72 65 73 20 73 75 70 70 6f 72   requires suppor
0370: 74 20 66 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f  t from the Windo
0380: 77 73 20 4e 54 20 6b 65 72 6e 65 6c 2c 20 63 6f  ws NT kernel, co
0390: 6d 70 69 6c 65 5c 0a 20 77 69 74 68 20 53 51 4c  mpile\. with SQL
03a0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 2e 22 0a 23  ITE_OMIT_WAL.".#
03b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65  endif../*.** Are
03c0: 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69 6e   most of the Win
03d0: 33 32 20 41 4e 53 49 20 41 50 49 73 20 61 76 61  32 ANSI APIs ava
03e0: 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77 69 74  ilable (i.e. wit
03f0: 68 20 63 65 72 74 61 69 6e 20 65 78 63 65 70 74  h certain except
0400: 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  ions.** based on
0410: 20 74 68 65 20 73 75 62 2d 70 6c 61 74 66 6f 72   the sub-platfor
0420: 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49  m)?.*/.#if !SQLI
0430: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
0440: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
0450: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
0460: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
0470: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72  #endif../*.** Ar
0480: 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69  e most of the Wi
0490: 6e 33 32 20 55 6e 69 63 6f 64 65 20 41 50 49 73  n32 Unicode APIs
04a0: 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e   available (i.e.
04b0: 20 77 69 74 68 20 63 65 72 74 61 69 6e 20 65 78   with certain ex
04c0: 63 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65  ceptions.** base
04d0: 64 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61  d on the sub-pla
04e0: 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 53  tform)?.*/.#if S
04f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
0500: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e  | SQLITE_OS_WINN
0510: 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  T || SQLITE_OS_W
0520: 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53  INRT.#  define S
0530: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0540: 57 49 44 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  WIDE.#endif../*.
0550: 2a 2a 20 44 6f 20 77 65 20 6e 65 65 64 20 74 6f  ** Do we need to
0560: 20 6d 61 6e 75 61 6c 6c 79 20 64 65 66 69 6e 65   manually define
0570: 20 74 68 65 20 57 69 6e 33 32 20 66 69 6c 65 20   the Win32 file 
0580: 6d 61 70 70 69 6e 67 20 41 50 49 73 20 66 6f 72  mapping APIs for
0590: 20 75 73 65 20 77 69 74 68 20 57 41 4c 0a 2a 2a   use with WAL.**
05a0: 20 6d 6f 64 65 20 28 65 2e 67 2e 20 74 68 65 73   mode (e.g. thes
05b0: 65 20 41 50 49 73 20 61 72 65 20 61 76 61 69 6c  e APIs are avail
05c0: 61 62 6c 65 20 69 6e 20 74 68 65 20 57 69 6e 64  able in the Wind
05d0: 6f 77 73 20 43 45 20 53 44 4b 3b 20 68 6f 77 65  ows CE SDK; howe
05e0: 76 65 72 2c 20 74 68 65 79 0a 2a 2a 20 61 72 65  ver, they.** are
05f0: 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
0600: 74 68 65 20 68 65 61 64 65 72 20 66 69 6c 65 29  the header file)
0610: 3f 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ?.*/.#if SQLITE_
0620: 57 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e  WIN32_FILEMAPPIN
0630: 47 5f 41 50 49 20 26 26 20 21 64 65 66 69 6e 65  G_API && !define
0640: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
0650: 4c 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66 20  L)./*.** Two of 
0660: 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  the file mapping
0670: 20 41 50 49 73 20 61 72 65 20 64 69 66 66 65 72   APIs are differ
0680: 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52 54 2e  ent under WinRT.
0690: 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69    Figure out whi
06a0: 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65 65  ch.** set we nee
06b0: 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  d..*/.#if SQLITE
06c0: 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41 53  _OS_WINRT.WINBAS
06d0: 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41  EAPI HANDLE WINA
06e0: 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70  PI CreateFileMap
06f0: 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e 44  pingFromApp(HAND
0700: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
0710: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
0720: 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e  TES, ULONG, ULON
0730: 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a 0a  G64, LPCWSTR);..
0740: 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49  WINBASEAPI LPVOI
0750: 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77  D WINAPI MapView
0760: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 48 41  OfFileFromApp(HA
0770: 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f  NDLE, ULONG, ULO
0780: 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a 23  NG64, SIZE_T);.#
0790: 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64  else.#if defined
07a0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
07b0: 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53 45 41  S_ANSI).WINBASEA
07c0: 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49  PI HANDLE WINAPI
07d0: 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
07e0: 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45  ngA(HANDLE, LPSE
07f0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
0800: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
0810: 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44  RD, DWORD, DWORD
0820: 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64 69  , LPCSTR);.#endi
0830: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
0840: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
0850: 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  SI) */..#if defi
0860: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
0870: 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e 42 41  _HAS_WIDE).WINBA
0880: 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e  SEAPI HANDLE WIN
0890: 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61  API CreateFileMa
08a0: 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20 4c  ppingW(HANDLE, L
08b0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
08c0: 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20  UTES, \.        
08d0: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57  DWORD, DWORD, DW
08e0: 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a 23  ORD, LPCWSTR);.#
08f0: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
0900: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
0910: 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e 42  S_WIDE) */..WINB
0920: 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57 49  ASEAPI LPVOID WI
0930: 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69  NAPI MapViewOfFi
0940: 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52 44  le(HANDLE, DWORD
0950: 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20  , DWORD, DWORD, 
0960: 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66 20  SIZE_T);.#endif 
0970: 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
0980: 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  RT */../*.** Thi
0990: 73 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41  s file mapping A
09a0: 50 49 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  PI is common to 
09b0: 62 6f 74 68 20 57 69 6e 33 32 20 61 6e 64 20 57  both Win32 and W
09c0: 69 6e 52 54 2e 0a 2a 2f 0a 57 49 4e 42 41 53 45  inRT..*/.WINBASE
09d0: 41 50 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20  API BOOL WINAPI 
09e0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
09f0: 4c 50 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66  LPCVOID);.#endif
0a00: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
0a10: 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49  _FILEMAPPING_API
0a20: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0a30: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 2a 2f  ITE_OMIT_WAL) */
0a40: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 20 74 6f  ../*.** Macro to
0a50: 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75   find the minimu
0a60: 6d 20 6f 66 20 74 77 6f 20 6e 75 6d 65 72 69 63  m of two numeric
0a70: 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66 6e   values..*/.#ifn
0a80: 64 65 66 20 4d 49 4e 0a 23 20 64 65 66 69 6e 65  def MIN.# define
0a90: 20 4d 49 4e 28 78 2c 79 29 20 28 28 78 29 3c 28   MIN(x,y) ((x)<(
0aa0: 79 29 3f 28 78 29 3a 28 79 29 29 0a 23 65 6e 64  y)?(x):(y)).#end
0ab0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  if../*.** Some M
0ac0: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
0ad0: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
0ae0: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
0af0: 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  def INVALID_FILE
0b00: 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65  _ATTRIBUTES.# de
0b10: 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c  fine INVALID_FIL
0b20: 45 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44  E_ATTRIBUTES ((D
0b30: 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64 69 66  WORD)-1) .#endif
0b40: 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46  ..#ifndef FILE_F
0b50: 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  LAG_MASK.# defin
0b60: 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b  e FILE_FLAG_MASK
0b70: 20 20 20 20 20 20 20 20 20 20 28 30 78 46 46 33            (0xFF3
0b80: 43 30 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23  C0000).#endif..#
0b90: 69 66 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52  ifndef FILE_ATTR
0ba0: 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66  IBUTE_MASK.# def
0bb0: 69 6e 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55  ine FILE_ATTRIBU
0bc0: 54 45 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30  TE_MASK     (0x0
0bd0: 30 30 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a  003FFF7).#endif.
0be0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0bf0: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77  OMIT_WAL./* Forw
0c00: 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a  ard references *
0c10: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0c20: 20 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20   winShm winShm; 
0c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
0c40: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
0c50: 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79  red-memory */.ty
0c60: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
0c70: 53 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f  ShmNode winShmNo
0c80: 64 65 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f  de;   /* A regio
0c90: 6e 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n of shared-memo
0ca0: 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry */.#endif../*
0cb0: 0a 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20  .** WinCE lacks 
0cc0: 6e 61 74 69 76 65 20 73 75 70 70 6f 72 74 20 66  native support f
0cd0: 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  or file locking 
0ce0: 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 66 61  so we have to fa
0cf0: 6b 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f  ke it.** with so
0d00: 6d 65 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f  me code of our o
0d10: 77 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  wn..*/.#if SQLIT
0d20: 45 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64  E_OS_WINCE.typed
0d30: 65 66 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c  ef struct winceL
0d40: 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61  ock {.  int nRea
0d50: 64 65 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  ders;       /* N
0d60: 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65 72 20  umber of reader 
0d70: 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a  locks obtained *
0d80: 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e  /.  BOOL bPendin
0d90: 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63  g;      /* Indic
0da0: 61 74 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c  ates a pending l
0db0: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
0dc0: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
0dd0: 62 52 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f  bReserved;     /
0de0: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 72 65  * Indicates a re
0df0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20  served lock has 
0e00: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
0e10: 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69  .  BOOL bExclusi
0e20: 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  ve;    /* Indica
0e30: 74 65 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  tes an exclusive
0e40: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
0e50: 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e  btained */.} win
0e60: 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a  ceLock;.#endif..
0e70: 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c  /*.** The winFil
0e80: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  e structure is a
0e90: 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c   subclass of sql
0ea0: 69 74 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69  ite3_file* speci
0eb0: 66 69 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32  fic to the win32
0ec0: 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20  .** portability 
0ed0: 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  layer..*/.typede
0ee0: 66 20 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65  f struct winFile
0ef0: 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74   winFile;.struct
0f00: 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e   winFile {.  con
0f10: 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
0f20: 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20  thods *pMethod; 
0f30: 2f 2a 2a 2a 20 4d 75 73 74 20 62 65 20 66 69 72  /*** Must be fir
0f40: 73 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65  st ***/.  sqlite
0f50: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
0f60: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 75 73 65    /* The VFS use
0f70: 64 20 74 6f 20 6f 70 65 6e 20 74 68 69 73 20 66  d to open this f
0f80: 69 6c 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ile */.  HANDLE 
0f90: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0fa0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
0fb0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c  ccessing the fil
0fc0: 65 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79  e */.  u8 lockty
0fd0: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
0fe0: 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63  * Type of lock c
0ff0: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e  urrently held on
1000: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1010: 73 68 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b  short sharedLock
1020: 42 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f  Byte;   /* Rando
1030: 6d 6c 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20  mly chosen byte 
1040: 75 73 65 64 20 61 73 20 61 20 73 68 61 72 65 64  used as a shared
1050: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74   lock */.  u8 ct
1060: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  rlFlags;        
1070: 20 20 20 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65     /* Flags.  Se
1080: 65 20 57 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f  e WINFILE_* belo
1090: 77 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  w */.  DWORD las
10a0: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f  tErrno;        /
10b0: 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
10c0: 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
10d0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23  t I/O error */.#
10e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10f0: 49 54 5f 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20  IT_WAL.  winShm 
1100: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
1110: 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20   /* Instance of 
1120: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e  shared memory on
1130: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65   this file */.#e
1140: 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 63 68 61  ndif.  const cha
1150: 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 2f  r *zPath;      /
1160: 2a 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  * Full pathname 
1170: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  of this file */.
1180: 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20    int szChunk;  
1190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75            /* Chu
11a0: 6e 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67 75 72  nk size configur
11b0: 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e  ed by FCNTL_CHUN
11c0: 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51  K_SIZE */.#if SQ
11d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11e0: 4c 50 57 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e  LPWSTR zDeleteOn
11f0: 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  Close;  /* Name 
1200: 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74  of file to delet
1210: 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a  e when closing *
1220: 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65  /.  HANDLE hMute
1230: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  x;          /* M
1240: 75 74 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e  utex used to con
1250: 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73  trol access to s
1260: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a  hared lock */  .
1270: 20 20 48 41 4e 44 4c 45 20 68 53 68 61 72 65 64    HANDLE hShared
1280: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61  ;         /* Sha
1290: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
12a0: 6e 74 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  nt used for lock
12b0: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f  ing */.  winceLo
12c0: 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20  ck local;       
12d0: 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e   /* Locks obtain
12e0: 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 61  ed by this insta
12f0: 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a  nce of winFile *
1300: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73  /.  winceLock *s
1310: 68 61 72 65 64 3b 20 20 20 20 20 20 2f 2a 20 47  hared;      /* G
1320: 6c 6f 62 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  lobal shared loc
1330: 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  k memory for the
1340: 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66   file  */.#endif
1350: 0a 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20  .  HANDLE hMap; 
1360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
1370: 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69  ndle for accessi
1380: 6e 67 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  ng memory mappin
1390: 67 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61  g */.  void *pMa
13a0: 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 2f  pRegion;       /
13b0: 2a 20 41 72 65 61 20 6d 65 6d 6f 72 79 20 6d 61  * Area memory ma
13c0: 70 70 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  pped */.  sqlite
13d0: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65  3_int64 mmapSize
13e0: 3b 20 2f 2a 20 53 69 7a 65 20 6f 66 20 78 4d 72  ; /* Size of xMr
13f0: 65 6d 61 70 28 29 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  emap() */.};../*
1400: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
1410: 65 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63  es for winFile.c
1420: 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  trlFlags.*/.#def
1430: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e  ine WINFILE_RDON
1440: 4c 59 20 20 20 20 20 20 20 20 20 20 30 78 30 32  LY          0x02
1450: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1460: 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f   is read only */
1470: 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45  .#define WINFILE
1480: 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20 20 20  _PERSIST_WAL    
1490: 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72 73 69   0x04   /* Persi
14a0: 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a  stent WAL mode *
14b0: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c  /.#define WINFIL
14c0: 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 20 20  E_PSOW          
14d0: 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51 4c 49    0x10   /* SQLI
14e0: 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
14f0: 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a  FE_OVERWRITE */.
1500: 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a 65 20  ./*. * The size 
1510: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 75 73  of the buffer us
1520: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 69  ed by sqlite3_wi
1530: 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28  n32_write_debug(
1540: 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ).. */.#ifndef S
1550: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
1560: 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  BUF_SIZE.#  defi
1570: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
1580: 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20 20 28  DBG_BUF_SIZE   (
1590: 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a 65 6f  (int)(4096-sizeo
15a0: 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e 64 69  f(DWORD))).#endi
15b0: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c  f../*. * The val
15c0: 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  ue used with sql
15d0: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
15e0: 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70  irectory() to sp
15f0: 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68  ecify that. * th
1600: 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
1610: 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67   should be chang
1620: 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ed.. */.#ifndef 
1630: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
1640: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
1650: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
1660: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
1670: 45 43 54 4f 52 59 5f 54 59 50 45 20 28 31 29 0a  ECTORY_TYPE (1).
1680: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
1690: 65 20 76 61 6c 75 65 20 75 73 65 64 20 77 69 74  e value used wit
16a0: 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  h sqlite3_win32_
16b0: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20  set_directory() 
16c0: 74 6f 20 73 70 65 63 69 66 79 20 74 68 61 74 0a  to specify that.
16d0: 20 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79   * the temporary
16e0: 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75 6c   directory shoul
16f0: 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a  d be changed.. *
1700: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1710: 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45  _WIN32_TEMP_DIRE
1720: 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64 65  CTORY_TYPE.#  de
1730: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
1740: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
1750: 5f 54 59 50 45 20 28 32 29 0a 23 65 6e 64 69 66  _TYPE (2).#endif
1760: 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69  ../*. * If compi
1770: 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f  led with SQLITE_
1780: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20  WIN32_MALLOC on 
1790: 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c 6c  Windows, we will
17a0: 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61 72 69   use the. * vari
17b0: 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20 68 65  ous Win32 API he
17c0: 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 73  ap functions ins
17d0: 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e 2e  tead of our own.
17e0: 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
17f0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a  TE_WIN32_MALLOC.
1800: 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73 20 69  ./*. * If this i
1810: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69  s non-zero, an i
1820: 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c  solated heap wil
1830: 6c 20 62 65 20 63 72 65 61 74 65 64 20 62 79 20  l be created by 
1840: 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e 33 32  the native Win32
1850: 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20 73 75  . * allocator su
1860: 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72 77 69  bsystem; otherwi
1870: 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20  se, the default 
1880: 70 72 6f 63 65 73 73 20 68 65 61 70 20 77 69 6c  process heap wil
1890: 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68 69 73  l be used.  This
18a0: 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61 73 20  . * setting has 
18b0: 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e 20 63  no effect when c
18c0: 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57 69 6e  ompiling for Win
18d0: 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c  RT.  By default,
18e0: 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c 65 64   this is enabled
18f0: 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f 6c 61  . * and an isola
1900: 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ted heap will be
1910: 20 63 72 65 61 74 65 64 20 74 6f 20 73 74 6f 72   created to stor
1920: 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65 64 20  e all allocated 
1930: 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a  data.. *. ******
1940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1980: 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e  ********. * WARN
1990: 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70 6f 72  ING: It is impor
19a0: 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74 68 61  tant to note tha
19b0: 74 20 77 68 65 6e 20 74 68 69 73 20 73 65 74 74  t when this sett
19c0: 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ing is non-zero 
19d0: 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20 20 20  and the. *      
19e0: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
19f0: 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  wn function is c
1a00: 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79 20 74  alled (e.g. by t
1a10: 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  he sqlite3_shutd
1a20: 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 20  own. *          
1a30: 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c 20 64  function), all d
1a40: 61 74 61 20 74 68 61 74 20 77 61 73 20 61 6c 6c  ata that was all
1a50: 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  ocated using the
1a60: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
1a70: 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 20  ill. *          
1a80: 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64 69 61  be freed immedia
1a90: 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61 74 74  tely and any att
1aa0: 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73 20 61  empt to access a
1ab0: 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65 65 64  ny of that freed
1ac0: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64 61 74  . *          dat
1ad0: 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20 63 65  a will almost ce
1ae0: 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74 20 69  rtainly result i
1af0: 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 61  n an immediate a
1b00: 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f 6e 2e  ccess violation.
1b10: 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  . **************
1b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b60: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
1b70: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43  ITE_WIN32_HEAP_C
1b80: 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e 65 20  REATE.#  define 
1b90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
1ba0: 50 5f 43 52 45 41 54 45 20 20 20 20 28 54 52 55  P_CREATE    (TRU
1bb0: 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  E).#endif../*. *
1bc0: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a   The initial siz
1bd0: 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73  e of the Win32-s
1be0: 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 54  pecific heap.  T
1bf0: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
1c00: 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64   zero.. */.#ifnd
1c10: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1c20: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23  HEAP_INIT_SIZE.#
1c30: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
1c40: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
1c50: 53 49 5a 45 20 28 28 53 51 4c 49 54 45 5f 44 45  SIZE ((SQLITE_DE
1c60: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
1c70: 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20 20 20  ) * \.          
1c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51               (SQ
1ca0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
1cb0: 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 34 33 30  E_SIZE) + 419430
1cc0: 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  4).#endif../*. *
1cd0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   The maximum siz
1ce0: 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73  e of the Win32-s
1cf0: 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 54  pecific heap.  T
1d00: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
1d10: 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64   zero.. */.#ifnd
1d20: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1d30: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20  HEAP_MAX_SIZE.# 
1d40: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
1d50: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
1d60: 5a 45 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a  ZE  (0).#endif..
1d70: 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20  /*. * The extra 
1d80: 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20  flags to use in 
1d90: 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e  calls to the Win
1da0: 33 32 20 68 65 61 70 20 41 50 49 73 2e 20 20 54  32 heap APIs.  T
1db0: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
1dc0: 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65  . * zero for the
1dd0: 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f   default behavio
1de0: 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  r.. */.#ifndef S
1df0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
1e00: 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65  _FLAGS.#  define
1e10: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
1e20: 41 50 5f 46 4c 41 47 53 20 20 20 20 20 28 30 29  AP_FLAGS     (0)
1e30: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1e40: 68 65 20 77 69 6e 4d 65 6d 44 61 74 61 20 73 74  he winMemData st
1e50: 72 75 63 74 75 72 65 20 73 74 6f 72 65 73 20 69  ructure stores i
1e60: 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75 69  nformation requi
1e70: 72 65 64 20 62 79 20 74 68 65 20 57 69 6e 33 32  red by the Win32
1e80: 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c  -specific.** sql
1e90: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
1ea0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
1eb0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1ec0: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69  ct winMemData wi
1ed0: 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72 75 63 74  nMemData;.struct
1ee0: 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b 0a 23 69   winMemData {.#i
1ef0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75  fndef NDEBUG.  u
1f00: 33 32 20 6d 61 67 69 63 3b 20 20 20 20 2f 2a 20  32 magic;    /* 
1f10: 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20  Magic number to 
1f20: 64 65 74 65 63 74 20 73 74 72 75 63 74 75 72 65  detect structure
1f30: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a   corruption. */.
1f40: 23 65 6e 64 69 66 0a 20 20 48 41 4e 44 4c 45 20  #endif.  HANDLE 
1f50: 68 48 65 61 70 3b 20 2f 2a 20 54 68 65 20 68 61  hHeap; /* The ha
1f60: 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68 65 61 70  ndle to our heap
1f70: 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e  . */.  BOOL bOwn
1f80: 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77  ed;  /* Do we ow
1f90: 6e 20 74 68 65 20 68 65 61 70 20 28 69 2e 65 2e  n the heap (i.e.
1fa0: 20 64 65 73 74 72 6f 79 20 69 74 20 6f 6e 20 73   destroy it on s
1fb0: 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a 7d 3b 0a  hutdown)? */.};.
1fc0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1fd0: 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d  #define WINMEM_M
1fe0: 41 47 49 43 20 20 20 20 20 30 78 34 32 62 32 38  AGIC     0x42b28
1ff0: 33 30 62 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  30b.#endif..stat
2000: 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d  ic struct winMem
2010: 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  Data win_mem_dat
2020: 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44  a = {.#ifndef ND
2030: 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41  EBUG.  WINMEM_MA
2040: 47 49 43 2c 0a 23 65 6e 64 69 66 0a 20 20 4e 55  GIC,.#endif.  NU
2050: 4c 4c 2c 20 46 41 4c 53 45 0a 7d 3b 0a 0a 23 69  LL, FALSE.};..#i
2060: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65  fndef NDEBUG.#de
2070: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
2080: 74 4d 61 67 69 63 28 29 20 61 73 73 65 72 74 28  tMagic() assert(
2090: 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61   win_mem_data.ma
20a0: 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  gic==WINMEM_MAGI
20b0: 43 20 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  C ).#else.#defin
20c0: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
20d0: 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64  gic().#endif..#d
20e0: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48  efine winMemGetH
20f0: 65 61 70 28 29 20 77 69 6e 5f 6d 65 6d 5f 64 61  eap() win_mem_da
2100: 74 61 2e 68 48 65 61 70 0a 0a 73 74 61 74 69 63  ta.hHeap..static
2110: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c   void *winMemMal
2120: 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b  loc(int nBytes);
2130: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
2140: 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50  MemFree(void *pP
2150: 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f  rior);.static vo
2160: 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f  id *winMemReallo
2170: 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20  c(void *pPrior, 
2180: 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61  int nBytes);.sta
2190: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69  tic int winMemSi
21a0: 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61  ze(void *p);.sta
21b0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f  tic int winMemRo
21c0: 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74  undup(int n);.st
21d0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49  atic int winMemI
21e0: 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61  nit(void *pAppDa
21f0: 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  ta);.static void
2200: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28   winMemShutdown(
2210: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b  void *pAppData);
2220: 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  ..const sqlite3_
2230: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c  mem_methods *sql
2240: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
2250: 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  void);.#endif /*
2260: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
2270: 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  LLOC */../*.** T
2280: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
2290: 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c  iable is (normal
22a0: 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64  ly) set once and
22b0: 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a   never changes.*
22c0: 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20 20 49  * thereafter.  I
22d0: 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65  t records whethe
22e0: 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  r the operating 
22f0: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a  system is Win9x.
2300: 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a  ** or WinNT..**.
2310: 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 0:   Operatin
2320: 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e  g system unknown
2330: 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74  ..** 1:   Operat
2340: 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69  ing system is Wi
2350: 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65  n9x..** 2:   Ope
2360: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
2370: 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e   WinNT..**.** In
2380: 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69   order to facili
2390: 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20  tate testing on 
23a0: 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20  a WinNT system, 
23b0: 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65  the test fixture
23c0: 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79  .** can manually
23d0: 20 73 65 74 20 74 68 69 73 20 76 61 6c 75 65 20   set this value 
23e0: 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20  to 1 to emulate 
23f0: 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a  Win98 behavior..
2400: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2410: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
2420: 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23  3_os_type = 0;.#
2430: 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20  else.static int 
2440: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
2450: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 0;.#endif..#if
2460: 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20  ndef SYSCALL.#  
2470: 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73  define SYSCALL s
2480: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2490: 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  tr.#endif../*.**
24a0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
24b0: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
24c0: 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6f 72  on Windows CE or
24d0: 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66   WinRT.. */..#if
24e0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
24f0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
2500: 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 6f 73  NRT.#  define os
2510: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
2520: 29 20 20 20 20 20 20 20 31 0a 23 65 6e 64 69 66  )       1.#endif
2530: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73  ../*.** Many sys
2540: 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63  tem calls are ac
2550: 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70  cessed through p
2560: 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69  ointer-to-functi
2570: 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ons so that.** t
2580: 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72  hey may be overr
2590: 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65  idden at runtime
25a0: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66   to facilitate f
25b0: 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64  ault injection d
25c0: 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67  uring.** testing
25d0: 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e   and sandboxing.
25e0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
25f0: 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20  array holds the 
2600: 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65  names and pointe
2610: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65  rs.** to all ove
2620: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
2630: 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   calls..*/.stati
2640: 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73  c struct win_sys
2650: 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63  call {.  const c
2660: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
2670: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2680: 66 20 74 68 65 20 73 79 74 65 6d 20 63 61 6c 6c  f the sytem call
2690: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
26a0: 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65  scall_ptr pCurre
26b0: 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76  nt; /* Current v
26c0: 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74  alue of the syst
26d0: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
26e0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
26f0: 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65   pDefault; /* De
2700: 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d  fault value */.}
2710: 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a   aSyscall[] = {.
2720: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
2730: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
2740: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72  OS_WINRT.  { "Ar
2750: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20  eFileApisANSI", 
2760: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
2770: 29 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  )AreFileApisANSI
2780: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
2790: 65 6c 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c  else.  { "AreFil
27a0: 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20  eApisANSI",     
27b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
27e0: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65  f..#ifndef osAre
27f0: 46 69 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65  FileApisANSI.#de
2800: 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70  fine osAreFileAp
2810: 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49  isANSI ((BOOL(WI
2820: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
2830: 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e  scall[0].pCurren
2840: 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  t).#endif..#if S
2850: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
2860: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
2870: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
2880: 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57  .  { "CharLowerW
2890: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
28a0: 28 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77  (SYSCALL)CharLow
28b0: 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  erW,            
28c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
28d0: 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20   "CharLowerW",  
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
28f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
2910: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
2920: 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20  ne osCharLowerW 
2930: 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a  ((LPWSTR(WINAPI*
2940: 29 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61  )(LPWSTR))aSysca
2950: 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[1].pCurrent).
2960: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2970: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
2980: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2990: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
29a0: 55 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20  UpperW",        
29b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
29c0: 68 61 72 55 70 70 65 72 57 2c 20 20 20 20 20 20  harUpperW,      
29d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
29e0: 73 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65  se.  { "CharUppe
29f0: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
2a00: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2a30: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55  .#define osCharU
2a40: 70 70 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  pperW ((LPWSTR(W
2a50: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
2a60: 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72  aSyscall[2].pCur
2a70: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73  rent)..  { "Clos
2a80: 65 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20  eHandle",       
2a90: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
2aa0: 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20  loseHandle,     
2ab0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
2ac0: 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e  efine osCloseHan
2ad0: 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  dle ((BOOL(WINAP
2ae0: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
2af0: 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74  call[3].pCurrent
2b00: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
2b10: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2b20: 41 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74  ANSI).  { "Creat
2b30: 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20  eFileA",        
2b40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
2b50: 65 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20  eateFileA,      
2b60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
2b70: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
2b80: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eA",            
2b90: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2bc0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
2bd0: 46 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57  FileA ((HANDLE(W
2be0: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44  INAPI*)(LPCSTR,D
2bf0: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
2c00: 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59        LPSECURITY
2c10: 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52  _ATTRIBUTES,DWOR
2c20: 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29  D,DWORD,HANDLE))
2c30: 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72  aSyscall[4].pCur
2c40: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
2c50: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
2c60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
2c70: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
2c80: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c  { "CreateFileW",
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
2ca0: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
2cb0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  W,             0
2cc0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
2cd0: 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20  reateFileW",    
2ce0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2cf0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2d00: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2d10: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2d20: 6f 73 43 72 65 61 74 65 46 69 6c 65 57 20 28 28  osCreateFileW ((
2d30: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
2d40: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57  LPCWSTR,DWORD,DW
2d50: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
2d60: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
2d70: 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44  UTES,DWORD,DWORD
2d80: 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  ,HANDLE))aSyscal
2d90: 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[5].pCurrent)..
2da0: 23 69 66 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f  #if (!SQLITE_OS_
2db0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
2dc0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2dd0: 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a 20 20 20  S_ANSI) && \.   
2de0: 20 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51       !defined(SQ
2df0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a  LITE_OMIT_WAL)).
2e00: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
2e10: 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28  appingA",      (
2e20: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
2e30: 6c 65 4d 61 70 70 69 6e 67 41 2c 20 20 20 20 20  leMappingA,     
2e40: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2e50: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
2e60: 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngA",      (SYSC
2e70: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2e90: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2ea0: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  e osCreateFileMa
2eb0: 70 70 69 6e 67 41 20 28 28 48 41 4e 44 4c 45 28  ppingA ((HANDLE(
2ec0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
2ed0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
2ee0: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20  BUTES, \.       
2ef0: 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f   DWORD,DWORD,DWO
2f00: 52 44 2c 4c 50 43 53 54 52 29 29 61 53 79 73 63  RD,LPCSTR))aSysc
2f10: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
2f20: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
2f30: 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49 54  WINCE || (!SQLIT
2f40: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
2f50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2f60: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20  32_HAS_WIDE) && 
2f70: 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69 6e  \.        !defin
2f80: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
2f90: 41 4c 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65  AL)).  { "Create
2fa0: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
2fb0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
2fc0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c  ateFileMappingW,
2fd0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
2fe0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
2ff0: 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20  MappingW",      
3000: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3020: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3030: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
3040: 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48 41  ileMappingW ((HA
3050: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
3060: 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f  NDLE,LPSECURITY_
3070: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
3080: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
3090: 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 29  D,DWORD,LPCWSTR)
30a0: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75  )aSyscall[7].pCu
30b0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
30c0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
30d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
30e0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
30f0: 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57   { "CreateMutexW
3100: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
3110: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75 74  YSCALL)CreateMut
3120: 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  exW,            
3130: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3140: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20  CreateMutexW",  
3150: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3160: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3170: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3180: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3190: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 20   osCreateMutexW 
31a0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
31b0: 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  )(LPSECURITY_ATT
31c0: 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a  RIBUTES,BOOL, \.
31d0: 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52 29          LPCWSTR)
31e0: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
31f0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3200: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3210: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
3220: 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20  DeleteFileA",   
3230: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3240: 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c 20  LL)DeleteFileA, 
3250: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3260: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65  .#else.  { "Dele
3270: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
3280: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
32b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44  dif..#define osD
32c0: 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f 4f  eleteFileA ((BOO
32d0: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  L(WINAPI*)(LPCST
32e0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70  R))aSyscall[9].p
32f0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3300: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3310: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3320: 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20   "DeleteFileW", 
3330: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3340: 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 57  CALL)DeleteFileW
3350: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3360: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65  },.#else.  { "De
3370: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  leteFileW",     
3380: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3390: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
33a0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
33b0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
33c0: 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28 42  sDeleteFileW ((B
33d0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
33e0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31  WSTR))aSyscall[1
33f0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
3400: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
3410: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  E.  { "FileTimeT
3420: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c  oLocalFileTime",
3430: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69   (SYSCALL)FileTi
3440: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
3450: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
3460: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
3470: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
3480: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
34a0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
34b0: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ine osFileTimeTo
34c0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28 28  LocalFileTime ((
34d0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
34e0: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c  NST FILETIME*, \
34f0: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
3500: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 31  IME))aSyscall[11
3510: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3520: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
3530: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
3540: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
3550: 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d  (SYSCALL)FileTim
3560: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  eToSystemTime,  
3570: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3580: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
3590: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
35a0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
35c0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
35d0: 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53  ne osFileTimeToS
35e0: 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f 4c  ystemTime ((BOOL
35f0: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
3600: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
3610: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49 4d       LPSYSTEMTIM
3620: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e  E))aSyscall[12].
3630: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3640: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
3650: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
3660: 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66 66  LL)FlushFileBuff
3670: 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  ers,        0 },
3680: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73  ..#define osFlus
3690: 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28 42  hFileBuffers ((B
36a0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
36b0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 33  DLE))aSyscall[13
36c0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
36d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
36e0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
36f0: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
3700: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28  geA",          (
3710: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
3720: 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20 20  ssageA,         
3730: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3740: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
3750: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
3760: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3780: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3790: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
37a0: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
37b0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
37c0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
37d0: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
37e0: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
37f0: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
3800: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3810: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3820: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 46  HAS_WIDE).  { "F
3830: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20  ormatMessageW", 
3840: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3850: 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  L)FormatMessageW
3860: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
3870: 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61  #else.  { "Forma
3880: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
3890: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
38c0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f  if..#define osFo
38d0: 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28 44  rmatMessageW ((D
38e0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
38f0: 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  ORD,LPCVOID,DWOR
3900: 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20  D,DWORD,LPWSTR, 
3910: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
3920: 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61  va_list*))aSysca
3930: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[15].pCurrent)
3940: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
3950: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
3960: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
3970: 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20  FreeLibrary",   
3980: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3990: 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79 2c 20  LL)FreeLibrary, 
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
39b0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72 65 65  .#else.  { "Free
39c0: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20  Library",       
39d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
39e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
39f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3a00: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
3a10: 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f  reeLibrary ((BOO
3a20: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  L(WINAPI*)(HMODU
3a30: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  LE))aSyscall[16]
3a40: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3a50: 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  "GetCurrentProce
3a60: 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53 43  ssId",     (SYSC
3a70: 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72  ALL)GetCurrentPr
3a80: 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d  ocessId,     0 }
3a90: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
3aa0: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
3ab0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
3ac0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
3ad0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
3ae0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
3af0: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
3b00: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3b10: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44  _ANSI).  { "GetD
3b20: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
3b30: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
3b40: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
3b50: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
3b60: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
3b70: 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20  reeSpaceA",     
3b80: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ba0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3bb0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
3bc0: 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28 42  skFreeSpaceA ((B
3bd0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
3be0: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
3bf0: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
3c00: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
3c10: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
3c20: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
3c30: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
3c40: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
3c50: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
3c60: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3c70: 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  E).  { "GetDiskF
3c80: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
3c90: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69    (SYSCALL)GetDi
3ca0: 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20 20  skFreeSpaceW,   
3cb0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3cc0: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
3cd0: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
3ce0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d00: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3d10: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72  fine osGetDiskFr
3d20: 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c 28  eeSpaceW ((BOOL(
3d30: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
3d40: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
3d50: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
3d60: 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79      LPDWORD))aSy
3d70: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65  scall[19].pCurre
3d80: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3d90: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3da0: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
3db0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
3dc0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3dd0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
3de0: 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sA,      0 },.#e
3df0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
3e00: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
3e10: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e30: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3e40: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
3e50: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20 28  ileAttributesA (
3e60: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3e70: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
3e80: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
3e90: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
3ea0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
3eb0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3ec0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
3ed0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c  ileAttributesW",
3ee0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
3ef0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3f00: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
3f10: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  se.  { "GetFileA
3f20: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20  ttributesW",    
3f30: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f50: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3f60: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
3f70: 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28 28  leAttributesW ((
3f80: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c  DWORD(WINAPI*)(L
3f90: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
3fa0: 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [21].pCurrent)..
3fb0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3fc0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
3fd0: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  E).  { "GetFileA
3fe0: 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20  ttributesExW",  
3ff0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
4000: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 2c  leAttributesExW,
4010: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4020: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
4030: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53  butesExW",    (S
4040: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4060: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4070: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
4080: 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42 4f  tributesExW ((BO
4090: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  OL(WINAPI*)(LPCW
40a0: 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f 49  STR,GET_FILEEX_I
40b0: 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20 20  NFO_LEVELS, \.  
40c0: 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61 53        LPVOID))aS
40d0: 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72  yscall[22].pCurr
40e0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
40f0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
4100: 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20  GetFileSize",   
4110: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4120: 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65 2c 20  LL)GetFileSize, 
4130: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4140: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4150: 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20  ileSize",       
4160: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4170: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4180: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4190: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
41a0: 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44 57 4f  etFileSize ((DWO
41b0: 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  RD(WINAPI*)(HAND
41c0: 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53 79 73  LE,LPDWORD))aSys
41d0: 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e  call[23].pCurren
41e0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
41f0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
4200: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4210: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
4220: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
4230: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
4240: 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  LL)GetFullPathNa
4250: 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  meA,        0 },
4260: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4270: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20  ullPathNameA",  
4280: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
42a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
42b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
42c0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 20  etFullPathNameA 
42d0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
42e0: 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c 50  (LPCSTR,DWORD,LP
42f0: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  STR, \.        L
4300: 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  PSTR*))aSyscall[
4310: 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  24].pCurrent)..#
4320: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4330: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
4340: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
4350: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4360: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
4370: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
4380: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
4390: 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  L)GetFullPathNam
43a0: 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  eW,        0 },.
43b0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75  #else.  { "GetFu
43c0: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20  llPathNameW",   
43d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4400: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4410: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28  tFullPathNameW (
4420: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
4430: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50  LPCWSTR,DWORD,LP
4440: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
4450: 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61 6c  LPWSTR*))aSyscal
4460: 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[25].pCurrent).
4470: 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72 72  .  { "GetLastErr
4480: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  or",            
4490: 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73 74  (SYSCALL)GetLast
44a0: 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
44b0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
44c0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20 28  osGetLastError (
44d0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
44e0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
44f0: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
4500: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4510: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
4520: 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c 49 54  NSION).#if SQLIT
4530: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20  E_OS_WINCE.  /* 
4540: 54 68 65 20 47 65 74 50 72 6f 63 41 64 64 72 65  The GetProcAddre
4550: 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ssA() routine is
4560: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
4570: 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 2a  on Windows CE. *
4580: 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  /.  { "GetProcAd
4590: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
45a0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f   (SYSCALL)GetPro
45b0: 63 41 64 64 72 65 73 73 41 2c 20 20 20 20 20 20  cAddressA,      
45c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
45d0: 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57 69 6e  /* All other Win
45e0: 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65  dows platforms e
45f0: 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64 64  xpect GetProcAdd
4600: 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20  ress() to take. 
4610: 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74 72 69   ** an ANSI stri
4620: 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ng regardless of
4630: 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65   the _UNICODE se
4640: 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47 65  tting */.  { "Ge
4650: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
4660: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4670: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 2c  )GetProcAddress,
4680: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4690: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20 7b 20  endif.#else.  { 
46a0: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  "GetProcAddressA
46b0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
46c0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
46e0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
46f0: 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65  e osGetProcAddre
4700: 73 73 41 20 28 28 46 41 52 50 52 4f 43 28 57 49  ssA ((FARPROC(WI
4710: 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 2c 20  NAPI*)(HMODULE, 
4720: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52  \.        LPCSTR
4730: 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70  ))aSyscall[27].p
4740: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4750: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
4760: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66   { "GetSystemInf
4770: 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  o",           (S
4780: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
4790: 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
47a0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
47b0: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  GetSystemInfo", 
47c0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
47d0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
47f0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4800: 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   osGetSystemInfo
4810: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
4820: 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29  (LPSYSTEM_INFO))
4830: 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75  aSyscall[28].pCu
4840: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
4850: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
4860: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4870: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  GetSystemTime,  
4880: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4890: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
48a0: 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49  emTime ((VOID(WI
48b0: 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 54  NAPI*)(LPSYSTEMT
48c0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32 39  IME))aSyscall[29
48d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
48e0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
48f0: 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  E.  { "GetSystem
4900: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c  TimeAsFileTime",
4910: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73   (SYSCALL)GetSys
4920: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
4930: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
4940: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
4950: 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  AsFileTime", (SY
4960: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4980: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4990: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54  ine osGetSystemT
49a0: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28 28  imeAsFileTime ((
49b0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c  VOID(WINAPI*)( \
49c0: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
49d0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 30  IME))aSyscall[30
49e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
49f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4a00: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
4a10: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
4a20: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
4a30: 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50  SYSCALL)GetTempP
4a40: 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 20 20  athA,           
4a50: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4a60: 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20  "GetTempPathA", 
4a70: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4a80: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4aa0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4ab0: 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41  e osGetTempPathA
4ac0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
4ad0: 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29 61  )(DWORD,LPSTR))a
4ae0: 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75 72  Syscall[31].pCur
4af0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4b00: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
4b10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4b20: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4b30: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22  { "GetTempPathW"
4b40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
4b50: 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74  SCALL)GetTempPat
4b60: 68 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  hW,            0
4b70: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4b80: 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20  etTempPathW",   
4b90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4ba0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4bb0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4bc0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4bd0: 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 20 28  osGetTempPathW (
4be0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
4bf0: 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29 61 53  DWORD,LPWSTR))aS
4c00: 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75 72 72  yscall[32].pCurr
4c10: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4c20: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
4c30: 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20  GetTickCount",  
4c40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4c50: 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 2c  LL)GetTickCount,
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4c70: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
4c80: 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20 20  ickCount",      
4c90: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4ca0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4cb0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4cc0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4cd0: 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44 57  etTickCount ((DW
4ce0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  ORD(WINAPI*)(VOI
4cf0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d 2e  D))aSyscall[33].
4d00: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
4d10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4d20: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4d30: 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41  { "GetVersionExA
4d40: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
4d50: 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e  SCALL)GetVersion
4d60: 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20 30  ExA,           0
4d70: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4d80: 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20  etVersionExA",  
4d90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4da0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4db0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4dc0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4dd0: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20  osGetVersionExA 
4de0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4df0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56   \.        LPOSV
4e00: 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79  ERSIONINFOA))aSy
4e10: 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65  scall[34].pCurre
4e20: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c  nt)..  { "HeapAl
4e30: 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  loc",           
4e40: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
4e50: 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20  pAlloc,         
4e60: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
4e70: 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20  ine osHeapAlloc 
4e80: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
4e90: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
4ea0: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
4eb0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70  ))aSyscall[35].p
4ec0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4ed0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
4ee0: 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c   { "HeapCreate",
4ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4f00: 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74  YSCALL)HeapCreat
4f10: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
4f20: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4f30: 48 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20  HeapCreate",    
4f40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4f50: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4f60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4f70: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4f80: 20 6f 73 48 65 61 70 43 72 65 61 74 65 20 28 28   osHeapCreate ((
4f90: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
4fa0: 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a  DWORD,SIZE_T, \.
4fb0: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
4fc0: 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75  aSyscall[36].pCu
4fd0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4fe0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
4ff0: 20 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20   "HeapDestroy", 
5000: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5010: 43 41 4c 4c 29 48 65 61 70 44 65 73 74 72 6f 79  CALL)HeapDestroy
5020: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
5030: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65  },.#else.  { "He
5040: 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20  apDestroy",     
5050: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5060: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5070: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5080: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5090: 73 48 65 61 70 44 65 73 74 72 6f 79 20 28 28 42  sHeapDestroy ((B
50a0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
50b0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 37  DLE))aSyscall[37
50c0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
50d0: 20 22 48 65 61 70 46 72 65 65 22 2c 20 20 20 20   "HeapFree",    
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
50f0: 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20  CALL)HeapFree,  
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5110: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
5120: 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49  apFree ((BOOL(WI
5130: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
5140: 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73  ORD,LPVOID))aSys
5150: 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65 6e  call[38].pCurren
5160: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41  t)..  { "HeapReA
5170: 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20  lloc",          
5180: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5190: 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20  ReAlloc,        
51a0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
51b0: 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63  ne osHeapReAlloc
51c0: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
51d0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
51e0: 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20  LPVOID, \.      
51f0: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
5200: 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[39].pCurrent)
5210: 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22  ..  { "HeapSize"
5220: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5230: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69   (SYSCALL)HeapSi
5240: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
5250: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5260: 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28 53 49   osHeapSize ((SI
5270: 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41  ZE_T(WINAPI*)(HA
5280: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  NDLE,DWORD, \.  
5290: 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61        LPCVOID))a
52a0: 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72  Syscall[40].pCur
52b0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
52c0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
52d0: 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20  "HeapValidate", 
52e0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
52f0: 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65  ALL)HeapValidate
5300: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
5310: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61  ,.#else.  { "Hea
5320: 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20  pValidate",     
5330: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5340: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5350: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5360: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5370: 48 65 61 70 56 61 6c 69 64 61 74 65 20 28 28 42  HeapValidate ((B
5380: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
5390: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
53a0: 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53       LPCVOID))aS
53b0: 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72  yscall[41].pCurr
53c0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
53d0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
53e0: 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64 65 66  AS_ANSI) && !def
53f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5400: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
5410: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
5420: 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yA",            
5430: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62  (SYSCALL)LoadLib
5440: 72 61 72 79 41 2c 20 20 20 20 20 20 20 20 20 20  raryA,          
5450: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5460: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c   "LoadLibraryA",
5470: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5480: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
54a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
54b0: 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79  ne osLoadLibrary
54c0: 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  A ((HMODULE(WINA
54d0: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
54e0: 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65  scall[42].pCurre
54f0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5500: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
5510: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5520: 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c  2_HAS_WIDE) && \
5530: 0a 20 20 20 20 20 20 20 20 21 64 65 66 69 6e 65  .        !define
5540: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
5550: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
5560: 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22  { "LoadLibraryW"
5570: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5580: 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72  SCALL)LoadLibrar
5590: 79 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  yW,            0
55a0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
55b0: 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20  oadLibraryW",   
55c0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
55d0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
55e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
55f0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5600: 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 20 28  osLoadLibraryW (
5610: 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a  (HMODULE(WINAPI*
5620: 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  )(LPCWSTR))aSysc
5630: 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74  all[43].pCurrent
5640: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5650: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63  S_WINRT.  { "Loc
5660: 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 20  alFree",        
5670: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5680: 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20 20 20  LocalFree,      
5690: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
56a0: 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72  lse.  { "LocalFr
56b0: 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ee",            
56c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
56f0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61  ..#define osLoca
5700: 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c 28 57  lFree ((HLOCAL(W
5710: 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29  INAPI*)(HLOCAL))
5720: 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 43 75  aSyscall[44].pCu
5730: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5740: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
5750: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5760: 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c  .  { "LockFile",
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c  (SYSCALL)LockFil
5790: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
57a0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
57b0: 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20   "LockFile",    
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
57d0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
57e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
57f0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
5800: 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23 64  ef osLockFile.#d
5810: 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65  efine osLockFile
5820: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
5830: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
5840: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
5850: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
5860: 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e  call[45].pCurren
5870: 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  t).#endif..#if !
5880: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
5890: 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22    { "LockFileEx"
58a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
58b0: 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65  SYSCALL)LockFile
58c0: 45 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Ex,             
58d0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
58e0: 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  "LockFileEx",   
58f0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5900: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5920: 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ,.#endif..#ifnde
5930: 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 0a 23  f osLockFileEx.#
5940: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c  define osLockFil
5950: 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  eEx ((BOOL(WINAP
5960: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
5970: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f  ,DWORD,DWORD,DWO
5980: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
5990: 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73  OVERLAPPED))aSys
59a0: 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e  call[46].pCurren
59b0: 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53  t).#endif..#if S
59c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
59d0: 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  | (!SQLITE_OS_WI
59e0: 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
59f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
5a00: 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  ).  { "MapViewOf
5a10: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
5a20: 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65   (SYSCALL)MapVie
5a30: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
5a40: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5a50: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
5a60: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5a70: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5a90: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
5aa0: 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  ine osMapViewOfF
5ab0: 69 6c 65 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  ile ((LPVOID(WIN
5ac0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
5ad0: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
5ae0: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
5af0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e 70  ))aSyscall[47].p
5b00: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d  Current)..  { "M
5b10: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
5b20: 61 72 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ar",     (SYSCAL
5b30: 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  L)MultiByteToWid
5b40: 65 43 68 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a  eChar,     0 },.
5b50: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69  .#define osMulti
5b60: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 20 28  ByteToWideChar (
5b70: 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49  (int(WINAPI*)(UI
5b80: 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c  NT,DWORD,LPCSTR,
5b90: 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  int,LPWSTR, \.  
5ba0: 20 20 20 20 20 20 69 6e 74 29 29 61 53 79 73 63        int))aSysc
5bb0: 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74  all[48].pCurrent
5bc0: 29 0a 0a 20 20 7b 20 22 51 75 65 72 79 50 65 72  )..  { "QueryPer
5bd0: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22  formanceCounter"
5be0: 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 65 72 79  , (SYSCALL)Query
5bf0: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
5c00: 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e  er, 0 },..#defin
5c10: 65 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d  e osQueryPerform
5c20: 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 28 42 4f  anceCounter ((BO
5c30: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20  OL(WINAPI*)( \. 
5c40: 20 20 20 20 20 20 20 4c 41 52 47 45 5f 49 4e 54         LARGE_INT
5c50: 45 47 45 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  EGER*))aSyscall[
5c60: 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  49].pCurrent).. 
5c70: 20 7b 20 22 52 65 61 64 46 69 6c 65 22 2c 20 20   { "ReadFile",  
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
5c90: 59 53 43 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c  YSCALL)ReadFile,
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cb0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5cc0: 52 65 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28  ReadFile ((BOOL(
5cd0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5ce0: 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44  LPVOID,DWORD,LPD
5cf0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
5d00: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
5d10: 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72  yscall[50].pCurr
5d20: 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e  ent)..  { "SetEn
5d30: 64 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  dOfFile",       
5d40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65       (SYSCALL)Se
5d50: 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20 20  tEndOfFile,     
5d60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
5d70: 66 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66 46  fine osSetEndOfF
5d80: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
5d90: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
5da0: 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e  call[51].pCurren
5db0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5dc0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65  OS_WINRT.  { "Se
5dd0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20  tFilePointer",  
5de0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5df0: 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c  )SetFilePointer,
5e00: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5e10: 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c  else.  { "SetFil
5e20: 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20  ePointer",      
5e30: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e50: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5e60: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74  f..#define osSet
5e70: 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 28 44 57  FilePointer ((DW
5e80: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
5e90: 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20  DLE,LONG,PLONG, 
5ea0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
5eb0: 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e 70 43  )aSyscall[52].pC
5ec0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5ed0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
5ee0: 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20  { "Sleep",      
5ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5f00: 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20  SCALL)Sleep,    
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5f20: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53   },.#else.  { "S
5f30: 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  leep",          
5f40: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5f50: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5f60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5f70: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5f80: 6f 73 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57  osSleep ((VOID(W
5f90: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61  INAPI*)(DWORD))a
5fa0: 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72  Syscall[53].pCur
5fb0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74  rent)..  { "Syst
5fc0: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
5fd0: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53  ",    (SYSCALL)S
5fe0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
5ff0: 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64  ime,    0 },..#d
6000: 65 66 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69  efine osSystemTi
6010: 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42  meToFileTime ((B
6020: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e  OOL(WINAPI*)(CON
6030: 53 54 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20  ST SYSTEMTIME*, 
6040: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
6050: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  TIME))aSyscall[5
6060: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
6070: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6080: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
6090: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f  _WINRT.  { "Unlo
60a0: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
60b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
60c0: 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20  nlockFile,      
60d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
60e0: 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  se.  { "UnlockFi
60f0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
6100: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6120: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6130: 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63  .#ifndef osUnloc
6140: 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73  kFile.#define os
6150: 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f  UnlockFile ((BOO
6160: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6170: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
6180: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ORD, \.        D
6190: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
61a0: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  5].pCurrent).#en
61b0: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
61c0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55  _OS_WINCE.  { "U
61d0: 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  nlockFileEx",   
61e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
61f0: 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20  L)UnlockFileEx, 
6200: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6210: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63  #else.  { "Unloc
6220: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
6230: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6250: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6260: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e  if..#define osUn
6270: 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f  lockFileEx ((BOO
6280: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6290: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
62a0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
62b0: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
62c0: 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65  scall[56].pCurre
62d0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
62e0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21 64 65 66  OS_WINCE || !def
62f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6300: 5f 57 41 4c 29 0a 20 20 7b 20 22 55 6e 6d 61 70  _WAL).  { "Unmap
6310: 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20  ViewOfFile",    
6320: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e       (SYSCALL)Un
6330: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20 20  mapViewOfFile,  
6340: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6350: 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77  e.  { "UnmapView
6360: 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  OfFile",        
6370: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6390: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
63a0: 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56  #define osUnmapV
63b0: 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c  iewOfFile ((BOOL
63c0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49  (WINAPI*)(LPCVOI
63d0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e  D))aSyscall[57].
63e0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
63f0: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
6400: 79 74 65 22 2c 20 20 20 20 20 28 53 59 53 43 41  yte",     (SYSCA
6410: 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d 75 6c  LL)WideCharToMul
6420: 74 69 42 79 74 65 2c 20 20 20 20 20 30 20 7d 2c  tiByte,     0 },
6430: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69 64 65  ..#define osWide
6440: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 20  CharToMultiByte 
6450: 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55  ((int(WINAPI*)(U
6460: 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54  INT,DWORD,LPCWST
6470: 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c  R,int,LPSTR,int,
6480: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54   \.        LPCST
6490: 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63 61  R,LPBOOL))aSysca
64a0: 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[58].pCurrent)
64b0: 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69 6c 65  ..  { "WriteFile
64c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
64d0: 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74 65 46   (SYSCALL)WriteF
64e0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
64f0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
6500: 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28 28 42   osWriteFile ((B
6510: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6520: 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  DLE,LPCVOID,DWOR
6530: 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20  D,LPDWORD, \.   
6540: 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45       LPOVERLAPPE
6550: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e  D))aSyscall[59].
6560: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
6570: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6580: 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74 45   { "CreateEventE
6590: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  xW",          (S
65a0: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 45 76 65  YSCALL)CreateEve
65b0: 6e 74 45 78 57 2c 20 20 20 20 20 20 20 20 20 20  ntExW,          
65c0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
65d0: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c  CreateEventExW",
65e0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
65f0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6600: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6610: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6620: 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45 78   osCreateEventEx
6630: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
6640: 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41  I*)(LPSECURITY_A
6650: 54 54 52 49 42 55 54 45 53 2c 4c 50 43 57 53 54  TTRIBUTES,LPCWST
6660: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
6670: 52 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61  RD,DWORD))aSysca
6680: 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[60].pCurrent)
6690: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
66a0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 74  _WINRT.  { "Wait
66b0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22  ForSingleObject"
66c0: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57  ,     (SYSCALL)W
66d0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
66e0: 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ct,     0 },.#el
66f0: 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53  se.  { "WaitForS
6700: 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20  ingleObject",   
6710: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6730: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6740: 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46  .#define osWaitF
6750: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 20 28  orSingleObject (
6760: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
6770: 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20  HANDLE, \.      
6780: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
6790: 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[61].pCurrent).
67a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
67b0: 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f  INRT.  { "WaitFo
67c0: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22  rSingleObjectEx"
67d0: 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69  ,   (SYSCALL)Wai
67e0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
67f0: 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  Ex,   0 },.#else
6800: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
6810: 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20  gleObjectEx",   
6820: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6840: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6850: 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72  define osWaitFor
6860: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 20 28  SingleObjectEx (
6870: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
6880: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
6890: 20 20 20 20 20 20 20 20 42 4f 4f 4c 29 29 61 53          BOOL))aS
68a0: 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72  yscall[62].pCurr
68b0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
68c0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53  _OS_WINRT.  { "S
68d0: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22  etFilePointerEx"
68e0: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
68f0: 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  L)SetFilePointer
6900: 45 78 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  Ex,        0 },.
6910: 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69  #else.  { "SetFi
6920: 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20  lePointerEx",   
6930: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6960: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65  if..#define osSe
6970: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 20 28  tFilePointerEx (
6980: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6990: 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e 54 45  ANDLE,LARGE_INTE
69a0: 47 45 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 50  GER, \.        P
69b0: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 44 57  LARGE_INTEGER,DW
69c0: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 33  ORD))aSyscall[63
69d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
69e0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
69f0: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66  .  { "GetFileInf
6a00: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
6a10: 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65  Ex", (SYSCALL)Ge
6a20: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
6a30: 42 79 48 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c  ByHandleEx, 0 },
6a40: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
6a50: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
6a60: 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43  HandleEx", (SYSC
6a70: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6a80: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6a90: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
6aa0: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
6ab0: 6e 42 79 48 61 6e 64 6c 65 45 78 20 28 28 42 4f  nByHandleEx ((BO
6ac0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
6ad0: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 46 49  LE, \.        FI
6ae0: 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c  LE_INFO_BY_HANDL
6af0: 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44 2c 44  E_CLASS,LPVOID,D
6b00: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  WORD))aSyscall[6
6b10: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
6b20: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
6b30: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
6b40: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20  LITE_OMIT_WAL). 
6b50: 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c   { "MapViewOfFil
6b60: 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53  eFromApp",    (S
6b70: 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66  YSCALL)MapViewOf
6b80: 46 69 6c 65 46 72 6f 6d 41 70 70 2c 20 20 20 20  FileFromApp,    
6b90: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6ba0: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f  MapViewOfFileFro
6bb0: 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53 43 41  mApp",    (SYSCA
6bc0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6be0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6bf0: 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
6c00: 46 72 6f 6d 41 70 70 20 28 28 4c 50 56 4f 49 44  FromApp ((LPVOID
6c10: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6c20: 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20  ,ULONG,ULONG64, 
6c30: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
6c40: 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70  ))aSyscall[65].p
6c50: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
6c60: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6c70: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c  { "CreateFile2",
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6c90: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
6ca0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  2,             0
6cb0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
6cc0: 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20  reateFile2",    
6cd0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6ce0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6cf0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6d00: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6d10: 6f 73 43 72 65 61 74 65 46 69 6c 65 32 20 28 28  osCreateFile2 ((
6d20: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
6d30: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57  LPCWSTR,DWORD,DW
6d40: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
6d50: 20 20 20 20 20 4c 50 43 52 45 41 54 45 46 49 4c       LPCREATEFIL
6d60: 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41  E2_EXTENDED_PARA
6d70: 4d 45 54 45 52 53 29 29 61 53 79 73 63 61 6c 6c  METERS))aSyscall
6d80: 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [66].pCurrent)..
6d90: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
6da0: 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
6db0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
6dc0: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
6dd0: 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62  "LoadPackagedLib
6de0: 72 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43  rary",     (SYSC
6df0: 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65 64  ALL)LoadPackaged
6e00: 4c 69 62 72 61 72 79 2c 20 20 20 20 20 30 20 7d  Library,     0 }
6e10: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61  ,.#else.  { "Loa
6e20: 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
6e30: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
6e40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6e50: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6e60: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6e70: 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
6e80: 61 72 79 20 28 28 48 4d 4f 44 55 4c 45 28 57 49  ary ((HMODULE(WI
6e90: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 20  NAPI*)(LPCWSTR, 
6ea0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
6eb0: 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43  )aSyscall[67].pC
6ec0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
6ed0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
6ee0: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34   "GetTickCount64
6ef0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
6f00: 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e  CALL)GetTickCoun
6f10: 74 36 34 2c 20 20 20 20 20 20 20 20 20 20 30 20  t64,          0 
6f20: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
6f30: 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20  tTickCount64",  
6f40: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6f50: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6f60: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6f70: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6f80: 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 20  sGetTickCount64 
6f90: 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41  ((ULONGLONG(WINA
6fa0: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
6fb0: 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65 6e 74  all[68].pCurrent
6fc0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
6fd0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e  _WINRT.  { "GetN
6fe0: 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22  ativeSystemInfo"
6ff0: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47  ,     (SYSCALL)G
7000: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
7010: 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  fo,     0 },.#el
7020: 73 65 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76  se.  { "GetNativ
7030: 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20  eSystemInfo",   
7040: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7060: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7070: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4e 61  .#define osGetNa
7080: 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 20 28  tiveSystemInfo (
7090: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20  (VOID(WINAPI*)( 
70a0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54  \.        LPSYST
70b0: 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c  EM_INFO))aSyscal
70c0: 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[69].pCurrent).
70d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
70e0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
70f0: 53 49 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  SI).  { "OutputD
7100: 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20  ebugStringA",   
7110: 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70     (SYSCALL)Outp
7120: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 2c 20  utDebugStringA, 
7130: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7140: 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67    { "OutputDebug
7150: 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28  StringA",      (
7160: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7180: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7190: 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65  efine osOutputDe
71a0: 62 75 67 53 74 72 69 6e 67 41 20 28 28 56 4f 49  bugStringA ((VOI
71b0: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  D(WINAPI*)(LPCST
71c0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e  R))aSyscall[70].
71d0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
71e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
71f0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
7200: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
7210: 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  ringW",      (SY
7220: 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75  SCALL)OutputDebu
7230: 67 53 74 72 69 6e 67 57 2c 20 20 20 20 20 20 30  gStringW,      0
7240: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f   },.#else.  { "O
7250: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
7260: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
7270: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7280: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7290: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
72a0: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
72b0: 69 6e 67 57 20 28 28 56 4f 49 44 28 57 49 4e 41  ingW ((VOID(WINA
72c0: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
72d0: 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72  yscall[71].pCurr
72e0: 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 50 72  ent)..  { "GetPr
72f0: 6f 63 65 73 73 48 65 61 70 22 2c 20 20 20 20 20  ocessHeap",     
7300: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
7310: 74 50 72 6f 63 65 73 73 48 65 61 70 2c 20 20 20  tProcessHeap,   
7320: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
7330: 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 65 73  fine osGetProces
7340: 73 48 65 61 70 20 28 28 48 41 4e 44 4c 45 28 57  sHeap ((HANDLE(W
7350: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
7360: 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75 72 72  yscall[72].pCurr
7370: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
7380: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
7390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
73a0: 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43 72 65 61  T_WAL).  { "Crea
73b0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
73c0: 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29  mApp", (SYSCALL)
73d0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
73e0: 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c 0a 23  gFromApp, 0 },.#
73f0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
7400: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
7410: 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  pp", (SYSCALL)0,
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7440: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
7450: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
7460: 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c 45 28 57  omApp ((HANDLE(W
7470: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20  INAPI*)(HANDLE, 
7480: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55  \.        LPSECU
7490: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
74a0: 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 4c 50  ULONG,ULONG64,LP
74b0: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
74c0: 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d  73].pCurrent)..}
74d0: 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ; /* End of the 
74e0: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
74f0: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a  tem calls */../*
7500: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
7510: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
7520: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
7530: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
7540: 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22  f the.** "win32"
7550: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
7560: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
7570: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
7580: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
7590: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
75a0: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
75b0: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
75c0: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
75d0: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
75e0: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
75f0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74  tatic int winSet
7600: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
7610: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
7620: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
7630: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
7640: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
7650: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
7660: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
7670: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
7680: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
7690: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
76a0: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
76b0: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
76c0: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
76d0: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
76e0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
76f0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
7700: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
7710: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
7720: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
7730: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
7740: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
7750: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
7760: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
7770: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
7780: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
7790: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
77a0: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
77b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
77c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
77d0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
77e0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
77f0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
7800: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
7810: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
7820: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
7830: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
7840: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
7850: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
7860: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
7870: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
7880: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
7890: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
78a0: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
78b0: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
78c0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
78d0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
78e0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
78f0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
7900: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
7910: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
7920: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
7930: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
7940: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
7950: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
7960: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
7970: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
7980: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
7990: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
79a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
79b0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
79c0: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
79d0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
79e0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
79f0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
7a00: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
7a10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
7a20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7a30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7a40: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
7a50: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
7a60: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
7a70: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
7a80: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
7a90: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
7aa0: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
7ab0: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
7ac0: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
7ad0: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
7ae0: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
7af0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
7b00: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69  3_syscall_ptr wi
7b10: 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  nGetSystemCall(.
7b20: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
7b30: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
7b40: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
7b50: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
7b60: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
7b70: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
7b80: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
7b90: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
7ba0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
7bb0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
7bc0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
7bd0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
7be0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
7bf0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
7c00: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
7c10: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
7c20: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
7c30: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
7c40: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
7c50: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
7c60: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
7c70: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
7c80: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
7c90: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
7ca0: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
7cb0: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
7cc0: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
7cd0: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
7ce0: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
7cf0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
7d00: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
7d10: 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65  ar *winNextSyste
7d20: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
7d30: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
7d40: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
7d50: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
7d60: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
7d70: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
7d80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
7d90: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
7da0: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
7db0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
7dc0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
7dd0: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
7de0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
7df0: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
7e00: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
7e10: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
7e20: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
7e30: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
7e40: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
7e50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
7e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
7e70: 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20 74  nction outputs t
7e80: 68 65 20 73 70 65 63 69 66 69 65 64 20 28 41 4e  he specified (AN
7e90: 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74 68  SI) string to th
7ea0: 65 20 57 69 6e 33 32 20 64 65 62 75 67 67 65 72  e Win32 debugger
7eb0: 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62 6c  .** (if availabl
7ec0: 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c  e)..*/..void sql
7ed0: 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65  ite3_win32_write
7ee0: 5f 64 65 62 75 67 28 63 6f 6e 73 74 20 63 68 61  _debug(const cha
7ef0: 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42 75  r *zBuf, int nBu
7f00: 66 29 7b 0a 20 20 63 68 61 72 20 7a 44 62 67 42  f){.  char zDbgB
7f10: 75 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  uf[SQLITE_WIN32_
7f20: 44 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a 20  DBG_BUF_SIZE];. 
7f30: 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28   int nMin = MIN(
7f40: 6e 42 75 66 2c 20 28 53 51 4c 49 54 45 5f 57 49  nBuf, (SQLITE_WI
7f50: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
7f60: 20 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79 20 62   - 1)); /* may b
7f70: 65 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f 0a 20  e negative. */. 
7f80: 20 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e   if( nMin<-1 ) n
7f90: 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c  Min = -1; /* all
7fa0: 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73   negative values
7fb0: 20 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20   become -1. */. 
7fc0: 20 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d   assert( nMin==-
7fd0: 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20  1 || nMin==0 || 
7fe0: 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49 4e 33  nMin<SQLITE_WIN3
7ff0: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 29  2_DBG_BUF_SIZE )
8000: 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
8010: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
8020: 4e 53 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e  NSI).  if( nMin>
8030: 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
8040: 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49  zDbgBuf, 0, SQLI
8050: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
8060: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63  _SIZE);.    memc
8070: 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66  py(zDbgBuf, zBuf
8080: 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f  , nMin);.    osO
8090: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
80a0: 41 28 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65  A(zDbgBuf);.  }e
80b0: 6c 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75  lse{.    osOutpu
80c0: 74 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42  tDebugStringA(zB
80d0: 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64  uf);.  }.#elif d
80e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
80f0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
8100: 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20  memset(zDbgBuf, 
8110: 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  0, SQLITE_WIN32_
8120: 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20  DBG_BUF_SIZE);. 
8130: 20 69 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74   if ( osMultiByt
8140: 65 54 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20  eToWideChar(.   
8150: 20 20 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65         osAreFile
8160: 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f  ApisANSI() ? CP_
8170: 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20  ACP : CP_OEMCP, 
8180: 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20  0, zBuf,.       
8190: 20 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52     nMin, (LPWSTR
81a0: 29 7a 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45  )zDbgBuf, SQLITE
81b0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
81c0: 49 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52  IZE/sizeof(WCHAR
81d0: 29 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))<=0 ){.    ret
81e0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74  urn;.  }.  osOut
81f0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 28  putDebugStringW(
8200: 28 4c 50 43 57 53 54 52 29 7a 44 62 67 42 75 66  (LPCWSTR)zDbgBuf
8210: 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e  );.#else.  if( n
8220: 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d  Min>0 ){.    mem
8230: 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20  set(zDbgBuf, 0, 
8240: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
8250: 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _BUF_SIZE);.    
8260: 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20  memcpy(zDbgBuf, 
8270: 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  zBuf, nMin);.   
8280: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
8290: 20 22 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b   "%s", zDbgBuf);
82a0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70  .  }else{.    fp
82b0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
82c0: 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23  s", zBuf);.  }.#
82d0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
82e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
82f0: 74 69 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68  tine suspends th
8300: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
8310: 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73   for at least ms
8320: 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  .** milliseconds
8330: 2e 20 20 54 68 69 73 20 69 73 20 65 71 75 69 76  .  This is equiv
8340: 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e  alent to the Win
8350: 33 32 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72  32 Sleep() inter
8360: 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  face..*/.#if SQL
8370: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61  ITE_OS_WINRT.sta
8380: 74 69 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70  tic HANDLE sleep
8390: 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64  Obj = NULL;.#end
83a0: 69 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  if..void sqlite3
83b0: 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f  _win32_sleep(DWO
83c0: 52 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29  RD milliseconds)
83d0: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
83e0: 57 49 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65  WINRT.  if ( sle
83f0: 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  epObj==NULL ){. 
8400: 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73     sleepObj = os
8410: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e  CreateEventExW(N
8420: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54  ULL, NULL, CREAT
8430: 45 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52  E_EVENT_MANUAL_R
8440: 45 53 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20  ESET,.          
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8460: 20 20 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a        SYNCHRONIZ
8470: 45 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  E);.  }.  assert
8480: 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c  ( sleepObj!=NULL
8490: 20 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53   );.  osWaitForS
84a0: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c  ingleObjectEx(sl
84b0: 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63  eepObj, millisec
84c0: 6f 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65  onds, FALSE);.#e
84d0: 6c 73 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69  lse.  osSleep(mi
84e0: 6c 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e  lliseconds);.#en
84f0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
8500: 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65  urn true (non-ze
8510: 72 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75  ro) if we are ru
8520: 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e  nning under WinN
8530: 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c  T, Win2K, WinXP,
8540: 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52  .** or WinCE.  R
8550: 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72  eturn false (zer
8560: 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69  o) for Win95, Wi
8570: 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a  n98, or WinME..*
8580: 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20  *.** Here is an 
8590: 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65  interesting obse
85a0: 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c  rvation:  Win95,
85b0: 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d   Win98, and WinM
85c0: 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f  E lack.** the Lo
85d0: 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20  ckFileEx() API. 
85e0: 20 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c   But we can stil
85f0: 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e  l statically lin
8600: 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a  k against that.*
8610: 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73  * API as long as
8620: 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69   we don't call i
8630: 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57  t when running W
8640: 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63  in95/98/ME.  A c
8650: 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72  all to.** this r
8660: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
8670: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
8680: 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35  he host is Win95
8690: 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e  /98/ME or.** Win
86a0: 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74  NT/2K/XP so that
86b0: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
86c0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20  ether or not we 
86d0: 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a  can safely call.
86e0: 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  ** the LockFileE
86f0: 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20  x() API..*/.#if 
8700: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
8710: 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
8720: 52 54 0a 23 20 64 65 66 69 6e 65 20 69 73 4e 54  RT.# define isNT
8730: 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 21 64  ()  (1).#elif !d
8740: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
8750: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20  N32_HAS_WIDE).# 
8760: 64 65 66 69 6e 65 20 69 73 4e 54 28 29 20 20 28  define isNT()  (
8770: 30 29 0a 23 65 6c 73 65 0a 20 20 73 74 61 74 69  0).#else.  stati
8780: 63 20 69 6e 74 20 69 73 4e 54 28 76 6f 69 64 29  c int isNT(void)
8790: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
87a0: 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29 7b 0a  3_os_type==0 ){.
87b0: 20 20 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49        OSVERSIONI
87c0: 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20  NFOA sInfo;.    
87d0: 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73    sInfo.dwOSVers
87e0: 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69  ionInfoSize = si
87f0: 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20  zeof(sInfo);.   
8800: 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45     osGetVersionE
8810: 78 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20  xA(&sInfo);.    
8820: 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70    sqlite3_os_typ
8830: 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74  e = sInfo.dwPlat
8840: 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54  formId==VER_PLAT
8850: 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20  FORM_WIN32_NT ? 
8860: 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  2 : 1;.    }.   
8870: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
8880: 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a  os_type==2;.  }.
8890: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
88a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
88b0: 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  OC./*.** Allocat
88c0: 65 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f  e nBytes of memo
88d0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
88e0: 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63  id *winMemMalloc
88f0: 28 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20  (int nBytes){.  
8900: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20  HANDLE hHeap;.  
8910: 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d  void *p;..  winM
8920: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
8930: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
8940: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
8950: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
8960: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
8970: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
8980: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
8990: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
89a0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
89b0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
89c0: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
89d0: 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  t ( osHeapValida
89e0: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
89f0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
8a00: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
8a10: 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79  if.  assert( nBy
8a20: 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20  tes>=0 );.  p = 
8a30: 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61  osHeapAlloc(hHea
8a40: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
8a50: 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a  HEAP_FLAGS, (SIZ
8a60: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 69  E_T)nBytes);.  i
8a70: 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c  f( !p ){.    sql
8a80: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
8a90: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
8aa0: 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20 62  o HeapAlloc %u b
8ab0: 79 74 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d  ytes (%d), heap=
8ac0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
8ad0: 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47       nBytes, osG
8ae0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
8af0: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
8b00: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
8b10: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f  ./*.** Free memo
8b20: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
8b30: 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f  id winMemFree(vo
8b40: 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48  id *pPrior){.  H
8b50: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20  ANDLE hHeap;..  
8b60: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
8b70: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
8b80: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
8b90: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
8ba0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8bb0: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
8bc0: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
8bd0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
8be0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
8bf0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
8c00: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
8c10: 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61  ssert ( osHeapVa
8c20: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
8c30: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
8c40: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
8c50: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  ;.#endif.  if( !
8c60: 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e 3b  pPrior ) return;
8c70: 20 2f 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c   /* Passing NULL
8c80: 20 74 6f 20 48 65 61 70 46 72 65 65 20 69 73 20   to HeapFree is 
8c90: 75 6e 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20  undefined. */.  
8ca0: 69 66 28 20 21 6f 73 48 65 61 70 46 72 65 65 28  if( !osHeapFree(
8cb0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
8cc0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
8cd0: 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20 73  pPrior) ){.    s
8ce0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
8cf0: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
8d00: 20 74 6f 20 48 65 61 70 46 72 65 65 20 62 6c 6f   to HeapFree blo
8d10: 63 6b 20 25 70 20 28 25 64 29 2c 20 68 65 61 70  ck %p (%d), heap
8d20: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
8d30: 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20 6f 73        pPrior, os
8d40: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
8d50: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
8d60: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
8d70: 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  ge the size of a
8d80: 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72  n existing memor
8d90: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  y allocation.*/.
8da0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
8db0: 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20  MemRealloc(void 
8dc0: 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79  *pPrior, int nBy
8dd0: 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  tes){.  HANDLE h
8de0: 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b  Heap;.  void *p;
8df0: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
8e00: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
8e10: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
8e20: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
8e30: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
8e40: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
8e50: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
8e60: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
8e70: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
8e80: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
8e90: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
8ea0: 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48 65  .  assert ( osHe
8eb0: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
8ec0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
8ed0: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
8ee0: 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  r) );.#endif.  a
8ef0: 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30  ssert( nBytes>=0
8f00: 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72 69 6f   );.  if( !pPrio
8f10: 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48  r ){.    p = osH
8f20: 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  eapAlloc(hHeap, 
8f30: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
8f40: 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54  P_FLAGS, (SIZE_T
8f50: 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73  )nBytes);.  }els
8f60: 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61  e{.    p = osHea
8f70: 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  pReAlloc(hHeap, 
8f80: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
8f90: 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c  P_FLAGS, pPrior,
8fa0: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
8fb0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 20 29  ;.  }.  if( !p )
8fc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
8fd0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
8fe0: 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20 25 75  "failed to %s %u
8ff0: 20 62 79 74 65 73 20 28 25 64 29 2c 20 68 65 61   bytes (%d), hea
9000: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
9010: 20 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f 20         pPrior ? 
9020: 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20  "HeapReAlloc" : 
9030: 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79  "HeapAlloc", nBy
9040: 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  tes, osGetLastEr
9050: 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
9060: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48         (void*)hH
9070: 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  eap);.  }.  retu
9080: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
9090: 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
90a0: 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  f an outstanding
90b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20   allocation, in 
90c0: 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
90d0: 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28   int winMemSize(
90e0: 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44  void *p){.  HAND
90f0: 4c 45 20 68 48 65 61 70 3b 0a 20 20 53 49 5a 45  LE hHeap;.  SIZE
9100: 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  _T n;..  winMemA
9110: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
9120: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
9130: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
9140: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
9150: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
9160: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
9170: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
9180: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
9190: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
91a0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
91b0: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 20 28  DATE).  assert (
91c0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
91d0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
91e0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
91f0: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
9200: 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72    if( !p ) retur
9210: 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 61  n 0;.  n = osHea
9220: 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53 51 4c  pSize(hHeap, SQL
9230: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
9240: 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66 28 20  LAGS, p);.  if( 
9250: 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29 7b  n==(SIZE_T)-1 ){
9260: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
9270: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
9280: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 53 69  failed to HeapSi
9290: 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64 29  ze block %p (%d)
92a0: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 6f              p, o
92c0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
92d0: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
92e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
92f0: 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
9300: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e  n;.}../*.** Roun
9310: 64 20 75 70 20 61 20 72 65 71 75 65 73 74 20 73  d up a request s
9320: 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ize to the next 
9330: 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e  valid allocation
9340: 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
9350: 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64   int winMemRound
9360: 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74  up(int n){.  ret
9370: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
9380: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20  Initialize this 
9390: 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  module..*/.stati
93a0: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74  c int winMemInit
93b0: 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
93c0: 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a  {.  winMemData *
93d0: 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77  pWinMemData = (w
93e0: 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70  inMemData *)pApp
93f0: 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57  Data;..  if( !pW
9400: 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75  inMemData ) retu
9410: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
9420: 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d  .  assert( pWinM
9430: 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d 3d 57  emData->magic==W
9440: 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b 0a 0a  INMEM_MAGIC );..
9450: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
9460: 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57  INRT && SQLITE_W
9470: 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45  IN32_HEAP_CREATE
9480: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
9490: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
94a0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
94b0: 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65  Heap = osHeapCre
94c0: 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ate(SQLITE_WIN32
94d0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20  _HEAP_FLAGS,.   
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9500: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
9510: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a  HEAP_INIT_SIZE,.
9520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9540: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e        SQLITE_WIN
9550: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
9560: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69 6e  );.    if( !pWin
9570: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
9580: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
9590: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
95a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 66 61 69  ,.          "fai
95b0: 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65 61 74  led to HeapCreat
95c0: 65 20 28 25 64 29 2c 20 66 6c 61 67 73 3d 25 75  e (%d), flags=%u
95d0: 2c 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20 6d  , initSize=%u, m
95e0: 61 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20 20  axSize=%u",.    
95f0: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
9600: 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57  rror(), SQLITE_W
9610: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
9620: 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
9630: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
9640: 54 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f 57  T_SIZE, SQLITE_W
9650: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
9660: 5a 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ZE);.      retur
9670: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
9680: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
9690: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20  mData->bOwned = 
96a0: 54 52 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74  TRUE;.    assert
96b0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62  ( pWinMemData->b
96c0: 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c  Owned );.  }.#el
96d0: 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61  se.  pWinMemData
96e0: 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50  ->hHeap = osGetP
96f0: 72 6f 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20  rocessHeap();.  
9700: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
9710: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73  ->hHeap ){.    s
9720: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
9730: 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20  E_NOMEM,.       
9740: 20 22 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50   "failed to GetP
9750: 72 6f 63 65 73 73 48 65 61 70 20 28 25 64 29 22  rocessHeap (%d)"
9760: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
9770: 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ());.    return 
9780: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9790: 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  }.  pWinMemData-
97a0: 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b  >bOwned = FALSE;
97b0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e  .  assert( !pWin
97c0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
97d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
97e0: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
97f0: 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61  >hHeap!=0 );.  a
9800: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
9810: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
9820: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
9830: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
9840: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
9850: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
9860: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
9870: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
9880: 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65  pValidate(pWinMe
9890: 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51  mData->hHeap, SQ
98a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
98b0: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
98c0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
98d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
98e0: 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65  .** Deinitialize
98f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f   this module..*/
9900: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
9910: 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64  MemShutdown(void
9920: 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77   *pAppData){.  w
9930: 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d  inMemData *pWinM
9940: 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d  emData = (winMem
9950: 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b  Data *)pAppData;
9960: 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  ..  if( !pWinMem
9970: 44 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20  Data ) return;. 
9980: 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61   if( pWinMemData
9990: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61  ->hHeap ){.    a
99a0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
99b0: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
99c0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
99d0: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
99e0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
99f0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
9a00: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
9a10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 48  .    assert( osH
9a20: 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e  eapValidate(pWin
9a30: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20  MemData->hHeap, 
9a40: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9a50: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
9a60: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
9a70: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
9a80: 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66  wned ){.      if
9a90: 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79  ( !osHeapDestroy
9aa0: 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  (pWinMemData->hH
9ab0: 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eap) ){.        
9ac0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
9ad0: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
9ae0: 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79  d to HeapDestroy
9af0: 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c   (%d), heap=%p",
9b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9b10: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
9b20: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70 57  ror(), (void*)pW
9b30: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
9b40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9b50: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
9b60: 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  wned = FALSE;.  
9b70: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
9b80: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c  ata->hHeap = NUL
9b90: 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  L;.  }.}../*.** 
9ba0: 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77  Populate the low
9bb0: 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c  -level memory al
9bc0: 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  location functio
9bd0: 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a  n pointers in.**
9be0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
9bf0: 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e  nfig.m with poin
9c00: 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74  ters to the rout
9c10: 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ines in this fil
9c20: 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65  e. The.** argume
9c30: 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65 20  nts specify the 
9c40: 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20  block of memory 
9c50: 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a  to manage..**.**
9c60: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
9c70: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
9c80: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29  sqlite3_config()
9c90: 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 0a  , and therefore.
9ca0: 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ** is not requir
9cb0: 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73  ed to be threads
9cc0: 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29 2e  afe (it is not).
9cd0: 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
9ce0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73  3_mem_methods *s
9cf0: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
9d00: 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  2(void){.  stati
9d10: 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
9d20: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d  mem_methods winM
9d30: 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20  emMethods = {.  
9d40: 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a    winMemMalloc,.
9d50: 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a      winMemFree,.
9d60: 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f      winMemReallo
9d70: 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a  c,.    winMemSiz
9d80: 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75  e,.    winMemRou
9d90: 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  ndup,.    winMem
9da0: 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  Init,.    winMem
9db0: 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77  Shutdown,.    &w
9dc0: 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b  in_mem_data.  };
9dd0: 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d 65  .  return &winMe
9de0: 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69  mMethods;.}..voi
9df0: 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44  d sqlite3MemSetD
9e00: 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20  efault(void){.  
9e10: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
9e20: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c  QLITE_CONFIG_MAL
9e30: 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47  LOC, sqlite3MemG
9e40: 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65  etWin32());.}.#e
9e50: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
9e60: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a  IN32_MALLOC */..
9e70: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
9e80: 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20  UTF-8 string to 
9e90: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
9ea0: 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a  e (UTF-16?). .**
9eb0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
9ec0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
9ed0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
9ee0: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a  d from malloc..*
9ef0: 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20  /.static LPWSTR 
9f00: 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f  utf8ToUnicode(co
9f10: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
9f20: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61  ame){.  int nCha
9f30: 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69 64  r;.  LPWSTR zWid
9f40: 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43  eFilename;..  nC
9f50: 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  har = osMultiByt
9f60: 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
9f70: 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  TF8, 0, zFilenam
9f80: 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b  e, -1, NULL, 0);
9f90: 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20  .  if( nChar==0 
9fa0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
9fb0: 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c 65  .  }.  zWideFile
9fc0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
9fd0: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61 72 2a  llocZero( nChar*
9fe0: 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65  sizeof(zWideFile
9ff0: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
a000: 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d  ( zWideFilename=
a010: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
a020: 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20   0;.  }.  nChar 
a030: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
a040: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
a050: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
a060: 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  1, zWideFilename
a070: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a090: 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20    nChar);.  if( 
a0a0: 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20  nChar==0 ){.    
a0b0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
a0c0: 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  deFilename);.   
a0d0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d   zWideFilename =
a0e0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
a0f0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a   zWideFilename;.
a100: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
a110: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
a120: 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70  de to UTF-8.  Sp
a130: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
a140: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
a150: 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  is.** obtained f
a160: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
a170: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
a180: 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 55  char *unicodeToU
a190: 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64  tf8(LPCWSTR zWid
a1a0: 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  eFilename){.  in
a1b0: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
a1c0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  *zFilename;..  n
a1d0: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
a1e0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f  rToMultiByte(CP_
a1f0: 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69  UTF8, 0, zWideFi
a200: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30  lename, -1, 0, 0
a210: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
a220: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
a230: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a240: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
a250: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
a260: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
a270: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
a280: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
a290: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
a2a0: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
a2b0: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69  (CP_UTF8, 0, zWi
a2c0: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
a2d0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65  zFilename, nByte
a2e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a300: 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e    0, 0);.  if( n
a310: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
a320: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
a330: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 46  ilename);.    zF
a340: 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  ilename = 0;.  }
a350: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
a360: 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ame;.}../*.** Co
a370: 6e 76 65 72 74 20 61 6e 20 41 4e 53 49 20 73 74  nvert an ANSI st
a380: 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66  ring to Microsof
a390: 74 20 55 6e 69 63 6f 64 65 2c 20 62 61 73 65 64  t Unicode, based
a3a0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   on the.** curre
a3b0: 6e 74 20 63 6f 64 65 70 61 67 65 20 73 65 74 74  nt codepage sett
a3c0: 69 6e 67 73 20 66 6f 72 20 66 69 6c 65 20 61 70  ings for file ap
a3d0: 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61 63 65  is..** .** Space
a3e0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
a3f0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
a400: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d  obtained.** from
a410: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e   sqlite3_malloc.
a420: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54  .*/.static LPWST
a430: 52 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28  R mbcsToUnicode(
a440: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
a450: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
a460: 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4d  yte;.  LPWSTR zM
a470: 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69  bcsFilename;.  i
a480: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73  nt codepage = os
a490: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
a4a0: 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f  ) ? CP_ACP : CP_
a4b0: 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20  OEMCP;..  nByte 
a4c0: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
a4d0: 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65  ideChar(codepage
a4e0: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
a4f0: 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  -1, NULL,.      
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 20 20 20 20 20 20 20 20 20 30 29 2a 73 69 7a            0)*siz
a520: 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 69 66  eof(WCHAR);.  if
a530: 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
a540: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
a550: 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20    zMbcsFilename 
a560: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
a570: 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  ero( nByte*sizeo
a580: 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 5b  f(zMbcsFilename[
a590: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62  0]) );.  if( zMb
a5a0: 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b  csFilename==0 ){
a5b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a5c0: 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d   }.  nByte = osM
a5d0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
a5e0: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  ar(codepage, 0, 
a5f0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  zFilename, -1, z
a600: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  MbcsFilename,.  
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42                nB
a630: 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  yte);.  if( nByt
a640: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e==0 ){.    sqli
a650: 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73 46 69  te3_free(zMbcsFi
a660: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d 62  lename);.    zMb
a670: 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a  csFilename = 0;.
a680: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62    }.  return zMb
a690: 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  csFilename;.}../
a6a0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63  *.** Convert Mic
a6b0: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74  rosoft Unicode t
a6c0: 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 61  o multi-byte cha
a6d0: 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c 20 62  racter string, b
a6e0: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 75  ased on the.** u
a6f0: 73 65 72 27 73 20 41 4e 53 49 20 63 6f 64 65 70  ser's ANSI codep
a700: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  age..**.** Space
a710: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
a720: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
a730: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
a740: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
a750: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  )..*/.static cha
a760: 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73  r *unicodeToMbcs
a770: 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46 69  (LPCWSTR zWideFi
a780: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
a790: 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46  Byte;.  char *zF
a7a0: 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63  ilename;.  int c
a7b0: 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46  odepage = osAreF
a7c0: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20  ileApisANSI() ? 
a7d0: 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43  CP_ACP : CP_OEMC
a7e0: 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  P;..  nByte = os
a7f0: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
a800: 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  yte(codepage, 0,
a810: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
a820: 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  -1, 0, 0, 0, 0);
a830: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
a840: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a850: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
a860: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
a870: 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b  ocZero( nByte );
a880: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
a890: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
a8a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
a8b0: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
a8c0: 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67  ultiByte(codepag
a8d0: 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e  e, 0, zWideFilen
a8e0: 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  ame, -1, zFilena
a8f0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a910: 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29      nByte, 0, 0)
a920: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
a930: 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   0 ){.    sqlite
a940: 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  3_free(zFilename
a950: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
a960: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
a970: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
a980: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 6d  ./*.** Convert m
a990: 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63 74  ultibyte charact
a9a0: 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46  er string to UTF
a9b0: 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  -8.  Space to ho
a9c0: 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e  ld the.** return
a9d0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
a9e0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
a9f0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
aa00: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
aa10: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
aa20: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
aa30: 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  lename){.  char 
aa40: 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a  *zFilenameUtf8;.
aa50: 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64    LPWSTR zTmpWid
aa60: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
aa70: 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a   mbcsToUnicode(z
aa80: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
aa90: 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a   zTmpWide==0 ){.
aaa0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
aab0: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66  }.  zFilenameUtf
aac0: 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  8 = unicodeToUtf
aad0: 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73  8(zTmpWide);.  s
aae0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
aaf0: 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Wide);.  return 
ab00: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d  zFilenameUtf8;.}
ab10: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
ab20: 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79  UTF-8 to multiby
ab30: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  te character str
ab40: 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68  ing.  Space to h
ab50: 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74 75  old the .** retu
ab60: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
ab70: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
ab80: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
ab90: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
aba0: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
abb0: 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  cs(const char *z
abc0: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61  Filename){.  cha
abd0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73  r *zFilenameMbcs
abe0: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57  ;.  LPWSTR zTmpW
abf0: 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65  ide;..  zTmpWide
ac00: 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65   = utf8ToUnicode
ac10: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
ac20: 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29  f( zTmpWide==0 )
ac30: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
ac40: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d    }.  zFilenameM
ac50: 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54 6f 4d  bcs = unicodeToM
ac60: 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  bcs(zTmpWide);. 
ac70: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
ac80: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
ac90: 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b  n zFilenameMbcs;
aca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
acb0: 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65  unction sets the
acc0: 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
acd0: 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
ace0: 20 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64   directory based
acf0: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69   on.** the provi
ad00: 64 65 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ded arguments.  
ad10: 54 68 65 20 74 79 70 65 20 61 72 67 75 6d 65 6e  The type argumen
ad20: 74 20 6d 75 73 74 20 62 65 20 31 20 69 6e 20 6f  t must be 1 in o
ad30: 72 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 0a  rder to set the.
ad40: 2a 2a 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  ** data director
ad50: 79 20 6f 72 20 32 20 69 6e 20 6f 72 64 65 72 20  y or 2 in order 
ad60: 74 6f 20 73 65 74 20 74 68 65 20 74 65 6d 70 6f  to set the tempo
ad70: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20  rary directory. 
ad80: 20 54 68 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61   The zValue.** a
ad90: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
ada0: 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
adb0: 74 6f 72 79 20 74 6f 20 75 73 65 2e 20 20 54 68  tory to use.  Th
adc0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77  e return value w
add0: 69 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45  ill be.** SQLITE
ade0: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
adf0: 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
ae00: 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
ae10: 63 74 6f 72 79 28 44 57 4f 52 44 20 74 79 70 65  ctory(DWORD type
ae20: 2c 20 4c 50 43 57 53 54 52 20 7a 56 61 6c 75 65  , LPCWSTR zValue
ae30: 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70 44 69  ){.  char **ppDi
ae40: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66  rectory = 0;.#if
ae50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ae60: 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20  _AUTOINIT.  int 
ae70: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
ae80: 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
ae90: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
aea0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 74 79  .#endif.  if( ty
aeb0: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
aec0: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
aed0: 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69  TYPE ){.    ppDi
aee0: 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74  rectory = &sqlit
aef0: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
af00: 79 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74  y;.  }else if( t
af10: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
af20: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
af30: 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44  _TYPE ){.    ppD
af40: 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69  irectory = &sqli
af50: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
af60: 72 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ry;.  }.  assert
af70: 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c  ( !ppDirectory |
af80: 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  | type==SQLITE_W
af90: 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54  IN32_DATA_DIRECT
afa0: 4f 52 59 5f 54 59 50 45 0a 20 20 20 20 20 20 20  ORY_TYPE.       
afb0: 20 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49     || type==SQLI
afc0: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
afd0: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 29  RECTORY_TYPE.  )
afe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44  ;.  assert( !ppD
aff0: 69 72 65 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69  irectory || sqli
b000: 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79  te3MemdebugHasTy
b010: 70 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 2c  pe(*ppDirectory,
b020: 20 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29   MEMTYPE_HEAP) )
b030: 3b 0a 20 20 69 66 28 20 70 70 44 69 72 65 63 74  ;.  if( ppDirect
b040: 6f 72 79 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ory ){.    char 
b050: 2a 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 30 3b  *zValueUtf8 = 0;
b060: 0a 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 20  .    if( zValue 
b070: 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a  && zValue[0] ){.
b080: 20 20 20 20 20 20 7a 56 61 6c 75 65 55 74 66 38        zValueUtf8
b090: 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
b0a0: 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  (zValue);.      
b0b0: 69 66 20 28 20 7a 56 61 6c 75 65 55 74 66 38 3d  if ( zValueUtf8=
b0c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
b0d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b0e0: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
b0f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
b100: 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b  e(*ppDirectory);
b110: 0a 20 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72  .    *ppDirector
b120: 79 20 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a  y = zValueUtf8;.
b130: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b140: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
b150: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
b160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65  .}../*.** The re
b170: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 67 65  turn value of ge
b180: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a  tLastErrorMsg.**
b190: 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
b1a0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
b1b0: 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
b1c0: 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
b1d0: 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
b1e0: 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
b1f0: 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74  runcated)..*/.st
b200: 61 74 69 63 20 69 6e 74 20 67 65 74 4c 61 73 74  atic int getLast
b210: 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c  ErrorMsg(DWORD l
b220: 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42  astErrno, int nB
b230: 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
b240: 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73  .  /* FormatMess
b250: 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e  age returns 0 on
b260: 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72   failure.  Other
b270: 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74  wise it.  ** ret
b280: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
b290: 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74 65  of TCHARs writte
b2a0: 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a  n to the output.
b2b0: 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63    ** buffer, exc
b2c0: 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69  luding the termi
b2d0: 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72  nating null char
b2e0: 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64  ..  */.  DWORD d
b2f0: 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72  wLen = 0;.  char
b300: 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69   *zOut = 0;..  i
b310: 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23 69 66  f( isNT() ){.#if
b320: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
b330: 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65 6d 70  .    WCHAR zTemp
b340: 57 69 64 65 5b 4d 41 58 5f 50 41 54 48 2b 31 5d  Wide[MAX_PATH+1]
b350: 3b 20 2f 2a 20 4e 4f 54 45 3a 20 53 6f 6d 65 77  ; /* NOTE: Somew
b360: 68 61 74 20 61 72 62 69 74 72 61 72 79 2e 20 2a  hat arbitrary. *
b370: 2f 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  /.    dwLen = os
b380: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46  FormatMessageW(F
b390: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52  ORMAT_MESSAGE_FR
b3a0: 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20  OM_SYSTEM |.    
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
b3d0: 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49  MESSAGE_IGNORE_I
b3e0: 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20  NSERTS,.        
b3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b400: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
b410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b420: 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
b430: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b450: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b470: 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20  zTempWide,.     
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b490: 20 20 20 20 20 20 20 20 4d 41 58 5f 50 41 54 48          MAX_PATH
b4a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
b4c0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 57  );.#else.    LPW
b4d0: 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d 20  STR zTempWide = 
b4e0: 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20  NULL;.    dwLen 
b4f0: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  = osFormatMessag
b500: 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eW(FORMAT_MESSAG
b510: 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45  E_ALLOCATE_BUFFE
b520: 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  R |.            
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b540: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
b550: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
b560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b570: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
b580: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
b590: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5d0: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72            lastEr
b5e0: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b600: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
b610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b620: 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d    (LPWSTR) &zTem
b630: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
b660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b670: 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20      0);.#endif. 
b680: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
b690: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
b6a0: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
b6b0: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
b6c0: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
b6d0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
b6e0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
b6f0: 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  ut = unicodeToUt
b700: 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20  f8(zTempWide);. 
b710: 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
b720: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23  enignMalloc();.#
b730: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
b740: 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72 65  NRT.      /* fre
b750: 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66  e the system buf
b760: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
b770: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a   FormatMessage *
b780: 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46  /.      osLocalF
b790: 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a  ree(zTempWide);.
b7a0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
b7b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
b7c0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
b7d0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
b7e0: 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  zTemp = NULL;.  
b7f0: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
b800: 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d 41  atMessageA(FORMA
b810: 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41  T_MESSAGE_ALLOCA
b820: 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20  TE_BUFFER |.    
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b840: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
b850: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
b860: 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEM |.          
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
b890: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
b8a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
b8c0: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8e0: 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20    lastErrno,.   
b8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b900: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
b910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b920: 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54 52            (LPSTR
b930: 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20  ) &zTemp,.      
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69         0);.    i
b980: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
b990: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
b9a0: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
b9b0: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
b9c0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
b9d0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
b9e0: 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ();.      zOut =
b9f0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
ba00: 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d  bcs_to_utf8(zTem
ba10: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
ba20: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
ba30: 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65  ();.      /* fre
ba40: 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66  e the system buf
ba50: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
ba60: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a   FormatMessage *
ba70: 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46  /.      osLocalF
ba80: 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  ree(zTemp);.    
ba90: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
baa0: 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b  f( 0 == dwLen ){
bab0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
bac0: 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
bad0: 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 78 20  , "OsError 0x%x 
bae0: 28 25 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f  (%u)", lastErrno
baf0: 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20  , lastErrno);.  
bb00: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f  }else{.    /* co
bb10: 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20  py a maximum of 
bb20: 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75  nBuf chars to ou
bb30: 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tput buffer */. 
bb40: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
bb50: 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
bb60: 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20  "%s", zOut);.   
bb70: 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54 46   /* free the UTF
bb80: 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20  8 buffer */.    
bb90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
bba0: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
bbb0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20   0;.}../*.**.** 
bbc0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20  This function - 
bbd0: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
bbe0: 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76  e() - is only ev
bbf0: 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68  er called via th
bc00: 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f  e macro.** winLo
bc10: 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20  gError()..**.** 
bc20: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
bc30: 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e  invoked after an
bc40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
bc50: 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e   an OS function.
bc60: 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65  .** It logs a me
bc70: 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69  ssage using sqli
bc80: 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69  te3_log() contai
bc90: 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ning the current
bca0: 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72   value of.** err
bcb0: 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20  or code and, if 
bcc0: 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75  possible, the hu
bcd0: 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75  man-readable equ
bce0: 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a 2a 2a  ivalent from .**
bcf0: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a   FormatMessage..
bd00: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
bd10: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
bd20: 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f  to the macro sho
bd30: 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72  uld be the error
bd40: 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69   code that.** wi
bd50: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
bd60: 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53  o SQLite (e.g. S
bd70: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
bd80: 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  TE, SQLITE_CANTO
bd90: 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77  PEN). .** The tw
bda0: 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67  o subsequent arg
bdb0: 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65  uments should be
bdc0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
bdd0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
bde0: 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64 20  t.** failed and 
bdf0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
be00: 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c  ile-system path,
be10: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
be20: 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  ine winLogError(
be30: 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c 6f  a,b,c,d)   winLo
be40: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62  gErrorAtLine(a,b
be50: 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,c,d,__LINE__).s
be60: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67  tatic int winLog
be70: 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69  ErrorAtLine(.  i
be80: 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20  nt errcode,     
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bea0: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
beb0: 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  ode */.  DWORD l
bec0: 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20 20 20  astErrno,       
bed0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 33           /* Win3
bee0: 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f 0a  2 last error */.
bef0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
bf00: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
bf10: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20    /* Name of OS 
bf20: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61  function that fa
bf30: 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iled */.  const 
bf40: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
bf50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
bf60: 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65  e path associate
bf70: 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a  d with error */.
bf80: 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20    int iLine     
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65    /* Source line
bfb0: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72   number where er
bfc0: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
bfd0: 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 35  ){.  char zMsg[5
bfe0: 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  00];            
bff0: 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65       /* Human re
c000: 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65 78  adable error tex
c010: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
c040: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73  ounter */..  zMs
c050: 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 67 65 74 4c  g[0] = 0;.  getL
c060: 61 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73 74  astErrorMsg(last
c070: 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d  Errno, sizeof(zM
c080: 73 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73  sg), zMsg);.  as
c090: 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53  sert( errcode!=S
c0a0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
c0b0: 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61  ( zPath==0 ) zPa
c0c0: 74 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69  th = "";.  for(i
c0d0: 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a  =0; zMsg[i] && z
c0e0: 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20  Msg[i]!='\r' && 
c0f0: 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69  zMsg[i]!='\n'; i
c100: 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20  ++){}.  zMsg[i] 
c110: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  = 0;.  sqlite3_l
c120: 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20  og(errcode,.    
c130: 20 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20    "os_win.c:%d: 
c140: 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25 73  (%d) %s(%s) - %s
c150: 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20  ",.      iLine, 
c160: 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63  lastErrno, zFunc
c170: 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20  , zPath, zMsg.  
c180: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72  );..  return err
c190: 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  code;.}../*.** T
c1a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
c1b0: 65 73 20 74 68 61 74 20 61 20 52 65 61 64 46 69  es that a ReadFi
c1c0: 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c 65 28  le(), WriteFile(
c1d0: 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46 69 6c  ), and DeleteFil
c1e0: 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  e().** will be r
c1f0: 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  etried following
c200: 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72   a locking error
c210: 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75 73   - probably caus
c220: 65 64 20 62 79 20 0a 2a 2a 20 61 6e 74 69 76 69  ed by .** antivi
c230: 72 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20 41  rus software.  A
c240: 6c 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c 20  lso the initial 
c250: 64 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68 65  delay before the
c260: 20 66 69 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a   first retry..**
c270: 20 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72 65   The delay incre
c280: 61 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77 69  ases linearly wi
c290: 74 68 20 65 61 63 68 20 72 65 74 72 79 2e 0a 2a  th each retry..*
c2a0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
c2b0: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
c2c0: 52 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  RY.# define SQLI
c2d0: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
c2e0: 45 54 52 59 20 31 30 0a 23 65 6e 64 69 66 0a 23  ETRY 10.#endif.#
c2f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
c300: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
c310: 44 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20 53  DELAY.# define S
c320: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
c330: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 20 32 35  R_RETRY_DELAY 25
c340: 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69  .#endif.static i
c350: 6e 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74  nt win32IoerrRet
c360: 72 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ry = SQLITE_WIN3
c370: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73  2_IOERR_RETRY;.s
c380: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 49  tatic int win32I
c390: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
c3a0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
c3b0: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 3b  ERR_RETRY_DELAY;
c3c0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61  ../*.** If a Rea
c3d0: 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74 65  dFile() or Write
c3e0: 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63 63  File() error occ
c3f0: 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73  urs, invoke this
c400: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73   routine.** to s
c410: 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20  ee if it should 
c420: 62 65 20 72 65 74 72 69 65 64 2e 20 20 52 65 74  be retried.  Ret
c430: 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74 72  urn TRUE to retr
c440: 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
c450: 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20 77  .** to give up w
c460: 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ith an error..*/
c470: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 74 72  .static int retr
c480: 79 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52 65  yIoerr(int *pnRe
c490: 74 72 79 2c 20 44 57 4f 52 44 20 2a 70 45 72 72  try, DWORD *pErr
c4a0: 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d  or){.  DWORD e =
c4b0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
c4c0: 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65 74 72  );.  if( *pnRetr
c4d0: 79 3e 3d 77 69 6e 33 32 49 6f 65 72 72 52 65 74  y>=win32IoerrRet
c4e0: 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  ry ){.    if( pE
c4f0: 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a 70  rror ){.      *p
c500: 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20 7d  Error = e;.    }
c510: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
c520: 20 7d 0a 20 20 69 66 28 20 65 3d 3d 45 52 52 4f   }.  if( e==ERRO
c530: 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 20  R_ACCESS_DENIED 
c540: 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52 52 4f  ||.      e==ERRO
c550: 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e  R_LOCK_VIOLATION
c560: 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52 52   ||.      e==ERR
c570: 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41  OR_SHARING_VIOLA
c580: 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69  TION ){.    sqli
c590: 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
c5a0: 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44  win32IoerrRetryD
c5b0: 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79  elay*(1+*pnRetry
c5c0: 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74  ));.    ++*pnRet
c5d0: 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ry;.    return 1
c5e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72 72  ;.  }.  if( pErr
c5f0: 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f  or ){.    *pErro
c600: 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74  r = e;.  }.  ret
c610: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
c620: 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20  Log a I/O error 
c630: 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a  retry episode..*
c640: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 6f  /.static void lo
c650: 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72  gIoerr(int nRetr
c660: 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72 79  y){.  if( nRetry
c670: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c680: 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  log(SQLITE_IOERR
c690: 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65  , .      "delaye
c6a0: 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f  d %dms for lock/
c6b0: 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74  sharing conflict
c6c0: 22 2c 0a 20 20 20 20 20 20 77 69 6e 33 32 49 6f  ",.      win32Io
c6d0: 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52  errRetryDelay*nR
c6e0: 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f  etry*(nRetry+1)/
c6f0: 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  2.    );.  }.}..
c700: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
c710: 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  NCE./***********
c720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
c760: 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63  * This section c
c770: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72  ontains code for
c780: 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a   WinCE only..*/.
c790: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
c7a0: 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49  ITE_MSVC_LOCALTI
c7b0: 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c 49  ME_API) || !SQLI
c7c0: 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d  TE_MSVC_LOCALTIM
c7d0: 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68 65 20  E_API./*.** The 
c7e0: 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69 6e 64  MSVC CRT on Wind
c7f0: 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74 20 68  ows CE may not h
c800: 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28  ave a localtime(
c810: 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 0a  ) function.  So.
c820: 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75 62 73  ** create a subs
c830: 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c  titute..*/.#incl
c840: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72  ude <time.h>.str
c850: 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20  uct tm *__cdecl 
c860: 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20  localtime(const 
c870: 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73  time_t *t).{.  s
c880: 74 61 74 69 63 20 73 74 72 75 63 74 20 74 6d 20  tatic struct tm 
c890: 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54  y;.  FILETIME uT
c8a0: 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d  m, lTm;.  SYSTEM
c8b0: 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69  TIME pTm;.  sqli
c8c0: 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20  te3_int64 t64;. 
c8d0: 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34   t64 = *t;.  t64
c8e0: 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34 34   = (t64 + 116444
c8f0: 37 33 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b  73600)*10000000;
c900: 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65  .  uTm.dwLowDate
c910: 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74  Time = (DWORD)(t
c920: 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46 29  64 & 0xFFFFFFFF)
c930: 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61  ;.  uTm.dwHighDa
c940: 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28  teTime= (DWORD)(
c950: 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73  t64 >> 32);.  os
c960: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
c970: 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54  ileTime(&uTm,&lT
c980: 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65  m);.  osFileTime
c990: 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c 54  ToSystemTime(&lT
c9a0: 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f  m,&pTm);.  y.tm_
c9b0: 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61 72  year = pTm.wYear
c9c0: 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f   - 1900;.  y.tm_
c9d0: 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68  mon = pTm.wMonth
c9e0: 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61   - 1;.  y.tm_wda
c9f0: 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65  y = pTm.wDayOfWe
ca00: 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20  ek;.  y.tm_mday 
ca10: 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e  = pTm.wDay;.  y.
ca20: 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48  tm_hour = pTm.wH
ca30: 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20  our;.  y.tm_min 
ca40: 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20  = pTm.wMinute;. 
ca50: 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e   y.tm_sec = pTm.
ca60: 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72  wSecond;.  retur
ca70: 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n &y;.}.#endif..
ca80: 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54  #define HANDLE_T
ca90: 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69  O_WINFILE(a) (wi
caa0: 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29  nFile*)&((char*)
cab0: 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f  a)[-(int)offseto
cac0: 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f  f(winFile,h)]../
cad0: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c  *.** Acquire a l
cae0: 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c  ock on the handl
caf0: 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e h.*/.static vo
cb00: 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  id winceMutexAcq
cb10: 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a  uire(HANDLE h){.
cb20: 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a     DWORD dwErr;.
cb30: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45     do {.     dwE
cb40: 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69  rr = osWaitForSi
cb50: 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e  ngleObject(h, IN
cb60: 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68  FINITE);.   } wh
cb70: 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57 41  ile (dwErr != WA
cb80: 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64  IT_OBJECT_0 && d
cb90: 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41  wErr != WAIT_ABA
cba0: 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a  NDONED);.}./*.**
cbb0: 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20   Release a lock 
cbc0: 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e 63  acquired by winc
cbd0: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29 0a  eMutexAcquire().
cbe0: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65  */.#define wince
cbf0: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29 20  MutexRelease(h) 
cc00: 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a  ReleaseMutex(h).
cc10: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
cc20: 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72  e mutex and shar
cc30: 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66  ed memory used f
cc40: 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68  or locking in th
cc50: 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  e file.** descri
cc60: 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74  ptor pFile.*/.st
cc70: 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65 43 72  atic int winceCr
cc80: 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63  eateLock(const c
cc90: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
cca0: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
ccb0: 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a  .  LPWSTR zTok;.
ccc0: 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a    LPWSTR zName;.
ccd0: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
cce0: 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67 65  o;.  BOOL bLogge
ccf0: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f 4f  d = FALSE;.  BOO
cd00: 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a  L bInit = TRUE;.
cd10: 0a 20 20 7a 4e 61 6d 65 20 3d 20 75 74 66 38 54  .  zName = utf8T
cd20: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
cd30: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
cd40: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 75  ==0 ){.    /* ou
cd50: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
cd60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cd70: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
cd80: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
cd90: 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  ze the local loc
cda0: 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73 65  kdata */.  memse
cdb0: 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c  t(&pFile->local,
cdc0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c 65   0, sizeof(pFile
cdd0: 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a  ->local));..  /*
cde0: 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 61 63   Replace the bac
cdf0: 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74 68  kslashes from th
ce00: 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c  e filename and l
ce10: 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a 2a  owercase it.  **
ce20: 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75 74   to derive a mut
ce30: 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54  ex name. */.  zT
ce40: 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65 72  ok = osCharLower
ce50: 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20  W(zName);.  for 
ce60: 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b  (;*zTok;zTok++){
ce70: 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d  .    if (*zTok =
ce80: 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20  = '\\') *zTok = 
ce90: 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  '_';.  }..  /* C
cea0: 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e  reate/open the n
ceb0: 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20  amed mutex */.  
cec0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
ced0: 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 28 4e  osCreateMutexW(N
cee0: 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d  ULL, FALSE, zNam
cef0: 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c 65  e);.  if (!pFile
cf00: 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 70  ->hMutex){.    p
cf10: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
cf20: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
cf30: 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  ();.    winLogEr
cf40: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
cf50: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
cf60: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
cf70: 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
cf80: 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock1", zFilenam
cf90: 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
cfa0: 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  free(zName);.   
cfb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
cfc0: 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OERR;.  }..  /* 
cfd0: 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
cfe0: 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75  x before continu
cff0: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75  ing */.  winceMu
d000: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
d010: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20  ->hMutex);.  .  
d020: 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d  /* Since the nam
d030: 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65  es of named mute
d040: 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c  xes, semaphores,
d050: 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65   file mappings e
d060: 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73  tc are .  ** cas
d070: 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b  e-sensitive, tak
d080: 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  e advantage of t
d090: 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73 69  hat by uppercasi
d0a0: 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d  ng the mutex nam
d0b0: 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67  e.  ** and using
d0c0: 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68 61   that as the sha
d0d0: 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20  red filemapping 
d0e0: 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43  name..  */.  osC
d0f0: 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29  harUpperW(zName)
d100: 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72  ;.  pFile->hShar
d110: 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ed = osCreateFil
d120: 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c 49  eMappingW(INVALI
d130: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20  D_HANDLE_VALUE, 
d140: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
d170: 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
d180: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
d190: 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  k),.            
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
d1c0: 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20  e);  ..  /* Set 
d1d0: 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
d1e0: 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20  cates we're the 
d1f0: 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20  first to create 
d200: 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74  the memory so it
d210: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a   .  ** must be z
d220: 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20  ero-initialized 
d230: 2a 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d  */.  lastErrno =
d240: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
d250: 29 3b 0a 20 20 69 66 20 28 6c 61 73 74 45 72 72  );.  if (lastErr
d260: 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45  no == ERROR_ALRE
d270: 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20  ADY_EXISTS){.   
d280: 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a   bInit = FALSE;.
d290: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
d2a0: 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f  ree(zName);..  /
d2b0: 2a 20 49 66 20 77 65 20 73 75 63 63 65 65 64 65  * If we succeede
d2c0: 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20  d in making the 
d2d0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61  shared memory ha
d2e0: 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f  ndle, map it. */
d2f0: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53  .  if( pFile->hS
d300: 68 61 72 65 64 20 29 7b 0a 20 20 20 20 70 46 69  hared ){.    pFi
d310: 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77 69  le->shared = (wi
d320: 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56 69  nceLock*)osMapVi
d330: 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
d340: 68 53 68 61 72 65 64 2c 20 0a 20 20 20 20 20 20  hShared, .      
d350: 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f         FILE_MAP_
d360: 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52  READ|FILE_MAP_WR
d370: 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f  ITE, 0, 0, sizeo
d380: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20  f(winceLock));. 
d390: 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67     /* If mapping
d3a0: 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74   failed, close t
d3b0: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
d3c0: 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73   handle and eras
d3d0: 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 28 20  e it */.    if( 
d3e0: 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 29  !pFile->shared )
d3f0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
d400: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
d410: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
d420: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
d430: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69  QLITE_IOERR, pFi
d440: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
d450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d460: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
d470: 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k2", zFilename);
d480: 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d  .      bLogged =
d490: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 6f 73 43   TRUE;.      osC
d4a0: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
d4b0: 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20  ->hShared);.    
d4c0: 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64    pFile->hShared
d4d0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
d4e0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72   }..  /* If shar
d4f0: 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20  ed memory could 
d500: 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c 20  not be created, 
d510: 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d  then close the m
d520: 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f  utex and fail */
d530: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53  .  if( pFile->hS
d540: 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  hared==NULL ){. 
d550: 20 20 20 69 66 28 20 21 62 4c 6f 67 67 65 64 20     if( !bLogged 
d560: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
d570: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
d580: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69 6e  Errno;.      win
d590: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
d5a0: 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
d5b0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
d5c0: 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63             "winc
d5d0: 65 43 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20 7a  eCreateLock3", z
d5e0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
d5f0: 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b   bLogged = TRUE;
d600: 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6e 63 65  .    }.    wince
d610: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
d620: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
d630: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
d640: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
d650: 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78     pFile->hMutex
d660: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74   = NULL;.    ret
d670: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
d680: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e  ;.  }.  .  /* In
d690: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61  itialize the sha
d6a0: 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65  red memory if we
d6b0: 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20  're supposed to 
d6c0: 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20 29  */.  if( bInit )
d6d0: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69  {.    memset(pFi
d6e0: 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73  le->shared, 0, s
d6f0: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
d700: 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d  );.  }..  winceM
d710: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
d720: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
d730: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d740: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79  }../*.** Destroy
d750: 20 74 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e   the part of win
d760: 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20  File that deals 
d770: 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73  with wince locks
d780: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d790: 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b  winceDestroyLock
d7a0: 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
d7b0: 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68  {.  if (pFile->h
d7c0: 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41  Mutex){.    /* A
d7d0: 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78  cquire the mutex
d7e0: 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74   */.    winceMut
d7f0: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
d800: 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f  >hMutex);..    /
d810: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
d820: 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72  blocks should pr
d830: 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e  obably assert in
d840: 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74   debug mode, but
d850: 20 74 68 65 79 0a 20 20 20 20 20 20 20 61 72 65   they.       are
d860: 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63   to cleanup in c
d870: 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65  ase any locks re
d880: 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20  mained open */. 
d890: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
d8a0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20  cal.nReaders){. 
d8b0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
d8c0: 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  ed->nReaders --;
d8d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
d8e0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
d8f0: 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46  erved){.      pF
d900: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
d910: 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
d920: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
d930: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
d940: 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ing){.      pFil
d950: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
d960: 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ing = FALSE;.   
d970: 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
d980: 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
d990: 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ve){.      pFile
d9a0: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
d9b0: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
d9c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72    }..    /* De-r
d9d0: 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f  eference and clo
d9e0: 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74  se our copy of t
d9f0: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
da00: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f   handle */.    o
da10: 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
da20: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b  (pFile->shared);
da30: 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
da40: 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
da50: 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65  d);..    /* Done
da60: 20 77 69 74 68 20 74 68 65 20 6d 75 74 65 78 20   with the mutex 
da70: 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65  */.    winceMute
da80: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
da90: 68 4d 75 74 65 78 29 3b 20 20 20 20 0a 20 20 20  hMutex);    .   
daa0: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
dab0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
dac0: 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78     pFile->hMutex
dad0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a   = NULL;.  }.}..
dae0: 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  /* .** An implem
daf0: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
db00: 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f  LockFile() API o
db10: 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
db20: 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
db30: 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20  winceLockFile(. 
db40: 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
db50: 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
db60: 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  OffsetLow,.  DWO
db70: 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48  RD dwFileOffsetH
db80: 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  igh,.  DWORD nNu
db90: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
dba0: 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
dbb0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
dbc0: 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
dbd0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
dbe0: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
dbf0: 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
dc00: 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
dc10: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
dc20: 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
dc30: 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
dc40: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
dc50: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
dc60: 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69  gh);..  if (!pFi
dc70: 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75  le->hMutex) retu
dc80: 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65  rn TRUE;.  wince
dc90: 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
dca0: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
dcb0: 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78  /* Wanting an ex
dcc0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f  clusive lock? */
dcd0: 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  .  if (dwFileOff
dce0: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
dcf0: 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a 20 20  )SHARED_FIRST.  
dd00: 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
dd10: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
dd20: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
dd30: 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20 28  _SIZE){.    if (
dd40: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
dd50: 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26 20  Readers == 0 && 
dd60: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
dd70: 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b  Exclusive == 0){
dd80: 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  .       pFile->s
dd90: 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
dda0: 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  e = TRUE;.      
ddb0: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45   pFile->local.bE
ddc0: 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
ddd0: 0a 20 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  .       bReturn 
dde0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
ddf0: 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72  }..  /* Want a r
de00: 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a  ead-only lock? *
de10: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
de20: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
de30: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
de40: 52 53 54 20 26 26 0a 20 20 20 20 20 20 20 20 20  RST &&.         
de50: 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73    nNumberOfBytes
de60: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
de70: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
de80: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
de90: 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20  ve == 0){.      
dea0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
deb0: 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20  aders ++;.      
dec0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
ded0: 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29 7b  .nReaders == 1){
dee0: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
def0: 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
df00: 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   ++;.      }.   
df10: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
df20: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
df30: 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69 6e  /* Want a pendin
df40: 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  g lock? */.  els
df50: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
df60: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
df70: 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20  PENDING_BYTE.   
df80: 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
df90: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
dfa0: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a  ow == 1){.    /*
dfb0: 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c   If no pending l
dfc0: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71  ock has been acq
dfd0: 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75  uired, then acqu
dfe0: 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ire it */.    if
dff0: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
e000: 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20  >bPending == 0) 
e010: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
e020: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
e030: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
e040: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
e050: 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
e060: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
e070: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
e080: 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76 65  * Want a reserve
e090: 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  d lock? */.  els
e0a0: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
e0b0: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
e0c0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20  RESERVED_BYTE.  
e0d0: 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d           && nNum
e0e0: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
e0f0: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
e100: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
e110: 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20 30  ->bReserved == 0
e120: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
e130: 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
e140: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
e150: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52   pFile->local.bR
e160: 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
e170: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
e180: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
e190: 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
e1a0: 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
e1b0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
e1c0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
e1d0: 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
e1e0: 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46  n of the UnlockF
e1f0: 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64 6f  ile API of Windo
e200: 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61  ws for CE.*/.sta
e210: 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e  tic BOOL winceUn
e220: 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  lockFile(.  LPHA
e230: 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
e240: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
e250: 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
e260: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
e270: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
e280: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
e290: 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
e2a0: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
e2b0: 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69  kHigh.){.  winFi
e2c0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44  le *pFile = HAND
e2d0: 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68  LE_TO_WINFILE(ph
e2e0: 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52  File);.  BOOL bR
e2f0: 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a  eturn = FALSE;..
e300: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
e310: 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48  ER(dwFileOffsetH
e320: 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  igh);.  UNUSED_P
e330: 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72  ARAMETER(nNumber
e340: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48  OfBytesToUnlockH
e350: 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46  igh);..  if (!pF
e360: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74  ile->hMutex) ret
e370: 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63  urn TRUE;.  winc
e380: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
e390: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
e3a0: 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
e3b0: 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61  reader lock or a
e3c0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
e3d0: 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65   */.  if (dwFile
e3e0: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
e3f0: 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
e400: 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65  ){.    /* Did we
e410: 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
e420: 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20  ve lock? */.    
e430: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
e440: 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
e450: 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62      assert(nNumb
e460: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
e470: 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  kLow == (DWORD)S
e480: 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20  HARED_SIZE);.   
e490: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
e4a0: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
e4b0: 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
e4c0: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
e4d0: 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
e4e0: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
e4f0: 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
e500: 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61 76   Did we just hav
e510: 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f  e a reader lock?
e520: 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20   */.    else if 
e530: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
e540: 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 61  eaders){.      a
e550: 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42  ssert(nNumberOfB
e560: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
e570: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
e580: 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 20  _SIZE.          
e590: 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42     || nNumberOfB
e5a0: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
e5b0: 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46 69  == 1);.      pFi
e5c0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
e5d0: 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20  rs --;.      if 
e5e0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
e5f0: 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20 20  eaders == 0).   
e600: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46 69     {.        pFi
e610: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
e620: 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d  ders --;.      }
e630: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
e640: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
e650: 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  ..  /* Releasing
e660: 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20   a pending lock 
e670: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
e680: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
e690: 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
e6a0: 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
e6b0: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
e6c0: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
e6d0: 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
e6e0: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
e6f0: 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
e700: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
e710: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
e720: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
e730: 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
e740: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
e750: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
e760: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
e770: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
e780: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
e790: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
e7a0: 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
e7b0: 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
e7c0: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
e7d0: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
e7e0: 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
e7f0: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
e800: 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed) {.      pFil
e810: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
e820: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
e830: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
e840: 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  >bReserved = FAL
e850: 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
e860: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
e870: 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
e880: 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
e890: 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
e8a0: 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a  n bReturn;.}./*.
e8b0: 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70  ** End of the sp
e8c0: 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 77  ecial code for w
e8d0: 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ince.***********
e8e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e8f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e920: 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  **/.#endif /* SQ
e930: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f  LITE_OS_WINCE */
e940: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66  ../*.** Lock a f
e950: 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73  ile region..*/.s
e960: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f  tatic BOOL winLo
e970: 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
e980: 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
e990: 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52  RD flags,.  DWOR
e9a0: 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  D offsetLow,.  D
e9b0: 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c  WORD offsetHigh,
e9c0: 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
e9d0: 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75  sLow,.  DWORD nu
e9e0: 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69  mBytesHigh.){.#i
e9f0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
ea00: 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  E.  /*.  ** NOTE
ea10: 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
ea20: 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
ea30: 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
ea40: 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
ea50: 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50  32.  **       AP
ea60: 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f  I LockFile..  */
ea70: 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c  .  return winceL
ea80: 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
ea90: 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
eaa0: 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20  tHigh,.         
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
eac0: 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79  mBytesLow, numBy
ead0: 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a  tesHigh);.#else.
eae0: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
eaf0: 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
eb00: 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  vlp;.    memset(
eb10: 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66  &ovlp, 0, sizeof
eb20: 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
eb30: 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d     ovlp.Offset =
eb40: 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20   offsetLow;.    
eb50: 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20  ovlp.OffsetHigh 
eb60: 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20  = offsetHigh;.  
eb70: 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46    return osLockF
eb80: 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66  ileEx(*phFile, f
eb90: 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65  lags, 0, numByte
eba0: 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
ebb0: 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
ebc0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
ebd0: 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69  osLockFile(*phFi
ebe0: 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
ebf0: 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79  ffsetHigh, numBy
ec00: 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20  tesLow,.        
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
ec20: 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d  mBytesHigh);.  }
ec30: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
ec40: 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72   Unlock a file r
ec50: 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69  egion.. */.stati
ec60: 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b  c BOOL winUnlock
ec70: 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
ec80: 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
ec90: 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57   offsetLow,.  DW
eca0: 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ORD offsetHigh,.
ecb0: 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
ecc0: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d  Low,.  DWORD num
ecd0: 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66  BytesHigh.){.#if
ece0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
ecf0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a  .  /*.  ** NOTE:
ed00: 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68   Windows CE is h
ed10: 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
ed20: 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20  ly here due its 
ed30: 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33  lack of the Win3
ed40: 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49  2.  **       API
ed50: 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a   UnlockFile..  *
ed60: 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65  /.  return wince
ed70: 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c  UnlockFile(phFil
ed80: 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66  e, offsetLow, of
ed90: 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20  fsetHigh,.      
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edb0: 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20     numBytesLow, 
edc0: 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23  numBytesHigh);.#
edd0: 65 6c 73 65 0a 20 20 69 66 28 20 69 73 4e 54 28  else.  if( isNT(
ede0: 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50  ) ){.    OVERLAP
edf0: 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65  PED ovlp;.    me
ee00: 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73  mset(&ovlp, 0, s
ee10: 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
ee20: 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ));.    ovlp.Off
ee30: 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b  set = offsetLow;
ee40: 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
ee50: 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67  High = offsetHig
ee60: 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  h;.    return os
ee70: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68  UnlockFileEx(*ph
ee80: 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65  File, 0, numByte
ee90: 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
eea0: 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
eeb0: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
eec0: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68  osUnlockFile(*ph
eed0: 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
eee0: 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
eef0: 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef10: 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b    numBytesHigh);
ef20: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
ef30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
ef80: 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20   The next group 
ef90: 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c  of routines impl
efa0: 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65  ement the I/O me
efb0: 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a  thods specified.
efc0: 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ** by the sqlite
efd0: 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
efe0: 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ect..***********
eff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f030: 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  ***/../*.** Some
f040: 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   Microsoft compi
f050: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
f060: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
f070: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
f080: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
f090: 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
f0a0: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
f0b0: 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
f0c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
f0d0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
f0e0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
f0f0: 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
f100: 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20  s the first .** 
f110: 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73  argument to offs
f120: 65 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69  et iOffset withi
f130: 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73  n the file. If s
f140: 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
f150: 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  n 0. .** Otherwi
f160: 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c  se, set pFile->l
f170: 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74  astErrno and ret
f180: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
f190: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
f1a0: 57 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65 20  WinFile(winFile 
f1b0: 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f  *pFile, sqlite3_
f1c0: 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a  int64 iOffset){.
f1d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
f1e0: 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65  INRT.  LONG uppe
f1f0: 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20  rBits;          
f200: 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73         /* Most s
f210: 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e  ig. 32 bits of n
f220: 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c  ew offset */.  L
f230: 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20  ONG lowerBits;  
f240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f250: 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20  * Least sig. 32 
f260: 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73  bits of new offs
f270: 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77  et */.  DWORD dw
f280: 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ret;            
f290: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
f2a0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74   returned by Set
f2b0: 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f  FilePointer() */
f2c0: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
f2d0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
f2e0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
f2f0: 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45  rned by GetLastE
f300: 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 75 70 70  rror() */..  upp
f310: 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
f320: 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  (iOffset>>32) & 
f330: 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c  0x7fffffff);.  l
f340: 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47  owerBits = (LONG
f350: 29 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66  )(iOffset & 0xff
f360: 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41  ffffff);..  /* A
f370: 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75  PI oddity: If su
f380: 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c  ccessful, SetFil
f390: 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72  ePointer() retur
f3a0: 6e 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a  ns a dword .  **
f3b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
f3c0: 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66  lower 32-bits of
f3d0: 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66   the new file-of
f3e0: 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20  fset. Or, if it 
f3f0: 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72  fails,.  ** it r
f400: 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53  eturns INVALID_S
f410: 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e  ET_FILE_POINTER.
f420: 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69   However accordi
f430: 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a  ng to MSDN, .  *
f440: 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  * INVALID_SET_FI
f450: 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61  LE_POINTER may a
f460: 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e  lso be a valid n
f470: 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f  ew offset. So to
f480: 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a   determine .  **
f490: 20 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f   whether an erro
f4a0: 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f  r has actually o
f4b0: 63 63 75 72 65 64 2c 20 69 74 20 69 73 20 61 6c  ccured, it is al
f4c0: 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  so necessary to 
f4d0: 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61  call .  ** GetLa
f4e0: 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a  stError()..  */.
f4f0: 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46    dwRet = osSetF
f500: 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65  ilePointer(pFile
f510: 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20  ->h, lowerBits, 
f520: 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45  &upperBits, FILE
f530: 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20  _BEGIN);..  if( 
f540: 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f  (dwRet==INVALID_
f550: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
f560: 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74  .      && ((last
f570: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
f580: 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52  tError())!=NO_ER
f590: 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69  ROR)) ){.    pFi
f5a0: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
f5b0: 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
f5c0: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
f5d0: 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46  E_IOERR_SEEK, pF
f5e0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65               "se
f600: 65 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46 69 6c  ekWinFile", pFil
f610: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72  e->zPath);.    r
f620: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
f630: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a  return 0;.#else.
f640: 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20 61    /*.  ** Same a
f650: 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20  s above, except 
f660: 74 68 61 74 20 74 68 69 73 20 69 6d 70 6c 65 6d  that this implem
f670: 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20 66  entation works f
f680: 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a  or WinRT..  */..
f690: 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20    LARGE_INTEGER 
f6a0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
f6b0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66 66    /* The new off
f6c0: 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52  set */.  BOOL bR
f6d0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
f6e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
f6f0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65  e returned by Se
f700: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 29  tFilePointerEx()
f710: 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61 72   */..  x.QuadPar
f720: 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20 62  t = iOffset;.  b
f730: 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50  Ret = osSetFileP
f740: 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65 2d 3e  ointerEx(pFile->
f750: 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42 45  h, x, 0, FILE_BE
f760: 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52 65  GIN);..  if(!bRe
f770: 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  t){.    pFile->l
f780: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
f790: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
f7a0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
f7b0: 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20  ITE_IOERR_SEEK, 
f7c0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f7d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
f7e0: 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46  seekWinFile", pF
f7f0: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
f800: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
f810: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64    return 0;.#end
f820: 69 66 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  if.}../* Forward
f830: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
f840: 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74  FS methods */.st
f850: 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61  atic int winUnma
f860: 70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  p(sqlite3_file *
f870: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  );../*.** Close 
f880: 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74  a file..**.** It
f890: 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 68 61   is reported tha
f8a0: 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  t an attempt to 
f8b0: 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d  close a handle m
f8c0: 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ight sometimes.*
f8d0: 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73  * fail.  This is
f8e0: 20 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e   a very unreason
f8f0: 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74  able result, but
f900: 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f   Windows is noto
f910: 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69  rious.** for bei
f920: 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  ng unreasonable 
f930: 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62  so I do not doub
f940: 74 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  t that it might 
f950: 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74  happen.  If.** t
f960: 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20  he close fails, 
f970: 77 65 20 70 61 75 73 65 20 66 6f 72 20 31 30 30  we pause for 100
f980: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e   milliseconds an
f990: 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73  d try again.  As
f9a0: 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43  .** many as MX_C
f9b0: 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74  LOSE_ATTEMPT att
f9c0: 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74  empts to close t
f9d0: 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61  he handle are ma
f9e0: 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76  de before.** giv
f9f0: 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75 72  ing up and retur
fa00: 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
fa10: 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f  /.#define MX_CLO
fa20: 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61  SE_ATTEMPT 3.sta
fa30: 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65  tic int winClose
fa40: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
fa50: 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e  d){.  int rc, cn
fa60: 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65  t = 0;.  winFile
fa70: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
fa80: 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
fa90: 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69 66 6e  t( id!=0 );.#ifn
faa0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fab0: 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20 70 46  WAL.  assert( pF
fac0: 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  ile->pShm==0 );.
fad0: 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45  #endif.  OSTRACE
fae0: 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  (("CLOSE %d\n", 
faf0: 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 61 73  pFile->h));.  as
fb00: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d  sert( pFile->h!=
fb10: 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68  NULL && pFile->h
fb20: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
fb30: 5f 56 41 4c 55 45 20 29 3b 0a 0a 20 20 72 63 20  _VALUE );..  rc 
fb40: 3d 20 77 69 6e 55 6e 6d 61 70 28 69 64 29 3b 0a  = winUnmap(id);.
fb50: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
fb60: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
fb70: 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d  ..  do{.    rc =
fb80: 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
fb90: 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a  File->h);.    /*
fba0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
fbb0: 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43  ( rc=0; cnt=MX_C
fbc0: 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b  LOSE_ATTEMPT; );
fbd0: 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63   */.  }while( rc
fbe0: 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d  ==0 && ++cnt < M
fbf0: 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
fc00: 26 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e 33  && (sqlite3_win3
fc10: 32 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31 29  2_sleep(100), 1)
fc20: 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   );.#if SQLITE_O
fc30: 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20  S_WINCE.#define 
fc40: 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41  WINCE_DELETION_A
fc50: 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63  TTEMPTS 3.  winc
fc60: 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69  eDestroyLock(pFi
fc70: 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  le);.  if( pFile
fc80: 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
fc90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
fca0: 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a  = 0;.    while(.
fcb0: 20 20 20 20 20 20 20 20 20 20 20 6f 73 44 65 6c             osDel
fcc0: 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e  eteFileW(pFile->
fcd0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d  zDeleteOnClose)=
fce0: 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f 73  =0.        && os
fcf0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
fd00: 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  sW(pFile->zDelet
fd10: 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66 66  eOnClose)!=0xfff
fd20: 66 66 66 66 66 20 0a 20 20 20 20 20 20 20 20 26  fffff .        &
fd30: 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f  & cnt++ < WINCE_
fd40: 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
fd50: 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20  S.    ){.       
fd60: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
fd70: 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61  eep(100);  /* Wa
fd80: 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f  it a little befo
fd90: 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20  re trying again 
fda0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  */.    }.    sql
fdb0: 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
fdc0: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
fdd0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  ;.  }.#endif.  O
fde0: 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  STRACE(("CLOSE %
fdf0: 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
fe00: 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22  h, rc ? "ok" : "
fe10: 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 69 66 28  failed"));.  if(
fe20: 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
fe30: 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  ->h = NULL;.  }.
fe40: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
fe50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f  );.  return rc ?
fe60: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20   SQLITE_OK.     
fe70: 20 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45         : winLogE
fe80: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
fe90: 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61  R_CLOSE, osGetLa
fea0: 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fec0: 20 20 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c       "winClose",
fed0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
fee0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
fef0: 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
ff00: 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
ff10: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
ff20: 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
ff30: 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
ff40: 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
ff50: 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
ff60: 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
ff70: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
ff80: 20 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69   winRead(.  sqli
ff90: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20  te3_file *id,   
ffa0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
ffb0: 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
ffc0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
ffe0: 72 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74  rite content int
fff0: 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
10000 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20  .  int amt,     
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10020 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
10030 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71   to read */.  sq
10040 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
10050 65 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69  et       /* Begi
10060 6e 20 72 65 61 64 69 6e 67 20 61 74 20 74 68 69  n reading at thi
10070 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23  s offset */.){.#
10080 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
10090 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50 50 45 44  NCE.  OVERLAPPED
100a0 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20   overlapped;    
100b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66        /* The off
100c0 73 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65  set for ReadFile
100d0 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69  . */.#endif.  wi
100e0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
100f0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
10100 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
10110 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20    DWORD nRead;  
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10130 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
10140 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
10150 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a  ad from file */.
10160 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
10170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10180 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
10190 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65  etrys */..  asse
101a0 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61  rt( id!=0 );.  a
101b0 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
101c0 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
101d0 3e 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  >=pFile->mmapSiz
101e0 65 20 29 3b 20 2f 2a 20 4e 65 76 65 72 20 72 65  e ); /* Never re
101f0 61 64 20 66 72 6f 6d 20 74 68 65 20 6d 6d 61 70  ad from the mmap
10200 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20  ped region */.  
10210 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
10220 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
10230 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54  ERR_READ);.  OST
10240 52 41 43 45 28 28 22 52 45 41 44 20 25 64 20 6c  RACE(("READ %d l
10250 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
10260 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
10270 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c  type));..#if SQL
10280 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
10290 66 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70  f( seekWinFile(p
102a0 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b  File, offset) ){
102b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
102c0 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77  TE_FULL;.  }.  w
102d0 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c  hile( !osReadFil
102e0 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66  e(pFile->h, pBuf
102f0 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30  , amt, &nRead, 0
10300 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d  ) ){.#else.  mem
10310 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c  set(&overlapped,
10320 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
10330 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c  APPED));.  overl
10340 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
10350 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30  LONG)(offset & 0
10360 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 6f 76  xffffffff);.  ov
10370 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48  erlapped.OffsetH
10380 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66  igh = (LONG)((of
10390 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
103a0 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69 6c 65  ffffff);.  while
103b0 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46  ( !osReadFile(pF
103c0 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
103d0 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76 65 72  t, &nRead, &over
103e0 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20 20 20  lapped) &&.     
103f0 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
10400 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44  or()!=ERROR_HAND
10410 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66  LE_EOF ){.#endif
10420 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
10430 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 72 65  rrno;.    if( re
10440 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79  tryIoerr(&nRetry
10450 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20  , &lastErrno) ) 
10460 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46  continue;.    pF
10470 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10480 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
10490 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
104a0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
104b0 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  READ, pFile->las
104c0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
104d0 20 20 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20       "winRead", 
104e0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
104f0 20 7d 0a 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52   }.  logIoerr(nR
10500 65 74 72 79 29 3b 0a 20 20 69 66 28 20 6e 52 65  etry);.  if( nRe
10510 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b  ad<(DWORD)amt ){
10520 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70  .    /* Unread p
10530 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66  arts of the buff
10540 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d  er must be zero-
10550 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65  filled */.    me
10560 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42  mset(&((char*)pB
10570 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61  uf)[nRead], 0, a
10580 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 72  mt-nRead);.    r
10590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
105a0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
105b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
105c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
105d0 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
105e0 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
105f0 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
10600 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
10610 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
10620 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
10630 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
10640 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69  tatic int winWri
10650 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
10660 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
10670 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
10680 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20   write into */. 
10690 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
106a0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
106b0 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f   /* The bytes to
106c0 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
106d0 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
106e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
10700 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  tes to write */.
10710 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
10720 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  offset          
10730 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
10740 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67   the file to beg
10750 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
10760 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
10770 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10780 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
10790 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
107a0 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a  ed, else false *
107b0 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
107c0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
107d0 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
107e0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74  le */.  int nRet
107f0 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
10800 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10810 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a  r of retries */.
10820 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
10830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
10840 66 73 65 74 3e 3d 70 46 69 6c 65 2d 3e 6d 6d 61  fset>=pFile->mma
10850 70 53 69 7a 65 20 29 3b 20 2f 2a 20 4e 65 76 65  pSize ); /* Neve
10860 72 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68 65  r write into the
10870 20 6d 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20   mmapped region 
10880 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
10890 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
108a0 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
108b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
108c0 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  E);.  SimulateDi
108d0 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75  skfullError(retu
108e0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b  rn SQLITE_FULL);
108f0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  ..  OSTRACE(("WR
10900 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  ITE %d lock=%d\n
10910 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
10920 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
10930 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
10940 49 4e 43 45 0a 20 20 72 63 20 3d 20 73 65 65 6b  INCE.  rc = seek
10950 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f  WinFile(pFile, o
10960 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
10970 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b  ==0 ){.#else.  {
10980 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c  .#endif.#if !SQL
10990 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
109a0 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72   OVERLAPPED over
109b0 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 2f  lapped;        /
109c0 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72  * The offset for
109d0 20 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23   WriteFile. */.#
109e0 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61 52  endif.    u8 *aR
109f0 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b  em = (u8 *)pBuf;
10a00 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
10a10 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
10a20 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65  n */.    int nRe
10a30 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20  m = amt;        
10a40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10a50 20 6f 66 20 62 79 74 65 73 20 79 65 74 20 74 6f   of bytes yet to
10a60 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
10a70 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b     DWORD nWrite;
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a90 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74 65   /* Bytes writte
10aa0 6e 20 62 79 20 65 61 63 68 20 57 72 69 74 65 46  n by each WriteF
10ab0 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20  ile() call */.  
10ac0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
10ad0 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20  o = NO_ERROR;   
10ae0 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
10af0 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f  d by GetLastErro
10b00 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c  r() */..#if !SQL
10b10 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
10b20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70   memset(&overlap
10b30 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  ped, 0, sizeof(O
10b40 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
10b50 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
10b60 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73  et = (LONG)(offs
10b70 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
10b80 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64  ;.    overlapped
10b90 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
10ba0 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
10bb0 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
10bc0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69  .#endif..    whi
10bd0 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69  le( nRem>0 ){.#i
10be0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
10bf0 45 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57  E.      if( !osW
10c00 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e  riteFile(pFile->
10c10 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26  h, aRem, nRem, &
10c20 6e 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65  nWrite, 0) ){.#e
10c30 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f  lse.      if( !o
10c40 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65  sWriteFile(pFile
10c50 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c  ->h, aRem, nRem,
10c60 20 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c   &nWrite, &overl
10c70 61 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66  apped) ){.#endif
10c80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74  .        if( ret
10c90 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
10ca0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
10cb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
10cc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
10cd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 57        assert( nW
10ce0 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74  rite==0 || nWrit
10cf0 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20 29  e<=(DWORD)nRem )
10d00 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69  ;.      if( nWri
10d10 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3e  te==0 || nWrite>
10d20 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a 20  (DWORD)nRem ){. 
10d30 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
10d40 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
10d50 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  r();.        bre
10d60 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20  ak;.      }.#if 
10d70 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
10d80 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
10d90 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f   nWrite;.      o
10da0 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
10db0 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
10dc0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
10dd0 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64        overlapped
10de0 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
10df0 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
10e00 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
10e10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52  .#endif.      aR
10e20 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  em += nWrite;.  
10e30 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69      nRem -= nWri
10e40 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  te;.    }.    if
10e50 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
10e60 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
10e70 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
10e80 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
10e90 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
10ea0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28  c ){.    if(   (
10eb0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10ec0 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  o==ERROR_HANDLE_
10ed0 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20  DISK_FULL ).    
10ee0 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c     || ( pFile->l
10ef0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
10f00 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20  DISK_FULL )){.  
10f10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10f20 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
10f30 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
10f40 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
10f50 52 5f 57 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e  R_WRITE, pFile->
10f60 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
10f70 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74          "winWrit
10f80 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
10f90 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
10fa0 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29  logIoerr(nRetry)
10fb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
10fc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
10fd0 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f  ** Truncate an o
10fe0 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70  pen file to a sp
10ff0 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a  ecified size.*/.
11000 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72  static int winTr
11010 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
11020 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
11030 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20  _int64 nByte){. 
11040 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
11050 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20  = (winFile*)id; 
11060 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
11070 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
11080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
11090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
110a0 65 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74  eturn code for t
110b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  his function */.
110c0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
110d0 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  o;..  assert( pF
110e0 69 6c 65 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ile );..  OSTRAC
110f0 45 28 28 22 54 52 55 4e 43 41 54 45 20 25 64 20  E(("TRUNCATE %d 
11100 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %lld\n", pFile->
11110 68 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 53 69  h, nByte));.  Si
11120 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
11130 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
11140 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 0a 20 20  R_TRUNCATE);..  
11150 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  /* If the user h
11160 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20  as configured a 
11170 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74  chunk-size for t
11180 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61  his file, trunca
11190 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65  te the.  ** file
111a0 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73   so that it cons
111b0 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67  ists of an integ
111c0 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75  er number of chu
111d0 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20  nks (i.e. the.  
111e0 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73  ** actual file s
111f0 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70  ize after the op
11200 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c  eration may be l
11210 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72  arger than the r
11220 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69  equested.  ** si
11230 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ze)..  */.  if( 
11240 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
11250 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
11260 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d  ((nByte + pFile-
11270 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46  >szChunk - 1)/pF
11280 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
11290 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
112a0 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64    }..  /* SetEnd
112b0 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73  OfFile() returns
112c0 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73   non-zero when s
112d0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65  uccessful, or ze
112e0 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73  ro when it fails
112f0 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 65 6b 57  . */.  if( seekW
11300 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42  inFile(pFile, nB
11310 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  yte) ){.    rc =
11320 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
11330 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
11340 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
11350 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
11360 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54             "winT
11370 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c 65  runcate1", pFile
11380 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
11390 65 20 69 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e  e if( 0==osSetEn
113a0 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  dOfFile(pFile->h
113b0 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  ) &&.           
113c0 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f   ((lastErrno = o
113d0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
113e0 21 3d 45 52 52 4f 52 5f 55 53 45 52 5f 4d 41 50  !=ERROR_USER_MAP
113f0 50 45 44 5f 46 49 4c 45 29 20 29 7b 0a 20 20 20  PED_FILE) ){.   
11400 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11410 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
11420 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
11430 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
11440 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65  _TRUNCATE, pFile
11450 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22    "winTruncate2"
11480 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
11490 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
114a0 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
114b0 20 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64 20   just truncated 
114c0 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65  to a size smalle
114d0 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
114e0 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70 70  ntly.    ** mapp
114f0 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63  ed region, reduc
11500 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  e the effective 
11510 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20  mapping size as 
11520 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c  well. SQLite wil
11530 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65 61  l.    ** use rea
11540 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20  d() and write() 
11550 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62  to access data b
11560 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74  eyond this point
11570 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20   from now on..  
11580 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69    */.    if( pFi
11590 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 26  le->pMapRegion &
115a0 26 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d  & nByte<pFile->m
115b0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
115c0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
115d0 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a   = nByte;.    }.
115e0 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
115f0 22 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c  "TRUNCATE %d %ll
11600 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  d %s\n", pFile->
11610 68 2c 20 6e 42 79 74 65 2c 20 72 63 20 3f 20 22  h, nByte, rc ? "
11620 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
11630 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11640 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11650 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
11660 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
11670 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
11680 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
11690 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
116a0 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
116b0 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
116c0 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65   occuring at the
116d0 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
116e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
116f0 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
11700 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
11710 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
11720 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  dif../*.** Make 
11730 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
11740 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
11750 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
11760 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73  ed to disk..*/.s
11770 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e  tatic int winSyn
11780 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
11790 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
117a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
117b0 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a  O_SYNC.  /*.  **
117c0 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20   Used only when 
117d0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
117e0 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20  s not defined.. 
117f0 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a    */.  BOOL rc;.
11800 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
11810 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21  ned(NDEBUG) || !
11820 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
11830 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20  O_SYNC) || \.   
11840 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   (defined(SQLITE
11850 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65  _TEST) && define
11860 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29  d(SQLITE_DEBUG))
11870 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  /*.  ** Used 
11880 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
11890 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
118a0 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 61 73  ed and by the as
118b0 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20  sert() and/or.  
118c0 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63  ** OSTRACE() mac
118d0 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e  ros..   */.  win
118e0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
118f0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73  inFile*)id;.#els
11900 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
11910 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66  ETER(id);.#endif
11920 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
11930 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20  e );.  /* Check 
11940 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
11950 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
11960 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
11970 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
11980 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
11990 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
119a0 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
119b0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
119c0 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 4f  C_FULL.  );..  O
119d0 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 25 64  STRACE(("SYNC %d
119e0 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
119f0 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
11a00 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
11a10 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74  Unix cannot, but
11a20 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61   some systems ma
11a30 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
11a40 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20  FULL from here. 
11a50 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69  This.  ** line i
11a60 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64  s to test that d
11a70 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74  oing so does not
11a80 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
11a90 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ems..  */.  Simu
11aa0 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
11ab0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
11ac0 5f 46 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e 64 65  _FULL );..#ifnde
11ad0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
11ae0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
11af0 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20  (flags);.#else. 
11b00 20 69 66 28 20 28 66 6c 61 67 73 26 30 78 30 46   if( (flags&0x0F
11b10 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
11b20 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ULL ){.    sqlit
11b30 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
11b40 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  t++;.  }.  sqlit
11b50 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  e3_sync_count++;
11b60 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
11b70 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74   we compiled wit
11b80 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  h the SQLITE_NO_
11b90 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20  SYNC flag, then 
11ba0 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a  syncing is a.  *
11bb0 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66  * no-op.  */.#if
11bc0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
11bd0 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  NC.  return SQLI
11be0 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 72  TE_OK;.#else.  r
11bf0 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65 42  c = osFlushFileB
11c00 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29  uffers(pFile->h)
11c10 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
11c20 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b  ror( rc=FALSE );
11c30 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
11c40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11c50 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
11c60 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11c70 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
11c80 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  r();.    return 
11c90 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
11ca0 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20  TE_IOERR_FSYNC, 
11cb0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11cc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
11cd0 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d  winSync", pFile-
11ce0 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e  >zPath);.  }.#en
11cf0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  dif.}../*.** Det
11d00 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
11d10 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
11d20 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74  e in bytes.*/.st
11d30 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65  atic int winFile
11d40 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
11d50 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
11d60 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20  nt64 *pSize){.  
11d70 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
11d80 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
11d90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11da0 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
11db0 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c  id!=0 );.  Simul
11dc0 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
11dd0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
11de0 53 54 41 54 29 3b 0a 23 69 66 20 53 51 4c 49 54  STAT);.#if SQLIT
11df0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20  E_OS_WINRT.  {. 
11e00 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44     FILE_STANDARD
11e10 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20  _INFO info;.    
11e20 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66  if( osGetFileInf
11e30 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
11e40 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c  Ex(pFile->h, Fil
11e50 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20  eStandardInfo,. 
11e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f      &info, sizeo
11e90 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20  f(info)) ){.    
11ea0 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e    *pSize = info.
11eb0 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61  EndOfFile.QuadPa
11ec0 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rt;.    }else{. 
11ed0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11ee0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
11ef0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
11f00 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
11f10 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
11f20 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  TAT, pFile->last
11f30 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
11f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
11f50 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69  inFileSize", pFi
11f60 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
11f70 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a  }.  }.#else.  {.
11f80 20 20 20 20 44 57 4f 52 44 20 75 70 70 65 72 42      DWORD upperB
11f90 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c  its;.    DWORD l
11fa0 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57  owerBits;.    DW
11fb0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a  ORD lastErrno;..
11fc0 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20      lowerBits = 
11fd0 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46  osGetFileSize(pF
11fe0 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69  ile->h, &upperBi
11ff0 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20  ts);.    *pSize 
12000 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74  = (((sqlite3_int
12010 36 34 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33  64)upperBits)<<3
12020 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a  2) + lowerBits;.
12030 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72      if(   (lower
12040 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f  Bits == INVALID_
12050 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20  FILE_SIZE).     
12060 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
12070 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
12080 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20  r())!=NO_ERROR) 
12090 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
120a0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
120b0 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  Errno;.      rc 
120c0 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
120d0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
120e0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
120f0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
12100 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20   "winFileSize", 
12110 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
12120 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
12130 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12140 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46  /*.** LOCKFILE_F
12150 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
12160 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20  is undefined on 
12170 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79 73  some Windows sys
12180 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tems..*/.#ifndef
12190 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
121a0 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65 66  MMEDIATELY.# def
121b0 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  ine LOCKFILE_FAI
121c0 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a  L_IMMEDIATELY 1.
121d0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
121e0 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
121f0 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65  VE_LOCK.# define
12200 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
12210 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69  IVE_LOCK 2.#endi
12220 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69  f../*.** Histori
12230 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68 61  cally, SQLite ha
12240 73 20 75 73 65 64 20 62 6f 74 68 20 74 68 65 20  s used both the 
12250 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63  LockFile and Loc
12260 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e  kFileEx function
12270 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c  s..** When the L
12280 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e  ockFile function
12290 20 77 61 73 20 75 73 65 64 2c 20 69 74 20 77 61   was used, it wa
122a0 73 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65  s always expecte
122b0 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d  d to fail.** imm
122c0 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65 20  ediately if the 
122d0 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
122e0 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c 73  e obtained.  Als
122f0 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78 70  o, it always exp
12300 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61  ected to.** obta
12310 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  in an exclusive 
12320 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c 61  lock.  These fla
12330 67 73 20 61 72 65 20 75 73 65 64 20 77 69 74 68  gs are used with
12340 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20   the LockFileEx 
12350 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  function.** and 
12360 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65 78  reflect those ex
12370 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65 72  pectations; ther
12380 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f 75  efore, they shou
12390 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65  ld not be change
123a0 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  d..*/.#ifndef SQ
123b0 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
123c0 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  AGS.# define SQL
123d0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
123e0 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46  GS   (LOCKFILE_F
123f0 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
12400 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12420 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45        LOCKFILE_E
12430 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23  XCLUSIVE_LOCK).#
12440 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72  endif../*.** Cur
12450 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e  rently, SQLite n
12460 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20 4c  ever calls the L
12470 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69  ockFileEx functi
12480 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74 69  on without wanti
12490 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74  ng the.** call t
124a0 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74 65  o fail immediate
124b0 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63  ly if the lock c
124c0 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  annot be obtaine
124d0 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  d..*/.#ifndef SQ
124e0 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f  LITE_LOCKFILEEX_
124f0 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53  FLAGS.# define S
12500 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58  QLITE_LOCKFILEEX
12510 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45  _FLAGS (LOCKFILE
12520 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
12530 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  Y).#endif../*.**
12540 20 41 63 71 75 69 72 65 20 61 20 72 65 61 64 65   Acquire a reade
12550 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65  r lock..** Diffe
12560 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e 65  rent API routine
12570 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65 70  s are called dep
12580 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
12590 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a  r or not this.**
125a0 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69 6e   is Win9x or Win
125b0 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NT..*/.static in
125c0 74 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 77 69  t getReadLock(wi
125d0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
125e0 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66 28 20   int res;.  if( 
125f0 69 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  isNT() ){.#if SQ
12600 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
12610 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
12620 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
12630 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
12640 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
12650 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
12660 33 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  32.    **       
12670 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a  API LockFileEx..
12680 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d      */.    res =
12690 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26   winceLockFile(&
126a0 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
126b0 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29  _FIRST, 0, 1, 0)
126c0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20  ;.#else.    res 
126d0 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
126e0 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
126f0 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53  LOCKFILEEX_FLAGS
12700 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
12710 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
12720 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
12730 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66  SIZE, 0);.#endif
12740 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
12750 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
12760 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e  I.  else{.    in
12770 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  t lk;.    sqlite
12780 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
12790 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20  eof(lk), &lk);. 
127a0 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
127b0 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72  LockByte = (shor
127c0 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66  t)((lk & 0x7ffff
127d0 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a  fff)%(SHARED_SIZ
127e0 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73  E - 1));.    res
127f0 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
12800 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
12810 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
12820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12830 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
12840 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
12850 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
12860 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
12870 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
12880 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
12890 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
128a0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f  stError();.    /
128b0 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67  * No need to log
128c0 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f   a failure to lo
128d0 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ck */.  }.  retu
128e0 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
128f0 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b   Undo a readlock
12900 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
12910 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69  nlockReadLock(wi
12920 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
12930 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f 52   int res;.  DWOR
12940 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69  D lastErrno;.  i
12950 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
12960 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b   res = winUnlock
12970 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
12980 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
12990 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
129a0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
129b0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
129c0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72  SI.  else{.    r
129d0 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  es = winUnlockFi
129e0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
129f0 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65  ARED_FIRST+pFile
12a00 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
12a10 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
12a20 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73  #endif.  if( res
12a30 3d 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72 72  ==0 && ((lastErr
12a40 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
12a50 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f  ror())!=ERROR_NO
12a60 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20  T_LOCKED) ){.   
12a70 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
12a80 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
12a90 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
12aa0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
12ab0 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  CK, pFile->lastE
12ac0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
12ad0 20 20 20 22 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f     "unlockReadLo
12ae0 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ck", pFile->zPat
12af0 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  h);.  }.  return
12b00 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c   res;.}../*.** L
12b10 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
12b20 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
12b30 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
12b40 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65  r locktype - one
12b50 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
12b60 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
12b70 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
12b80 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
12b90 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
12ba0 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
12bb0 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
12bc0 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
12bd0 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
12be0 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
12bf0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
12c00 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
12c10 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
12c20 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
12c30 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
12c40 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
12c50 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
12c60 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
12c70 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
12c80 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
12c90 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
12ca0 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
12cb0 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
12cc0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
12cd0 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
12ce0 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
12cf0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
12d00 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
12d10 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
12d20 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
12d30 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
12d40 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
12d50 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
12d60 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
12d70 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
12d80 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
12d90 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
12da0 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
12db0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
12dc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
12dd0 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
12de0 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69   a lock.  The wi
12df0 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e  nUnlock() routin
12e00 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c 20  e.** erases all 
12e10 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e  locks at once an
12e20 64 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d 6d  d returns us imm
12e30 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b  ediately to lock
12e40 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20  ing level 0..** 
12e50 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
12e60 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65 20  le to lower the 
12e70 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
12e80 65 20 73 74 65 70 20 61 74 20 61 20 74 69 6d 65  e step at a time
12e90 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67  .  You.** must g
12ea0 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c 6f  o straight to lo
12eb0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a  cking level 0..*
12ec0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
12ed0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
12ee0 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
12ef0 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ype){.  int rc =
12f00 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f   SQLITE_OK;    /
12f10 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
12f20 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a  om subroutines *
12f30 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
12f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
12f50 73 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f 77  sult of a Window
12f60 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20  s lock call */. 
12f70 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65   int newLocktype
12f80 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70  ;       /* Set p
12f90 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74  File->locktype t
12fa0 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66  o this value bef
12fb0 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20  ore exiting */. 
12fc0 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c   int gotPendingL
12fd0 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20  ock = 0;/* True 
12fe0 69 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61  if we acquired a
12ff0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68   PENDING lock th
13000 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e  is time */.  win
13010 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
13020 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57  inFile*)id;.  DW
13030 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
13040 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73  NO_ERROR;..  ass
13050 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
13060 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  OSTRACE(("LOCK %
13070 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c  d %d was %d(%d)\
13080 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
13090 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
130a0 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
130b0 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
130c0 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 0a 20 20  dLockByte));..  
130d0 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
130e0 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
130f0 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
13100 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
13110 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c  n the.  ** OsFil
13120 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
13130 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
13140 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
13150 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  , as.  ** sqlite
13160 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20  3OsEnterMutex() 
13170 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
13180 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
13190 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
131a0 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe>=locktype ){.
131b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
131c0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
131d0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
131e0 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
131f0 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20  s correct.  */. 
13200 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
13210 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43  locktype!=NO_LOC
13220 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  K || locktype==S
13230 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
13240 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
13250 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
13260 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
13270 74 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c  type!=RESERVED_L
13280 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f  OCK || pFile->lo
13290 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
132a0 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  OCK );..  /* Loc
132b0 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f  k the PENDING_LO
132c0 43 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65  CK byte if we ne
132d0 65 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20  ed to acquire a 
132e0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a  PENDING lock or.
132f0 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f    ** a SHARED lo
13300 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  ck.  If we are a
13310 63 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45  cquiring a SHARE
13320 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75  D lock, the acqu
13330 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20  isition of.  ** 
13340 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  the PENDING_LOCK
13350 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61   byte is tempora
13360 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f  ry..  */.  newLo
13370 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e  cktype = pFile->
13380 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
13390 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79    (pFile->lockty
133a0 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20  pe==NO_LOCK).   
133b0 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79    || (   (lockty
133c0 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
133d0 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  CK).         && 
133e0 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65  (pFile->locktype
133f0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
13400 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ).  ){.    int c
13410 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c  nt = 3;.    whil
13420 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72  e( cnt-->0 && (r
13430 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
13440 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
13450 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
13460 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13480 20 20 20 20 20 20 20 20 20 20 20 20 50 45 4e 44              PEND
13490 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
134a0 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  0))==0 ){.      
134b0 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20 74  /* Try 3 times t
134c0 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e  o get the pendin
134d0 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73  g lock.  This is
134e0 20 6e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a   needed to work.
134f0 20 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20        ** around 
13500 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20  problems caused 
13510 62 79 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f  by indexing and/
13520 6f 72 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f  or anti-virus so
13530 66 74 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20  ftware on.      
13540 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65  ** Windows syste
13550 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20  ms..      ** If 
13560 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20 74 68  you are using th
13570 69 73 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64  is code as a mod
13580 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69  el for alternati
13590 76 65 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74  ve VFSes, do not
135a0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74  .      ** copy t
135b0 68 69 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e  his retry logic.
135c0 20 20 49 74 20 69 73 20 61 20 68 61 63 6b 20 69    It is a hack i
135d0 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64  ntended for Wind
135e0 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ows only..      
135f0 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  */.      OSTRACE
13600 28 28 22 63 6f 75 6c 64 20 6e 6f 74 20 67 65 74  (("could not get
13610 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e   a PENDING lock.
13620 20 63 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e 74 29   cnt=%d\n", cnt)
13630 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74  );.      if( cnt
13640 20 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   ) sqlite3_win32
13650 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d  _sleep(1);.    }
13660 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c  .    gotPendingL
13670 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69  ock = res;.    i
13680 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20  f( !res ){.     
13690 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
136a0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
136b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
136c0 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20  cquire a shared 
136d0 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
136e0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
136f0 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
13700 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
13710 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  e->locktype==NO_
13720 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
13730 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  = getReadLock(pF
13740 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65  ile);.    if( re
13750 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
13760 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
13770 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
13780 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
13790 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
137a0 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
137b0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
137c0 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a  ESERVED lock.  *
137d0 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
137e0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
137f0 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
13800 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
13810 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
13820 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
13830 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
13840 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
13850 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45  CKFILE_FLAGS, RE
13860 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
13870 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
13880 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
13890 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
138a0 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
138b0 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
138c0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
138d0 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
138e0 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
138f0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20  a PENDING lock. 
13900 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
13910 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
13920 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
13930 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50   newLocktype = P
13940 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
13950 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
13960 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  = 0;.  }..  /* A
13970 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
13980 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  IVE lock.  */.  
13990 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
139a0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
139b0 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
139c0 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
139d0 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
139e0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c  );.    res = unl
139f0 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  ockReadLock(pFil
13a00 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
13a10 28 22 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25  ("unreadlock = %
13a20 64 5c 6e 22 2c 20 72 65 73 29 29 3b 0a 20 20 20  d\n", res));.   
13a30 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
13a40 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
13a50 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
13a60 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53  AGS, SHARED_FIRS
13a70 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  T, 0,.          
13a80 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
13a90 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
13aa0 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
13ab0 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
13ac0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
13ad0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13ae0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
13af0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
13b00 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 65       OSTRACE(("e
13b10 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e  rror-code = %d\n
13b20 22 2c 20 6c 61 73 74 45 72 72 6e 6f 29 29 3b 0a  ", lastErrno));.
13b30 20 20 20 20 20 20 67 65 74 52 65 61 64 4c 6f 63        getReadLoc
13b40 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  k(pFile);.    }.
13b50 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
13b60 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45  are holding a PE
13b70 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20  NDING lock that 
13b80 6f 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65  ought to be rele
13b90 61 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  ased, then.  ** 
13ba0 72 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a  release it now..
13bb0 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65    */.  if( gotPe
13bc0 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63  ndingLock && loc
13bd0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
13be0 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
13bf0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
13c00 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
13c10 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a   0, 1, 0);.  }..
13c20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
13c30 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63  state of the loc
13c40 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68  k has held in th
13c50 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
13c60 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75  r then.  ** retu
13c70 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
13c80 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  te result code..
13c90 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29    */.  if( res )
13ca0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
13cb0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
13cc0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
13cd0 4b 20 46 41 49 4c 45 44 20 25 64 20 74 72 79 69  K FAILED %d tryi
13ce0 6e 67 20 66 6f 72 20 25 64 20 62 75 74 20 67 6f  ng for %d but go
13cf0 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  t %d\n", pFile->
13d00 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f  h,.           lo
13d10 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74  cktype, newLockt
13d20 79 70 65 29 29 3b 0a 20 20 20 20 70 46 69 6c 65  ype));.    pFile
13d30 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
13d40 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  stErrno;.    rc 
13d50 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
13d60 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
13d70 74 79 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f  type = (u8)newLo
13d80 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e  cktype;.  return
13d90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
13da0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
13db0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
13dc0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
13dd0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
13de0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
13df0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
13e00 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
13e10 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
13e20 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  , return.** non-
13e30 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
13e40 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
13e50 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65  int winCheckRese
13e60 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
13e70 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
13e80 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
13e90 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  rc;.  winFile *p
13ea0 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
13eb0 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
13ec0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
13ed0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
13ee0 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
13ef0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  );..  assert( id
13f00 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
13f10 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45  le->locktype>=RE
13f20 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
13f30 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 4f     rc = 1;.    O
13f40 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
13f50 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 6c 6f 63  -LOCK %d %d (loc
13f60 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  al)\n", pFile->h
13f70 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  , rc));.  }else{
13f80 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63  .    rc = winLoc
13f90 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
13fa0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
13fb0 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45 44  _FLAGS, RESERVED
13fc0 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
13fd0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
13fe0 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69       winUnlockFi
13ff0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45  le(&pFile->h, RE
14000 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
14010 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  1, 0);.    }.   
14020 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f   rc = !rc;.    O
14030 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
14040 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72 65 6d  -LOCK %d %d (rem
14050 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ote)\n", pFile->
14060 68 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a  h, rc));.  }.  *
14070 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20  pResOut = rc;.  
14080 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14090 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
140a0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
140b0 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
140c0 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b  iptor id to lock
140d0 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a  type.  locktype.
140e0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
140f0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
14100 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
14110 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
14120 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
14130 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
14140 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
14150 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
14160 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
14170 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
14180 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
14190 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
141a0 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f  ible for this ro
141b0 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66  utine to fail if
141c0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
141d0 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f  ment.** is NO_LO
141e0 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  CK.  If the seco
141f0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53  nd argument is S
14200 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20  HARED_LOCK then 
14210 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
14220 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c  might return SQL
14230 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74  ITE_IOERR;.*/.st
14240 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f  atic int winUnlo
14250 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
14260 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
14270 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a  e){.  int type;.
14280 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
14290 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
142a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
142b0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
142c0 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61   pFile!=0 );.  a
142d0 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c  ssert( locktype<
142e0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
142f0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
14300 43 4b 20 25 64 20 74 6f 20 25 64 20 77 61 73 20  CK %d to %d was 
14310 25 64 28 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  %d(%d)\n", pFile
14320 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20  ->h, locktype,. 
14330 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
14340 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
14350 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 29  >sharedLockByte)
14360 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c  );.  type = pFil
14370 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69  e->locktype;.  i
14380 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49  f( type>=EXCLUSI
14390 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  VE_LOCK ){.    w
143a0 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
143b0 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
143c0 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
143d0 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
143e0 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
143f0 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74 52  ED_LOCK && !getR
14400 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29  eadLock(pFile) )
14410 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
14420 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
14430 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  pen.  We should 
14440 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74  always be able t
14450 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71  o.      ** reacq
14460 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
14470 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  ck */.      rc =
14480 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
14490 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
144a0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
144b0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
144c0 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20     "winUnlock", 
144d0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
144e0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74     }.  }.  if( t
144f0 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
14500 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
14510 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
14520 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
14530 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
14540 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
14550 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e  NO_LOCK && type>
14560 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
14570 20 20 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f      unlockReadLo
14580 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  ck(pFile);.  }. 
14590 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49   if( type>=PENDI
145a0 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  NG_LOCK ){.    w
145b0 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
145c0 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
145d0 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
145e0 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
145f0 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b  ktype = (u8)lock
14600 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72  type;.  return r
14610 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a  c;.}../*.** If *
14620 70 41 72 67 20 69 73 20 69 6e 69 74 69 74 69 61  pArg is inititia
14630 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65  lly negative the
14640 6e 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72  n this is a quer
14650 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f  y.  Set *pArg to
14660 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e  .** 1 or 0 depen
14670 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20  ding on whether 
14680 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20  or not bit mask 
14690 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
146a0 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a  ags is set..**.*
146b0 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20  * If *pArg is 0 
146c0 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72  or 1, then clear
146d0 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b   or set the mask
146e0 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63   bit of pFile->c
146f0 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61  trlFlags..*/.sta
14700 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65  tic void winMode
14710 42 69 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  Bit(winFile *pFi
14720 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  le, unsigned cha
14730 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72  r mask, int *pAr
14740 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c  g){.  if( *pArg<
14750 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d  0 ){.    *pArg =
14760 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61   (pFile->ctrlFla
14770 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20  gs & mask)!=0;. 
14780 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72   }else if( (*pAr
14790 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69  g)==0 ){.    pFi
147a0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d  le->ctrlFlags &=
147b0 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b   ~mask;.  }else{
147c0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
147d0 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20  Flags |= mask;. 
147e0 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64   }.}../* Forward
147f0 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
14800 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65  static int getTe
14810 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
14820 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f   char *zBuf);../
14830 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64  *.** Control and
14840 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70   query of the op
14850 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  en file handle..
14860 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
14870 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  nFileControl(sql
14880 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
14890 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
148a0 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  g){.  winFile *p
148b0 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
148c0 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  )id;.  switch( o
148d0 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  p ){.    case SQ
148e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
148f0 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28  TATE: {.      *(
14900 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  int*)pArg = pFil
14910 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20  e->locktype;.   
14920 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14930 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
14940 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  ase SQLITE_LAST_
14950 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a  ERRNO: {.      *
14960 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69 6e  (int*)pArg = (in
14970 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  t)pFile->lastErr
14980 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  no;.      return
14990 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
149a0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
149b0 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
149c0 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ZE: {.      pFil
149d0 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  e->szChunk = *(i
149e0 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
149f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14a00 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
14a10 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
14a20 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20  IZE_HINT: {.    
14a30 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
14a40 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  hunk>0 ){.      
14a50 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
14a60 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69  oldSz;.        i
14a70 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53  nt rc = winFileS
14a80 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b  ize(id, &oldSz);
14a90 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
14aa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
14ac0 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28  int64 newSz = *(
14ad0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70  sqlite3_int64*)p
14ae0 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Arg;.          i
14af0 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29  f( newSz>oldSz )
14b00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69  {.            Si
14b10 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
14b20 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
14b30 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
14b40 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b  cate(id, newSz);
14b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d  .            Sim
14b60 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
14b70 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20  gn(0);.         
14b80 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
14b90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
14bb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14bc0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
14bd0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
14be0 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
14bf0 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
14c00 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49  e, WINFILE_PERSI
14c10 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41  ST_WAL, (int*)pA
14c20 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rg);.      retur
14c30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
14c40 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
14c50 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41  TE_FCNTL_POWERSA
14c60 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a  FE_OVERWRITE: {.
14c70 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74        winModeBit
14c80 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f  (pFile, WINFILE_
14c90 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67  PSOW, (int*)pArg
14ca0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14cb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
14cc0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
14cd0 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20  _FCNTL_VFSNAME: 
14ce0 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a  {.      *(char**
14cf0 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  )pArg = sqlite3_
14d00 6d 70 72 69 6e 74 66 28 22 77 69 6e 33 32 22 29  mprintf("win32")
14d10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
14d20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
14d30 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
14d40 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52  FCNTL_WIN32_AV_R
14d50 45 54 52 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ETRY: {.      in
14d60 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41 72  t *a = (int*)pAr
14d70 67 3b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 30  g;.      if( a[0
14d80 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ]>0 ){.        w
14d90 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20 3d  in32IoerrRetry =
14da0 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c   a[0];.      }el
14db0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 30 5d  se{.        a[0]
14dc0 20 3d 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74   = win32IoerrRet
14dd0 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ry;.      }.    
14de0 20 20 69 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a    if( a[1]>0 ){.
14df0 20 20 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65          win32Ioe
14e00 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 61  rrRetryDelay = a
14e10 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [1];.      }else
14e20 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d 20 3d  {.        a[1] =
14e30 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79   win32IoerrRetry
14e40 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20  Delay;.      }. 
14e50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
14e60 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
14e70 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
14e80 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a  TL_TEMPFILENAME:
14e90 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
14ea0 54 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 4d  TFile = sqlite3M
14eb0 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 46 69 6c 65  allocZero( pFile
14ec0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
14ed0 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  me );.      if( 
14ee0 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  zTFile ){.      
14ef0 20 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 70 46    getTempname(pF
14f00 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ile->pVfs->mxPat
14f10 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a  hname, zTFile);.
14f20 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
14f30 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a  )pArg = zTFile;.
14f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
14f50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14f60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
14f70 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
14f80 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ND;.}../*.** Ret
14f90 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73  urn the sector s
14fa0 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
14fb0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62  the underlying b
14fc0 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a  lock device for.
14fd0 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ** the specified
14fe0 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61   file. This is a
14ff0 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32  lmost always 512
15000 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20   bytes, but may 
15010 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72  be.** larger for
15020 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a   some devices..*
15030 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65  *.** SQLite code
15040 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75   assumes this fu
15050 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61  nction cannot fa
15060 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75  il. It also assu
15070 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74  mes that.** if t
15080 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  wo files are cre
15090 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ated in the same
150a0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72   file-system dir
150b0 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20  ectory (i.e..** 
150c0 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69  a database and i
150d0 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  ts journal file)
150e0 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72   that the sector
150f0 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68   size will be th
15100 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f  e.** same for bo
15110 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th..*/.static in
15120 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28  t winSectorSize(
15130 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
15140 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a 20  ){.  (void)id;. 
15150 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
15160 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
15170 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ZE;.}../*.** Ret
15180 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20  urn a vector of 
15190 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  device character
151a0 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69  istics..*/.stati
151b0 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43  c int winDeviceC
151c0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73  haracteristics(s
151d0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
151e0 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d  {.  winFile *p =
151f0 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
15200 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
15210 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45  OCAP_UNDELETABLE
15220 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20  _WHEN_OPEN |.   
15230 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72 6c 46        ((p->ctrlF
15240 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 50  lags & WINFILE_P
15250 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41  SOW)?SQLITE_IOCA
15260 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
15270 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 23 69 66  WRITE:0);.}..#if
15280 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15290 5f 57 41 4c 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e  _WAL../* .** Win
152a0 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c  dows will only l
152b0 65 74 20 79 6f 75 20 63 72 65 61 74 65 20 66 69  et you create fi
152c0 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73  le view mappings
152d0 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f  .** on allocatio
152e0 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69  n size granulari
152f0 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a  ty boundaries..*
15300 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33  * During sqlite3
15310 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f  _os_init() we do
15320 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   a GetSystemInfo
15330 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65  ().** to get the
15340 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a   granularity siz
15350 65 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e 46  e..*/.SYSTEM_INF
15360 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 2f  O winSysInfo;../
15370 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
15380 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
15390 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
153a0 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
153b0 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d   The.** global m
153c0 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20  utex is used to 
153d0 70 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c  protect the winL
153e0 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  ockInfo objects 
153f0 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68 69 73  used by .** this
15400 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68   file, all of wh
15410 69 63 68 20 6d 61 79 20 62 65 20 73 68 61 72 65  ich may be share
15420 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68  d by multiple th
15430 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e  reads..**.** Fun
15440 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65  ction winShmMute
15450 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
15460 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
15470 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
15480 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68  x .** is held wh
15490 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69  en required. Thi
154a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
154b0 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
154c0 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a 2a 20  of assert() .** 
154d0 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
154e0 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45  .**.**   winShmE
154f0 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20  nterMutex().**  
15500 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68     assert( winSh
15510 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  mMutexHeld() );.
15520 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  **   winShmLeave
15530 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69  Mutex().*/.stati
15540 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74  c void winShmEnt
15550 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
15560 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
15570 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
15580 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
15590 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
155a0 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  R));.}.static vo
155b0 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  id winShmLeaveMu
155c0 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
155d0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
155e0 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
155f0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
15600 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
15610 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
15620 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
15630 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  t winShmMutexHel
15640 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75  d(void) {.  retu
15650 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  rn sqlite3_mutex
15660 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74  _held(sqlite3Mut
15670 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
15680 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
15690 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ER));.}.#endif..
156a0 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65  /*.** Object use
156b0 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
156c0 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65   single file ope
156d0 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20  ned and mmapped 
156e0 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68  to provide.** sh
156f0 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68  ared memory.  Wh
15700 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  en multiple thre
15710 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  ads all referenc
15720 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f  e the same.** lo
15730 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20  g-summary, each 
15740 74 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f  thread has its o
15750 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63  wn winFile objec
15760 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a  t, but they all.
15770 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ** point to a si
15780 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66  ngle instance of
15790 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49   this object.  I
157a0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65  n other words, e
157b0 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ach.** log-summa
157c0 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c  ry is opened onl
157d0 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
157e0 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d  ss..**.** winShm
157f0 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
15800 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72   be true when cr
15810 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f  eating or destro
15820 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a  ying.** this obj
15830 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61  ect or while rea
15840 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
15850 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
15860 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  elds:.**.**     
15870 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e   nRef.**      pN
15880 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ext .**.** The f
15890 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
158a0 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66  are read-only af
158b0 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ter the object i
158c0 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a  s created:.** .*
158d0 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20  *      fid.**   
158e0 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a     zFilename.**.
158f0 2a 2a 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d  ** Either winShm
15900 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
15910 62 65 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68  be held or winSh
15920 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e  mNode.nRef==0 an
15930 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78  d.** winShmMutex
15940 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77  Held() is true w
15950 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77  hen reading or w
15960 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72  riting any other
15970 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69   field.** in thi
15980 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  s structure..**.
15990 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d  */.struct winShm
159a0 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  Node {.  sqlite3
159b0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
159c0 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20      /* Mutex to 
159d0 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65  access this obje
159e0 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ct */.  char *zF
159f0 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
15a00 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
15a10 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46  e file */.  winF
15a20 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20  ile hFile;      
15a30 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68         /* File h
15a40 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70  andle from winOp
15a50 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52  en */..  int szR
15a60 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
15a70 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
15a80 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
15a90 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ions */.  int nR
15aa0 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
15ab0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
15ac0 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a  array apRegion *
15ad0 2f 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52 65  /.  struct ShmRe
15ae0 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c  gion {.    HANDL
15af0 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20  E hMap;         
15b00 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
15b10 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69  le from CreateFi
15b20 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20  leMapping */.   
15b30 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d   void *pMap;.  }
15b40 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f   *aRegion;.  DWO
15b50 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
15b60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
15b70 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f  indows errno fro
15b80 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65  m the last I/O e
15b90 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  rror */..  int n
15ba0 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
15bb0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15bc0 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74  of winShm object
15bd0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
15be0 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  is */.  winShm *
15bf0 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
15c00 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d     /* All winShm
15c10 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
15c20 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77  g to this */.  w
15c30 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74  inShmNode *pNext
15c40 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  ;         /* Nex
15c50 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c  t in list of all
15c60 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
15c70 63 74 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  cts */.#ifdef SQ
15c80 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
15c90 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
15ca0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
15cb0 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d  available winShm
15cc0 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e  .id value */.#en
15cd0 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20  dif.};../*.** A 
15ce0 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20  global array of 
15cf0 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  all winShmNode o
15d00 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  bjects..**.** Th
15d10 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  e winShmMutexHel
15d20 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
15d30 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
15d40 72 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c  r writing this l
15d50 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77  ist..*/.static w
15d60 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68  inShmNode *winSh
15d70 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a  mNodeList = 0;..
15d80 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
15d90 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
15da0 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72  by this VFS to r
15db0 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20  ecord the state 
15dc0 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68  of an.** open sh
15dd0 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e  ared memory conn
15de0 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ection..**.** Th
15df0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
15e00 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ds are initializ
15e10 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a  ed when this obj
15e20 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61  ect is created a
15e30 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f  nd.** are read-o
15e40 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a  nly thereafter:.
15e50 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e  **.**    winShm.
15e60 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77  pShmNode.**    w
15e70 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41  inShm.id.**.** A
15e80 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  ll other fields 
15e90 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20  are read/write. 
15ea0 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d   The winShm.pShm
15eb0 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74  Node->mutex must
15ec0 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c   be held.** whil
15ed0 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20  e accessing any 
15ee0 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64  read/write field
15ef0 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  s..*/.struct win
15f00 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f  Shm {.  winShmNo
15f10 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20  de *pShmNode;   
15f20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
15f30 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ying winShmNode 
15f40 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53  object */.  winS
15f50 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  hm *pNext;      
15f60 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77         /* Next w
15f70 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20 73  inShm with the s
15f80 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ame winShmNode *
15f90 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b  /.  u8 hasMutex;
15fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15fb0 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e  * True if holdin
15fc0 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  g the winShmNode
15fd0 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20   mutex */.  u16 
15fe0 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20  sharedMask;     
15ff0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
16000 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
16010 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63  eld */.  u16 exc
16020 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  lMask;          
16030 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65      /* Mask of e
16040 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68  xclusive locks h
16050 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  eld */.#ifdef SQ
16060 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20  LITE_DEBUG.  u8 
16070 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
16080 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66          /* Id of
16090 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
160a0 20 77 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d   with its winShm
160b0 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  Node */.#endif.}
160c0 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e  ;../*.** Constan
160d0 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ts used for lock
160e0 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ing.*/.#define W
160f0 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28  IN_SHM_BASE   ((
16100 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  22+SQLITE_SHM_NL
16110 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f  OCK)*4)        /
16120 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74  * first lock byt
16130 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  e */.#define WIN
16140 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e  _SHM_DMS    (WIN
16150 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45  _SHM_BASE+SQLITE
16160 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20  _SHM_NLOCK)  /* 
16170 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a  deadman switch *
16180 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61  /../*.** Apply a
16190 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f  dvisory locks fo
161a0 72 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65  r all n bytes be
161b0 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e  ginning at ofst.
161c0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d  .*/.#define _SHM
161d0 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e  _UNLCK  1.#defin
161e0 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a  e _SHM_RDLCK  2.
161f0 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c  #define _SHM_WRL
16200 43 4b 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74  CK  3.static int
16210 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
16220 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  k(.  winShmNode 
16230 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70  *pFile,    /* Ap
16240 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69  ply locks to thi
16250 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65  s open shared-me
16260 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  mory segment */.
16270 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20    int lockType, 
16280 20 20 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f          /* _SHM_
16290 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43  UNLCK, _SHM_RDLC
162a0 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b  K, or _SHM_WRLCK
162b0 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
162c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
162d0 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62  ffset to first b
162e0 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  yte to be locked
162f0 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69  /unlocked */.  i
16300 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20  nt nByte        
16310 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16320 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
16330 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  or unlock */.){.
16340 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
16350 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
16360 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b  t code form Lock
16370 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20  /UnlockFileEx() 
16380 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20  */..  /* Access 
16390 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64  to the winShmNod
163a0 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69  e object is seri
163b0 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61  alized by the ca
163c0 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  ller */.  assert
163d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
163e0 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65  held(pFile->mute
163f0 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65  x) || pFile->nRe
16400 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  f==0 );..  /* Re
16410 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20 74 68  lease/Acquire th
16420 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
16430 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ock */.  if( loc
16440 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43  kType==_SHM_UNLC
16450 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  K ){.    rc = wi
16460 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
16470 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73  le->hFile.h, ofs
16480 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b  t, 0, nByte, 0);
16490 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
164a0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
164b0 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65  locking paramete
164c0 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20  rs */.    DWORD 
164d0 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49  dwFlags = LOCKFI
164e0 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
164f0 45 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63  ELY;.    if( loc
16500 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52  kType == _SHM_WR
16510 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d  LCK ) dwFlags |=
16520 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
16530 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63  IVE_LOCK;.    rc
16540 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
16550 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
16560 64 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30  dwFlags, ofst, 0
16570 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d  , nByte, 0);.  }
16580 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d 20 30  .  .  if( rc!= 0
16590 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
165a0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
165b0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
165c0 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61  Errno =  osGetLa
165d0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72  stError();.    r
165e0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
165f0 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
16600 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20 25 73  ("SHM-LOCK %d %s
16610 20 25 73 20 30 78 25 30 38 6c 78 5c 6e 22 2c 20   %s 0x%08lx\n", 
16620 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
16630 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20  e->hFile.h,.    
16640 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
16650 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
16660 61 69 6c 65 64 22 2c 0a 20 20 20 20 20 20 20 20  ailed",.        
16670 20 20 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48     lockType==_SH
16680 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e 6c 6f 63  M_UNLCK ? "Unloc
16690 6b 46 69 6c 65 45 78 22 20 3a 20 22 4c 6f 63 6b  kFileEx" : "Lock
166a0 46 69 6c 65 45 78 22 2c 0a 20 20 20 20 20 20 20  FileEx",.       
166b0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
166c0 72 72 6e 6f 29 29 3b 0a 0a 20 20 72 65 74 75 72  rrno));..  retur
166d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
166e0 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74  ard references t
166f0 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f  o VFS methods */
16700 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
16710 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  pen(sqlite3_vfs*
16720 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c  ,const char*,sql
16730 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69  ite3_file*,int,i
16740 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  nt*);.static int
16750 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69 74   winDelete(sqlit
16760 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63  e3_vfs *,const c
16770 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  har*,int);../*.*
16780 2a 20 50 75 72 67 65 20 74 68 65 20 77 69 6e 53  * Purge the winS
16790 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20  hmNodeList list 
167a0 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77  of all entries w
167b0 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e  ith winShmNode.n
167c0 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
167d0 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
167e0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
167f0 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
16800 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
16810 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
16820 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
16830 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
16840 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72 67   void winShmPurg
16850 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
16860 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65 46  Vfs, int deleteF
16870 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f  lag){.  winShmNo
16880 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68  de **pp;.  winSh
16890 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c  mNode *p;.  BOOL
168a0 20 62 52 63 3b 0a 20 20 61 73 73 65 72 74 28 20   bRc;.  assert( 
168b0 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
168c0 29 20 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e  ) );.  pp = &win
168d0 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77  ShmNodeList;.  w
168e0 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21  hile( (p = *pp)!
168f0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  =0 ){.    if( p-
16900 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
16910 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
16920 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 20 73 71  f( p->mutex ) sq
16930 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
16940 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  (p->mutex);.    
16950 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
16960 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20  nRegion; i++){. 
16970 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 55         bRc = osU
16980 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
16990 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61  ->aRegion[i].pMa
169a0 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  p);.        OSTR
169b0 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20  ACE(("SHM-PURGE 
169c0 70 69 64 2d 25 64 20 75 6e 6d 61 70 20 72 65 67  pid-%d unmap reg
169d0 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  ion=%d %s\n",.  
169e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
169f0 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74  int)osGetCurrent
16a00 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 0a  ProcessId(), i,.
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66   bRc ? "ok" : "f
16a30 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
16a40 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48    bRc = osCloseH
16a50 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e  andle(p->aRegion
16a60 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20  [i].hMap);.     
16a70 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d     OSTRACE(("SHM
16a80 2d 50 55 52 47 45 20 70 69 64 2d 25 64 20 63 6c  -PURGE pid-%d cl
16a90 6f 73 65 20 72 65 67 69 6f 6e 3d 25 64 20 25 73  ose region=%d %s
16aa0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16ab0 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74        (int)osGet
16ac0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
16ad0 28 29 2c 20 69 2c 0a 20 20 20 20 20 20 20 20 20  (), i,.         
16ae0 20 20 20 20 20 20 20 20 62 52 63 20 3f 20 22 6f          bRc ? "o
16af0 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
16b00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
16b10 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e  f( p->hFile.h!=N
16b20 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69 6c 65 2e  ULL && p->hFile.
16b30 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h!=INVALID_HANDL
16b40 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20  E_VALUE ){.     
16b50 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
16b60 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
16b70 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73       winClose((s
16b80 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
16b90 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  ->hFile);.      
16ba0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
16bb0 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
16bc0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65    }.      if( de
16bd0 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  leteFlag ){.    
16be0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
16bf0 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
16c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
16c10 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
16c20 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65 6c  ;.        winDel
16c30 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69  ete(pVfs, p->zFi
16c40 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  lename, 0);.    
16c50 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
16c60 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
16c70 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16c80 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
16c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
16ca0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
16cb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
16cc0 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20  (p->aRegion);.  
16cd0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
16ce0 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (p);.    }else{.
16cf0 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70        pp = &p->p
16d00 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
16d10 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
16d20 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
16d30 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20  area associated 
16d40 77 69 74 68 20 64 61 74 61 62 61 73 65 20 66 69  with database fi
16d50 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20  le pDbFd..**.** 
16d60 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e  When opening a n
16d70 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ew shared-memory
16d80 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68   file, if no oth
16d90 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  er instances of 
16da0 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65  that.** file are
16db0 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c   currently open,
16dc0 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
16dd0 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f   or in other pro
16de0 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20  cesses, then.** 
16df0 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65  the file must be
16e00 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
16e10 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76  ro length or hav
16e20 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65  e its header cle
16e30 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
16e40 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72 65  int winOpenShare
16e50 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20  dMemory(winFile 
16e60 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63  *pDbFd){.  struc
16e70 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20  t winShm *p;    
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16e90 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
16ea0 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
16eb0 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e    struct winShmN
16ec0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
16ed0 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  0;   /* The unde
16ee0 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
16ef0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ile */.  int rc;
16f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16f20 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
16f30 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
16f40 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  e *pNew;        
16f50 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
16f60 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65  cated winShmNode
16f70 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
16fa0 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74   of zName in byt
16fb0 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
16fc0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
16fd0 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65  );    /* Not pre
16fe0 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a  viously opened *
16ff0 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
17000 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
17010 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f  ew sqlite3_shm o
17020 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65  bject.  Also spe
17030 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20  culatively.  ** 
17040 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
17050 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e  or a new winShmN
17060 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65  ode and filename
17070 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
17080 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
17090 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
170a0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
170b0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
170c0 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20  OMEM;.  nName = 
170d0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
170e0 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
170f0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d   pNew = sqlite3M
17100 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
17110 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
17120 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69  Name + 17 );.  i
17130 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
17140 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17150 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
17160 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
17170 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46  ;.  }.  pNew->zF
17180 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
17190 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c  )&pNew[1];.  sql
171a0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e  ite3_snprintf(nN
171b0 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46  ame+15, pNew->zF
171c0 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d  ilename, "%s-shm
171d0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
171e0 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53  ;.  sqlite3FileS
171f0 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50  uffix3(pDbFd->zP
17200 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  ath, pNew->zFile
17210 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c 6f  name); ..  /* Lo
17220 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ok to see if the
17230 72 65 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e  re is an existin
17240 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61  g winShmNode tha
17250 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20  t can be used.. 
17260 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69   ** If no matchi
17270 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75  ng winShmNode cu
17280 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20  rrently exists, 
17290 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  create a new one
172a0 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45  ..  */.  winShmE
172b0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66  nterMutex();.  f
172c0 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69  or(pShmNode = wi
172d0 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53  nShmNodeList; pS
172e0 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65  hmNode; pShmNode
172f0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74  =pShmNode->pNext
17300 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65  ){.    /* TBD ne
17310 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69  ed to come up wi
17320 74 68 20 62 65 74 74 65 72 20 6d 61 74 63 68 20  th better match 
17330 68 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20  here.  Perhaps. 
17340 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49     ** use FILE_I
17350 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20  D_BOTH_DIR_INFO 
17360 53 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a  Structure..    *
17370 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
17380 33 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64  3StrICmp(pShmNod
17390 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e  e->zFilename, pN
173a0 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d  ew->zFilename)==
173b0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  0 ) break;.  }. 
173c0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b   if( pShmNode ){
173d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
173e0 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65  e(pNew);.  }else
173f0 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d  {.    pShmNode =
17400 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20   pNew;.    pNew 
17410 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69  = 0;.    ((winFi
17420 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e  le*)(&pShmNode->
17430 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56  hFile))->h = INV
17440 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
17450 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  E;.    pShmNode-
17460 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e  >pNext = winShmN
17470 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e  odeList;.    win
17480 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53  ShmNodeList = pS
17490 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68  hmNode;..    pSh
174a0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73  mNode->mutex = s
174b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
174c0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
174d0 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70  FAST);.    if( p
174e0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d  ShmNode->mutex==
174f0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
17500 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
17510 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
17520 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
17530 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   }..    rc = win
17540 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73  Open(pDbFd->pVfs
17550 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17560 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69     pShmNode->zFi
17570 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  lename,         
17580 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
17590 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20  he file (UTF-8) 
175a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
175b0 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c      (sqlite3_fil
175c0 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  e*)&pShmNode->hF
175d0 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61  ile,  /* File ha
175e0 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 20  ndle here */.   
175f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
17600 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20  LITE_OPEN_WAL | 
17610 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
17620 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
17630 50 45 4e 5f 43 52 45 41 54 45 2c 0a 20 20 20 20  PEN_CREATE,.    
17640 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
17650 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
17660 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
17670 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
17680 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  r;.    }..    /*
17690 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
176a0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
176b0 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
176c0 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e  dead-man switch.
176d0 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20  .    ** If not, 
176e0 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
176f0 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
17700 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
17710 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  ( winShmSystemLo
17720 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
17730 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_WRLCK, WIN_SHM
17740 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
17750 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
17760 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
17770 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
17780 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
17790 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
177a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
177b0 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
177c0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
177d0 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73  OERR_SHMOPEN, os
177e0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
177f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17800 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70   "winOpenShm", p
17810 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
17820 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
17830 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17840 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68  K ){.      winSh
17850 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
17860 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
17870 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
17880 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
17890 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
178a0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44  ShmNode, _SHM_RD
178b0 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
178c0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
178d0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
178e0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a  m_open_err;.  }.
178f0 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e  .  /* Make the n
17900 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20  ew connection a 
17910 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e  child of the win
17920 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e  ShmNode */.  p->
17930 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
17940 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ode;.#ifdef SQLI
17950 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64  TE_DEBUG.  p->id
17960 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
17970 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
17980 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
17990 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
179a0 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d  hm = p;.  winShm
179b0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
179c0 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63   /* The referenc
179d0 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e  e count on pShmN
179e0 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ode has already 
179f0 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64  been incremented
17a00 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20   under.  ** the 
17a10 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e  cover of the win
17a20 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20  ShmEnterMutex() 
17a30 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
17a40 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
17a50 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
17a60 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  winShm) object t
17a70 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
17a80 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
17a90 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
17aa0 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
17ab0 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
17ac0 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
17ad0 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
17ae0 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
17af0 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
17b00 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
17b10 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
17b20 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
17b30 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
17b40 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
17b50 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
17b60 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
17b70 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
17b80 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
17b90 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
17ba0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
17bb0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
17bc0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
17bd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
17be0 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
17bf0 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
17c00 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53  open_err:.  winS
17c10 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
17c20 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
17c30 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
17c40 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67  1);.  winShmPurg
17c50 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30  e(pDbFd->pVfs, 0
17c60 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  );      /* This 
17c70 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
17c80 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
17c90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
17ca0 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e(p);.  sqlite3_
17cb0 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69  free(pNew);.  wi
17cc0 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
17cd0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17ce0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
17cf0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68  connection to sh
17d00 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65  ared-memory.  De
17d10 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
17d20 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20  ing .** storage 
17d30 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73  if deleteFlag is
17d40 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
17d50 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70   int winShmUnmap
17d60 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
17d70 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
17d80 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
17d90 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
17da0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65   */.  int delete
17db0 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
17dc0 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72   /* Delete after
17dd0 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65   closing if true
17de0 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
17df0 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f   *pDbFd;       /
17e00 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
17e10 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
17e20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b   */.  winShm *p;
17e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17e40 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
17e50 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
17e60 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
17e70 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64  Node; /* The und
17e80 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
17e90 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
17ea0 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  winShm **pp;    
17eb0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
17ec0 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
17ed0 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
17ee0 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e  ..  pDbFd = (win
17ef0 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
17f00 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
17f10 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
17f20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
17f30 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
17f40 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  Node;..  /* Remo
17f50 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
17f60 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
17f70 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
17f80 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
17f90 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
17fa0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
17fb0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
17fc0 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
17fd0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
17fe0 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
17ff0 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
18000 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
18010 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
18020 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
18030 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
18040 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
18050 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
18060 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
18070 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
18080 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
18090 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
180a0 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
180b0 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
180c0 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
180d0 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
180e0 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
180f0 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
18100 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e   pShmNode->nRef>
18110 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  0 );.  pShmNode-
18120 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
18130 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
18140 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75   ){.    winShmPu
18150 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
18160 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20   deleteFlag);.  
18170 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  }.  winShmLeaveM
18180 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
18190 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
181a0 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
181b0 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20   lock state for 
181c0 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
181d0 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  segment..*/.stat
181e0 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63  ic int winShmLoc
181f0 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
18200 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
18210 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
18220 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
18230 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
18240 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
18250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
18260 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
18270 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
18280 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
18290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
182a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
182b0 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
182c0 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
182d0 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
182e0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
182f0 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
18300 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ock */.){.  winF
18310 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
18320 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  nFile*)fd;      
18330 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
18340 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
18350 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68  emory */.  winSh
18360 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
18370 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
18380 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
18390 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
183a0 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ed */.  winShm *
183b0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
183c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
183d0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
183e0 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
183f0 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
18400 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
18410 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
18420 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
18430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18440 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
18450 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
18460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
18480 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
18490 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
184a0 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ..  assert( ofst
184b0 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
184c0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
184d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
184e0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
184f0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
18500 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
18510 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
18520 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
18530 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
18540 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
18550 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
18560 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
18570 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
18580 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
18590 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
185a0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
185b0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
185c0 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
185d0 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
185e0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
185f0 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
18600 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
18610 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b  u16)((1U<<(ofst+
18620 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29  n)) - (1U<<ofst)
18630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
18640 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
18650 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
18660 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
18670 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
18680 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
18690 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
186a0 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
186b0 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
186c0 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
186d0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
186e0 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
186f0 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
18700 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
18710 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
18720 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
18730 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
18740 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
18750 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
18760 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
18770 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
18780 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
18790 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
187a0 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
187b0 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
187c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
187d0 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
187e0 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
187f0 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
18800 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
18810 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
18820 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
18830 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73   _SHM_UNLCK, ofs
18840 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
18850 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
18860 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18870 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  _OK;.    }..    
18880 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
18890 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
188a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
188b0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63   ){.      p->exc
188c0 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
188d0 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
188e0 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
188f0 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28    } .  }else if(
18900 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
18910 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  SHM_SHARED ){.  
18920 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20    u16 allShared 
18930 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  = 0;  /* Union o
18940 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
18950 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
18960 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
18970 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77     /* Find out w
18980 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b  hich shared lock
18990 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65  s are already he
189a0 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f  ld by sibling co
189b0 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  nnections..    *
189c0 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  * If any sibling
189d0 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
189e0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
189f0 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72  , go ahead and r
18a00 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  eturn.    ** SQL
18a10 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f  ITE_BUSY..    */
18a20 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
18a30 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
18a40 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
18a50 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
18a60 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
18a70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
18a80 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
18a90 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
18aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c        }.      al
18ab0 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73  lShared |= pX->s
18ac0 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
18ad0 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61  ..    /* Get sha
18ae0 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  red locks at the
18af0 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69   system level, i
18b00 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
18b10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18b20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
18b30 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d  ( (allShared & m
18b40 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
18b50 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
18b60 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
18b70 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f  e, _SHM_RDLCK, o
18b80 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
18b90 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , n);.      }els
18ba0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
18bb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
18bc0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
18bd0 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73   Get the local s
18be0 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
18bf0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18c00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
18c10 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
18c20 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
18c30 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  se{.    /* Make 
18c40 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20  sure no sibling 
18c50 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64  connections hold
18c60 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c   locks that will
18c70 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20   block this.    
18c80 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79  ** lock.  If any
18c90 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49   do, return SQLI
18ca0 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77  TE_BUSY right aw
18cb0 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ay..    */.    f
18cc0 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
18cd0 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
18ce0 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
18cf0 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
18d00 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c  sk & mask)!=0 ||
18d10 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b   (pX->sharedMask
18d20 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
18d30 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
18d40 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
18d50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
18d60 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
18d70 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
18d80 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
18d90 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
18da0 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
18db0 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
18dc0 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
18dd0 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
18de0 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
18df0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18e00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
18e10 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
18e20 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
18e30 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_WRLCK, ofst+W
18e40 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
18e50 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
18e60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18e70 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
18e80 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
18e90 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k)==0 );.       
18ea0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20   p->exclMask |= 
18eb0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mask;.      }.  
18ec0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
18ed0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
18ee0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
18ef0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
18f00 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70  LOCK shmid-%d, p
18f10 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25  id-%d got %03x,%
18f20 30 33 78 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  03x %s\n",.     
18f30 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 28 69 6e        p->id, (in
18f40 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  t)osGetCurrentPr
18f50 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 73 68  ocessId(), p->sh
18f60 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
18f70 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20  lMask,.         
18f80 20 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20    rc ? "failed" 
18f90 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75  : "ok"));.  retu
18fa0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18fb0 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  Implement a memo
18fc0 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65  ry barrier or me
18fd0 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68  mory fence on sh
18fe0 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a  ared memory.  .*
18ff0 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61  *.** All loads a
19000 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20  nd stores begun 
19010 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69  before the barri
19020 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  er must complete
19030 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c   before.** any l
19040 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67  oad or store beg
19050 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72  un after the bar
19060 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
19070 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69  void winShmBarri
19080 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er(.  sqlite3_fi
19090 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20  le *fd          
190a0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
190b0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
190c0 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
190d0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
190e0 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42  d);.  /* MemoryB
190f0 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65  arrier(); // doe
19100 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f  s not work -- do
19110 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f   not know why no
19120 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  t */.  winShmEnt
19130 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69 6e  erMutex();.  win
19140 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
19150 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
19160 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
19170 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f  d to obtain a po
19180 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20  inter to region 
19190 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a  iRegion of the .
191a0 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
191b0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
191c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
191d0 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
191e0 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a  mory regions .**
191f0 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
19200 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
19210 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
19220 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
19230 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65  zRegion .** byte
19240 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
19250 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
19260 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
19270 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
19280 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f  nd *pp is set to
19290 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68   NULL..**.** Oth
192a0 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69  erwise, if the i
192b0 73 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72  sWrite parameter
192c0 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65   is 0 and the re
192d0 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
192e0 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20  emory.** region 
192f0 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c  has not been all
19300 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63  ocated (by any c
19310 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67  lient, including
19320 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20   one running in 
19330 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72  a.** separate pr
19340 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70  ocess), then *pp
19350 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   is set to NULL 
19360 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
19370 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69  turned. If .** i
19380 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
19390 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65  ro and the reque
193a0 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
193b0 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ry region has no
193c0 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61  t yet .** been a
193d0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
193e0 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
193f0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
19400 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
19410 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
19420 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
19430 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
19440 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
19450 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
19460 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
19470 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
19480 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
19490 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  es .** address s
194a0 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
194b0 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
194c0 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
194d0 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a   to the mapped .
194e0 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
194f0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
19500 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19510 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  winShmMap(.  sql
19520 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
19530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19540 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
19550 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
19560 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
19570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19580 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
19590 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
195a0 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
195b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
195c0 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
195d0 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65  */.  int isWrite
195e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
195f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
19600 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
19610 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
19620 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
19630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19640 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
19650 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ory */.){.  winF
19660 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
19670 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e  nFile*)fd;.  win
19680 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
19690 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  pShm;.  winShmNo
196a0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
196b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
196c0 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29 7b  OK;..  if( !p ){
196d0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
196e0 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44  nSharedMemory(pD
196f0 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  bFd);.    if( rc
19700 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
19710 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d  turn rc;.    p =
19720 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
19730 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  }.  pShmNode = p
19740 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73  ->pShmNode;..  s
19750 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
19760 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
19770 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
19780 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
19790 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
197a0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
197b0 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
197c0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
197d0 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
197e0 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
197f0 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20   *apNew;        
19800 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f     /* New aRegio
19810 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
19820 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
19830 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
19840 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
19850 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
19860 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
19870 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20  _int64 sz;      
19880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
19890 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77  urrent size of w
198a0 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f  al-index file */
198b0 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
198c0 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
198d0 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ion;..    /* The
198e0 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
198f0 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
19900 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
19910 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
19920 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  e..    ** Check 
19930 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
19940 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
19950 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
19960 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
19970 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
19980 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
19990 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
199a0 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  on)..    */.    
199b0 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
199c0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
199d0 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
199e0 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28  e, &sz);.    if(
199f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19a00 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
19a10 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
19a20 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
19a30 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
19a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19a50 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44  "winShmMap1", pD
19a60 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
19a70 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
19a80 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
19a90 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a  if( sz<nByte ){.
19aa0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
19ab0 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
19ac0 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78  gion does not ex
19ad0 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20  ist. If isWrite 
19ae0 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20  is set to.      
19af0 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61  ** zero, exit ea
19b00 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
19b10 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
19b20 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
19b30 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ned..      **.  
19b40 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69      ** Alternati
19b50 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65  vely, if isWrite
19b60 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73   is non-zero, us
19b70 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f  e ftruncate() to
19b80 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20   allocate.      
19b90 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
19ba0 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a   memory region..
19bb0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
19bc0 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f  f( !isWrite ) go
19bd0 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
19be0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
19bf0 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
19c00 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
19c10 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b  ->hFile, nByte);
19c20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
19c30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19c40 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
19c50 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
19c60 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74  R_SHMSIZE, osGet
19c70 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
19c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
19c90 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46  inShmMap2", pDbF
19ca0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
19cb0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
19cc0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
19cd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
19ce0 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
19cf0 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
19d00 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
19d10 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
19d20 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74  .    apNew = (st
19d30 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
19d40 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
19d50 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  (.        pShmNo
19d60 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52  de->aRegion, (iR
19d70 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28  egion+1)*sizeof(
19d80 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b  apNew[0]).    );
19d90 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
19da0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
19db0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
19dc0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
19dd0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
19de0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
19df0 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a  egion = apNew;..
19e00 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e      while( pShmN
19e10 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
19e20 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48  egion ){.      H
19e30 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c  ANDLE hMap = NUL
19e40 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69  L;         /* fi
19e50 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c  le-mapping handl
19e60 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20  e */.      void 
19e70 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20  *pMap = 0;      
19e80 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64         /* Mapped
19e90 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a   memory region *
19ea0 2f 0a 20 20 20 20 20 0a 23 69 66 20 53 51 4c 49  /.     .#if SQLI
19eb0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
19ec0 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74    hMap = osCreat
19ed0 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
19ee0 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  App(pShmNode->hF
19ef0 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20  ile.h,.         
19f00 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44   NULL, PAGE_READ
19f10 57 52 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55  WRITE, nByte, NU
19f20 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69  LL.      );.#eli
19f30 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
19f40 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
19f50 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73  .      hMap = os
19f60 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
19f70 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  gW(pShmNode->hFi
19f80 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20  le.h, .         
19f90 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44   NULL, PAGE_READ
19fa0 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c  WRITE, 0, nByte,
19fb0 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23   NULL.      );.#
19fc0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
19fd0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
19fe0 53 49 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d  SI).      hMap =
19ff0 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
1a000 70 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e  pingA(pShmNode->
1a010 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20  hFile.h, .      
1a020 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52      NULL, PAGE_R
1a030 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79  EADWRITE, 0, nBy
1a040 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29  te, NULL.      )
1a050 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f  ;.#endif.      O
1a060 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
1a070 20 70 69 64 2d 25 64 20 63 72 65 61 74 65 20 72   pid-%d create r
1a080 65 67 69 6f 6e 3d 25 64 20 6e 62 79 74 65 3d 25  egion=%d nbyte=%
1a090 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
1a0a0 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47          (int)osG
1a0b0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1a0c0 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Id(), pShmNode->
1a0d0 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a  nRegion, nByte,.
1a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
1a0f0 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  Map ? "ok" : "fa
1a100 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69  iled"));.      i
1a110 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20  f( hMap ){.     
1a120 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
1a130 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1a140 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20  on*szRegion;.   
1a150 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74       int iOffset
1a160 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20  Shift = iOffset 
1a170 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  % winSysInfo.dwA
1a180 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
1a190 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45  rity;.#if SQLITE
1a1a0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
1a1b0 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69    pMap = osMapVi
1a1c0 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28  ewOfFileFromApp(
1a1d0 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57  hMap, FILE_MAP_W
1a1e0 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f  RITE | FILE_MAP_
1a1f0 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20  READ,.          
1a200 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66    iOffset - iOff
1a210 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69  setShift, szRegi
1a220 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66  on + iOffsetShif
1a230 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c  t.        );.#el
1a240 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20  se.        pMap 
1a250 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
1a260 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50  e(hMap, FILE_MAP
1a270 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41  _WRITE | FILE_MA
1a280 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20  P_READ,.        
1a290 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d      0, iOffset -
1a2a0 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73   iOffsetShift, s
1a2b0 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65  zRegion + iOffse
1a2c0 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29  tShift.        )
1a2d0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
1a2e0 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d   OSTRACE(("SHM-M
1a2f0 41 50 20 70 69 64 2d 25 64 20 6d 61 70 20 72 65  AP pid-%d map re
1a300 67 69 6f 6e 3d 25 64 20 6f 66 66 73 65 74 3d 25  gion=%d offset=%
1a310 64 20 73 69 7a 65 3d 25 64 20 25 73 5c 6e 22 2c  d size=%d %s\n",
1a320 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a330 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72    (int)osGetCurr
1a340 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1a350 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1a360 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20  n, iOffset,.    
1a370 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 52               szR
1a380 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f  egion, pMap ? "o
1a390 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
1a3a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a3b0 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20  f( !pMap ){.    
1a3c0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61      pShmNode->la
1a3d0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1a3e0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1a3f0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1a400 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1a410 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f  R_SHMMAP, pShmNo
1a420 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  de->lastErrno,. 
1a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a440 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70 44  "winShmMap3", pD
1a450 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  bFd->zPath);.   
1a460 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29 20       if( hMap ) 
1a470 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d  osCloseHandle(hM
1a480 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ap);.        got
1a490 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1a4a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 53       }..      pS
1a4b0 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
1a4c0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1a4d0 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a  n].pMap = pMap;.
1a4e0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1a4f0 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  aRegion[pShmNode
1a500 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20  ->nRegion].hMap 
1a510 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70 53  = hMap;.      pS
1a520 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b  hmNode->nRegion+
1a530 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68  +;.    }.  }..sh
1a540 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  mpage_out:.  if(
1a550 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1a560 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  on>iRegion ){.  
1a570 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20    int iOffset = 
1a580 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e  iRegion*szRegion
1a590 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65  ;.    int iOffse
1a5a0 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74  tShift = iOffset
1a5b0 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77   % winSysInfo.dw
1a5c0 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c  AllocationGranul
1a5d0 61 72 69 74 79 3b 0a 20 20 20 20 63 68 61 72 20  arity;.    char 
1a5e0 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53 68  *p = (char *)pSh
1a5f0 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69  mNode->aRegion[i
1a600 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20  Region].pMap;.  
1a610 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a 29    *pp = (void *)
1a620 26 70 5b 69 4f 66 66 73 65 74 53 68 69 66 74 5d  &p[iOffsetShift]
1a630 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
1a640 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  pp = 0;.  }.  sq
1a650 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1a660 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
1a670 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
1a680 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  .}..#else.# defi
1a690 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20 20 20 20  ne winShmMap    
1a6a0 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
1a6b0 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65  hmLock    0.# de
1a6c0 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72 69  fine winShmBarri
1a6d0 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69  er 0.# define wi
1a6e0 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65  nShmUnmap   0.#e
1a6f0 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20  ndif /* #ifndef 
1a700 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20  SQLITE_OMIT_WAL 
1a710 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  */../*.** Argume
1a720 6e 74 73 20 78 20 61 6e 64 20 79 20 61 72 65 20  nts x and y are 
1a730 62 6f 74 68 20 69 6e 74 65 67 65 72 73 2e 20 41  both integers. A
1a740 72 67 75 6d 65 6e 74 20 79 20 6d 75 73 74 20 62  rgument y must b
1a750 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 2e 0a  e a power of 2..
1a760 2a 2a 20 52 6f 75 6e 64 20 78 20 75 70 20 74 6f  ** Round x up to
1a770 20 74 68 65 20 6e 65 61 72 65 73 74 20 69 6e 74   the nearest int
1a780 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66  eger multiple of
1a790 20 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a   y. For example:
1a7a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 4f 55 4e 44  .**.**     ROUND
1a7b0 55 50 28 30 2c 20 20 38 29 20 2d 3e 20 20 30 0a  UP(0,  8) ->  0.
1a7c0 2a 2a 20 20 20 20 20 52 4f 55 4e 44 55 50 28 31  **     ROUNDUP(1
1a7d0 33 2c 20 38 29 20 2d 3e 20 31 36 0a 2a 2a 20 20  3, 8) -> 16.**  
1a7e0 20 20 20 52 4f 55 4e 44 55 50 28 33 32 2c 20 38     ROUNDUP(32, 8
1a7f0 29 20 2d 3e 20 33 32 0a 2a 2f 0a 23 64 65 66 69  ) -> 32.*/.#defi
1a800 6e 65 20 52 4f 55 4e 44 55 50 28 78 2c 79 29 20  ne ROUNDUP(x,y) 
1a810 20 20 20 20 28 28 28 78 29 2b 79 2d 31 29 26 7e      (((x)+y-1)&~
1a820 28 79 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 43 6c  (y-1))../*.** Cl
1a830 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61 70 70  eans up the mapp
1a840 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74 68 65  ed region of the
1a850 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c   specified file,
1a860 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74   if any..*/.stat
1a870 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 28  ic int winUnmap(
1a880 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1a890 2a 69 64 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  *id.){.  winFile
1a8a0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
1a8b0 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74  le*)id;.  assert
1a8c0 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
1a8d0 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  if( pFile->pMapR
1a8e0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28  egion ){.    if(
1a8f0 20 21 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46   !osUnmapViewOfF
1a900 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52  ile(pFile->pMapR
1a910 65 67 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20  egion) ){.      
1a920 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1a930 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1a940 72 28 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r();.      retur
1a950 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
1a960 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 52 45 4d 41  LITE_IOERR_MREMA
1a970 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
1a980 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1a9a0 69 6e 55 6e 6d 61 70 31 22 2c 20 70 46 69 6c 65  inUnmap1", pFile
1a9b0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
1a9c0 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52      pFile->pMapR
1a9d0 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70  egion = 0;.    p
1a9e0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
1a9f0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46   0;.  }.  if( pF
1aa00 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20  ile->hMap!=NULL 
1aa10 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 43 6c  ){.    if( !osCl
1aa20 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
1aa30 3e 68 4d 61 70 29 20 29 7b 0a 20 20 20 20 20 20  >hMap) ){.      
1aa40 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1aa50 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1aa60 72 28 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r();.      retur
1aa70 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
1aa80 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 52 45 4d 41  LITE_IOERR_MREMA
1aa90 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
1aaa0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1aac0 69 6e 55 6e 6d 61 70 32 22 2c 20 70 46 69 6c 65  inUnmap2", pFile
1aad0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
1aae0 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20      pFile->hMap 
1aaf0 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65  = NULL;.  }.  re
1ab00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ab10 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 70 2c 20 72 65  }../*.** Map, re
1ab20 6d 61 70 20 6f 72 20 75 6e 6d 61 70 20 70 61 72  map or unmap par
1ab30 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1ab40 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
1ab50 63 20 69 6e 74 20 77 69 6e 4d 72 65 6d 61 70 28  c int winMremap(
1ab60 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1ab70 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *id,            
1ab80 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74 61 62     /* Main datab
1ab90 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
1aba0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1abc0 20 4d 61 73 6b 20 6f 66 20 53 51 4c 49 54 45 5f   Mask of SQLITE_
1abd0 4d 52 45 4d 41 50 5f 58 58 58 20 66 6c 61 67 73  MREMAP_XXX flags
1abe0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1abf0 74 36 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20  t64 iOff,       
1ac00 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1ac10 74 6f 20 73 74 61 72 74 20 6d 61 70 70 69 6e 67  to start mapping
1ac20 20 61 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   at */.  sqlite3
1ac30 5f 69 6e 74 36 34 20 6e 4f 6c 64 2c 20 20 20 20  _int64 nOld,    
1ac40 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1ac50 20 6f 66 20 6f 6c 64 20 6d 61 70 70 69 6e 67 2c   of old mapping,
1ac60 20 6f 72 20 7a 65 72 6f 20 2a 2f 0a 20 20 73 71   or zero */.  sq
1ac70 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4e 65 77  lite3_int64 nNew
1ac80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1ac90 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 6d 61 70   Size of new map
1aca0 70 69 6e 67 2c 20 6f 72 20 7a 65 72 6f 20 2a 2f  ping, or zero */
1acb0 0a 20 20 76 6f 69 64 20 2a 2a 70 70 4d 61 70 20  .  void **ppMap 
1acc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acd0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 4f 6c     /* IN/OUT: Ol
1ace0 64 2f 6e 65 77 20 6d 61 70 70 69 6e 67 73 20 2a  d/new mappings *
1acf0 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
1ad00 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
1ad10 2a 29 69 64 3b 20 20 2f 2a 20 54 68 65 20 75 6e  *)id;  /* The un
1ad20 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
1ad30 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
1ad40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1ad50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1ad60 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1ad70 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55  HANDLE hMap = NU
1ad80 4c 4c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  LL;             
1ad90 2f 2a 20 4e 65 77 20 6d 61 70 70 69 6e 67 20 68  /* New mapping h
1ada0 61 6e 64 6c 65 20 2a 2f 0a 20 20 76 6f 69 64 20  andle */.  void 
1adb0 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20  *pNew = 0;      
1adc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1add0 77 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69  w mapping */.  i
1ade0 36 34 20 6e 4e 65 77 52 6e 64 3b 20 20 20 20 20  64 nNewRnd;     
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ae00 2a 20 6e 4e 65 77 20 72 6f 75 6e 64 65 64 20 75  * nNew rounded u
1ae10 70 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 6c 64 52  p */.  i64 nOldR
1ae20 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
1ae30 20 20 20 20 20 20 20 2f 2a 20 6e 4f 6c 64 20 72         /* nOld r
1ae40 6f 75 6e 64 65 64 20 75 70 20 2a 2f 0a 0a 20 20  ounded up */..  
1ae50 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
1ae60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 4f   );.  assert( iO
1ae70 66 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ff==0 );.  asser
1ae80 74 28 20 6e 4f 6c 64 3e 3d 30 20 29 3b 0a 20 20  t( nOld>=0 );.  
1ae90 61 73 73 65 72 74 28 20 6e 4f 6c 64 3d 3d 30 20  assert( nOld==0 
1aea0 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  || pFile->pMapRe
1aeb0 67 69 6f 6e 3d 3d 28 2a 70 70 4d 61 70 29 20 29  gion==(*ppMap) )
1aec0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
1aed0 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
1aee0 20 70 70 4d 61 70 20 29 3b 0a 20 20 61 73 73 65   ppMap );.  asse
1aef0 72 74 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 3d  rt( pFile->hMap=
1af00 3d 4e 55 4c 4c 20 7c 7c 20 70 46 69 6c 65 2d 3e  =NULL || pFile->
1af10 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 28 2a 70 70  pMapRegion==(*pp
1af20 4d 61 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Map) );.  assert
1af30 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  ( pFile->pMapReg
1af40 69 6f 6e 3d 3d 30 20 7c 7c 20 70 46 69 6c 65 2d  ion==0 || pFile-
1af50 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 28 2a 70  >pMapRegion==(*p
1af60 70 4d 61 70 29 20 29 3b 0a 20 20 2f 2a 20 61 73  pMap) );.  /* as
1af70 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6d 6d 61  sert( pFile->mma
1af80 70 53 69 7a 65 3d 3d 6e 4f 6c 64 20 29 3b 20 2a  pSize==nOld ); *
1af90 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  /..  assert( win
1afa0 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69  SysInfo.dwPageSi
1afb0 7a 65 3e 30 20 29 3b 0a 20 20 6e 4e 65 77 52 6e  ze>0 );.  nNewRn
1afc0 64 20 3d 20 52 4f 55 4e 44 55 50 28 6e 4e 65 77  d = ROUNDUP(nNew
1afd0 2c 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50  , winSysInfo.dwP
1afe0 61 67 65 53 69 7a 65 2a 31 29 3b 0a 20 20 61 73  ageSize*1);.  as
1aff0 73 65 72 74 28 20 6e 4e 65 77 52 6e 64 3e 3d 30  sert( nNewRnd>=0
1b000 20 29 3b 0a 20 20 6e 4f 6c 64 52 6e 64 20 3d 20   );.  nOldRnd = 
1b010 52 4f 55 4e 44 55 50 28 6e 4f 6c 64 2c 20 77 69  ROUNDUP(nOld, wi
1b020 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53  nSysInfo.dwPageS
1b030 69 7a 65 2a 31 29 3b 0a 20 20 61 73 73 65 72 74  ize*1);.  assert
1b040 28 20 6e 4f 6c 64 52 6e 64 3e 3d 30 20 29 3b 0a  ( nOldRnd>=0 );.
1b050 0a 20 20 69 66 28 20 6e 4e 65 77 52 6e 64 3d 3d  .  if( nNewRnd==
1b060 6e 4f 6c 64 52 6e 64 20 29 7b 0a 20 20 20 20 70  nOldRnd ){.    p
1b070 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
1b080 20 6e 4e 65 77 3b 0a 20 20 20 20 72 65 74 75 72   nNew;.    retur
1b090 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1b0a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53 51  ..  /* If the SQ
1b0b0 4c 49 54 45 5f 4d 52 45 4d 41 50 5f 45 58 54 45  LITE_MREMAP_EXTE
1b0c0 4e 44 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ND flag is set, 
1b0d0 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  then the size of
1b0e0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
1b0f0 20 2a 2a 20 6d 61 70 70 69 6e 67 20 28 6e 4e 65   ** mapping (nNe
1b100 77 20 62 79 74 65 73 29 20 6d 61 79 20 62 65 20  w bytes) may be 
1b110 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1b120 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1b130 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2a  abase file..  **
1b140 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1b150 63 61 73 65 2c 20 65 78 74 65 6e 64 20 74 68 65  case, extend the
1b160 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 75 73   file on disk us
1b170 69 6e 67 20 66 74 72 75 6e 63 61 74 65 28 29 2e  ing ftruncate().
1b180 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e    */.  assert( n
1b190 4e 65 77 52 6e 64 3e 30 20 7c 7c 20 28 66 6c 61  NewRnd>0 || (fla
1b1a0 67 73 20 26 20 53 51 4c 49 54 45 5f 4d 52 45 4d  gs & SQLITE_MREM
1b1b0 41 50 5f 45 58 54 45 4e 44 29 3d 3d 30 20 29 3b  AP_EXTEND)==0 );
1b1c0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
1b1d0 51 4c 49 54 45 5f 4d 52 45 4d 41 50 5f 45 58 54  QLITE_MREMAP_EXT
1b1e0 45 4e 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  END ){.    sqlit
1b1f0 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a  e3_int64 oldSz;.
1b200 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65      rc = winFile
1b210 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29  Size(id, &oldSz)
1b220 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1b230 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4e 65 77 52  LITE_OK && nNewR
1b240 6e 64 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20  nd>oldSz ){.    
1b250 20 20 72 63 20 3d 20 77 69 6e 55 6e 6d 61 70 28    rc = winUnmap(
1b260 69 64 29 3b 20 2f 2a 20 43 61 6e 6e 6f 74 20 74  id); /* Cannot t
1b270 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
1b280 20 77 69 74 68 20 61 6e 20 6f 70 65 6e 20 6d 61   with an open ma
1b290 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  pping. */.      
1b2a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b2b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
1b2c0 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64  = winTruncate(id
1b2d0 2c 20 6e 4e 65 77 52 6e 64 29 3b 0a 20 20 20 20  , nNewRnd);.    
1b2e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1b2f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b300 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
1b310 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
1b320 20 74 68 69 73 20 66 61 72 2c 20 75 6e 6d 61 70   this far, unmap
1b330 20 61 6e 79 20 6f 6c 64 20 6d 61 70 70 69 6e 67   any old mapping
1b340 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 77 69 6e 55  . */.  rc = winU
1b350 6e 6d 61 70 28 69 64 29 3b 0a 20 20 69 66 28 20  nmap(id);.  if( 
1b360 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1b370 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
1b380 20 41 6e 64 2c 20 69 66 20 72 65 71 75 69 72 65   And, if require
1b390 64 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  d, create a new 
1b3a0 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66  mapping. */.  if
1b3b0 28 20 6e 4e 65 77 52 6e 64 3e 30 20 29 7b 0a 20  ( nNewRnd>0 ){. 
1b3c0 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
1b3d0 28 28 69 4f 66 66 20 2f 20 77 69 6e 53 79 73 49  ((iOff / winSysI
1b3e0 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
1b3f0 47 72 61 6e 75 6c 61 72 69 74 79 29 20 2a 0a 20  Granularity) *. 
1b400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b410 20 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41   (winSysInfo.dwA
1b420 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
1b430 72 69 74 79 29 29 3b 0a 20 20 20 20 44 57 4f 52  rity));.    DWOR
1b440 44 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45  D protect = PAGE
1b450 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 44  _READONLY;.    D
1b460 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 49 4c  WORD flags = FIL
1b470 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 20 20 20 20  E_MAP_READ;.    
1b480 69 66 28 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c  if( (pFile->ctrl
1b490 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f  Flags & WINFILE_
1b4a0 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  RDONLY)==0 ){.  
1b4b0 20 20 20 20 70 72 6f 74 65 63 74 20 3d 20 50 41      protect = PA
1b4c0 47 45 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  GE_READWRITE;.  
1b4d0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 46 49 4c      flags |= FIL
1b4e0 45 5f 4d 41 50 5f 57 52 49 54 45 3b 0a 20 20 20  E_MAP_WRITE;.   
1b4f0 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53   }.#if SQLITE_OS
1b500 5f 57 49 4e 52 54 0a 20 20 20 20 68 4d 61 70 20  _WINRT.    hMap 
1b510 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1b520 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 46 69  ppingFromApp(pFi
1b530 6c 65 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f  le->h, NULL, pro
1b540 74 65 63 74 2c 20 6e 4e 65 77 52 6e 64 2c 20 4e  tect, nNewRnd, N
1b550 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  ULL);.#elif defi
1b560 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
1b570 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 68  _HAS_WIDE).    h
1b580 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
1b590 6c 65 4d 61 70 70 69 6e 67 57 28 70 46 69 6c 65  leMappingW(pFile
1b5a0 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65  ->h, NULL, prote
1b5b0 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ct,.            
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5d0 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4e 65      (DWORD)((nNe
1b5e0 77 52 6e 64 3e 3e 33 32 29 20 26 20 30 78 66 66  wRnd>>32) & 0xff
1b5f0 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20  ffffff),.       
1b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b610 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29           (DWORD)
1b620 28 6e 4e 65 77 52 6e 64 20 26 20 30 78 66 66 66  (nNewRnd & 0xfff
1b630 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23  fffff), NULL);.#
1b640 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
1b650 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
1b660 53 49 29 0a 20 20 20 20 68 4d 61 70 20 3d 20 6f  SI).    hMap = o
1b670 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1b680 6e 67 41 28 70 46 69 6c 65 2d 3e 68 2c 20 4e 55  ngA(pFile->h, NU
1b690 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20  LL, protect,.   
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57               (DW
1b6c0 4f 52 44 29 28 28 6e 4e 65 77 52 6e 64 3e 3e 33  ORD)((nNewRnd>>3
1b6d0 32 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29  2) & 0xffffffff)
1b6e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b700 20 20 28 44 57 4f 52 44 29 28 6e 4e 65 77 52 6e    (DWORD)(nNewRn
1b710 64 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  d & 0xffffffff),
1b720 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
1b730 20 20 20 69 66 28 20 68 4d 61 70 3d 3d 4e 55 4c     if( hMap==NUL
1b740 4c 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  L ){.      pFile
1b750 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
1b760 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1b770 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1b780 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1b790 45 52 52 5f 4d 52 45 4d 41 50 2c 20 70 46 69 6c  ERR_MREMAP, pFil
1b7a0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7c0 20 20 20 20 20 22 77 69 6e 4d 72 65 6d 61 70 31       "winMremap1
1b7d0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1b7e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1b7f0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
1b800 65 72 74 28 20 28 6e 4e 65 77 52 6e 64 20 25 20  ert( (nNewRnd % 
1b810 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67  winSysInfo.dwPag
1b820 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 23 69 66  eSize)==0 );.#if
1b830 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1b840 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61  .    pNew = osMa
1b850 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
1b860 70 70 28 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20  pp(hMap, flags, 
1b870 6f 66 66 73 65 74 2c 20 6e 4e 65 77 52 6e 64 29  offset, nNewRnd)
1b880 3b 0a 23 65 6c 73 65 0a 20 20 20 20 61 73 73 65  ;.#else.    asse
1b890 72 74 28 20 73 69 7a 65 6f 66 28 53 49 5a 45 5f  rt( sizeof(SIZE_
1b8a0 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74  T)==sizeof(sqlit
1b8b0 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4e 65  e3_int64) || nNe
1b8c0 77 52 6e 64 3c 3d 30 78 66 66 66 66 66 66 66 66  wRnd<=0xffffffff
1b8d0 20 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f   );.    pNew = o
1b8e0 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68  sMapViewOfFile(h
1b8f0 4d 61 70 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20  Map, flags,.    
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b910 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 28         (DWORD)((
1b920 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  offset>>32) & 0x
1b930 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20  ffffffff),.     
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b950 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6f 66        (DWORD)(of
1b960 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
1b970 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  f),.            
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1b990 53 49 5a 45 5f 54 29 6e 4e 65 77 52 6e 64 29 3b  SIZE_T)nNewRnd);
1b9a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
1b9b0 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pNew==NULL ){.  
1b9c0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
1b9d0 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 68  e(hMap);.      h
1b9e0 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Map = NULL;.    
1b9f0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1ba00 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1ba10 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20  ror();.      rc 
1ba20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1ba30 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 52 45 4d 41  LITE_IOERR_MREMA
1ba40 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
1ba50 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1ba60 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1ba70 4d 72 65 6d 61 70 32 22 2c 20 70 46 69 6c 65 2d  Mremap2", pFile-
1ba80 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
1ba90 20 7d 0a 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 61   }..  pFile->hMa
1baa0 70 20 3d 20 68 4d 61 70 3b 0a 20 20 70 46 69 6c  p = hMap;.  pFil
1bab0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  e->pMapRegion = 
1bac0 70 4e 65 77 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d  pNew;.  pFile->m
1bad0 6d 61 70 53 69 7a 65 20 3d 20 6e 4e 65 77 3b 0a  mapSize = nNew;.
1bae0 0a 20 20 2a 70 70 4d 61 70 20 3d 20 70 4e 65 77  .  *ppMap = pNew
1baf0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1bb00 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ../*.** Here end
1bb10 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
1bb20 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69  tion of all sqli
1bb30 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
1bb40 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
1bb50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
1bb60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74  sqlite3_file Met
1bb70 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
1bb80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bb90 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1bba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bbb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bbc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bbd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1bbe0 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ***/../*.** This
1bbf0 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20   vector defines 
1bc00 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20  all the methods 
1bc10 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65  that can operate
1bc20 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65   on an.** sqlite
1bc30 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32  3_file for win32
1bc40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
1bc50 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
1bc60 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64  hods winIoMethod
1bc70 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20   = {.  3,       
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc90 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
1bca0 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65  on */.  winClose
1bcb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bcc0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
1bcd0 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20  e */.  winRead, 
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcf0 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
1bd00 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20  */.  winWrite,  
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
1bd30 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c  /.  winTruncate,
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd50 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
1bd60 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20   */.  winSync,  
1bd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd80 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
1bd90 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c  /.  winFileSize,
1bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdb0 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
1bdc0 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20   */.  winLock,  
1bdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bde0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
1bdf0 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20  /.  winUnlock,  
1be00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be10 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
1be20 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65  /.  winCheckRese
1be30 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20  rvedLock,       
1be40 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
1be50 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77  ervedLock */.  w
1be60 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  inFileControl,  
1be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1be80 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
1be90 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  /.  winSectorSiz
1bea0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1beb0 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
1bec0 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63  ze */.  winDevic
1bed0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1bee0 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69  ,       /* xDevi
1bef0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1bf00 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70  s */.  winShmMap
1bf10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bf20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
1bf30 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63  p */.  winShmLoc
1bf40 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1bf50 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
1bf60 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61  ck */.  winShmBa
1bf70 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
1bf80 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
1bf90 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53  arrier */.  winS
1bfa0 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  hmUnmap,        
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1bfc0 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69  ShmUnmap */.  wi
1bfd0 6e 4d 72 65 6d 61 70 2c 20 20 20 20 20 20 20 20  nMremap,        
1bfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bff0 20 78 4d 72 65 6d 61 70 20 2a 2f 0a 7d 3b 0a 0a   xMremap */.};..
1c000 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
1c010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1c050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
1c070 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
1c080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
1c0a0 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
1c0b0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
1c0c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
1c0d0 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
1c0e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
1c0f0 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  ect..*/../*.** C
1c100 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 66  onvert a UTF-8 f
1c110 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61  ilename into wha
1c120 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75  tever form the u
1c130 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65  nderlying.** ope
1c140 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61  rating system wa
1c150 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e  nts filenames in
1c160 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
1c170 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
1c180 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
1c190 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20  malloc and must 
1c1a0 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
1c1b0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
1c1c0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
1c1d0 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55 74 66 38  oid *convertUtf8
1c1e0 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63  Filename(const c
1c1f0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
1c200 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
1c210 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 69  ted = 0;.  if( i
1c220 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
1c230 6e 76 65 72 74 65 64 20 3d 20 75 74 66 38 54 6f  nverted = utf8To
1c240 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  Unicode(zFilenam
1c250 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  e);.  }.#ifdef S
1c260 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1c270 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
1c280 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71   zConverted = sq
1c290 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
1c2a0 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61  _to_mbcs(zFilena
1c2b0 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  me);.  }.#endif.
1c2c0 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c    /* caller will
1c2d0 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d   handle out of m
1c2e0 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72  emory */.  retur
1c2f0 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a  n zConverted;.}.
1c300 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1c310 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
1c320 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42  ame in zBuf.  zB
1c330 75 66 20 6d 75 73 74 20 62 65 20 62 69 67 20 65  uf must be big e
1c340 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64  nough to.** hold
1c350 20 61 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68   at pVfs->mxPath
1c360 6e 61 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e  name characters.
1c370 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
1c380 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
1c390 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
1c3a0 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
1c3b0 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
1c3c0 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
1c3d0 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
1c3e0 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
1c3f0 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
1c400 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
1c410 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20   size_t i, j;.  
1c420 69 6e 74 20 6e 54 65 6d 70 50 61 74 68 3b 0a 20  int nTempPath;. 
1c430 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b   char zTempPath[
1c440 4d 41 58 5f 50 41 54 48 2b 32 5d 3b 0a 0a 20 20  MAX_PATH+2];..  
1c450 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
1c460 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
1c470 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
1c480 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
1c490 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
1c4a0 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
1c4b0 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
1c4c0 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
1c4d0 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
1c4e0 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
1c4f0 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74   .  */.  Simulat
1c500 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
1c510 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b   SQLITE_IOERR );
1c520 0a 0a 20 20 6d 65 6d 73 65 74 28 7a 54 65 6d 70  ..  memset(zTemp
1c530 50 61 74 68 2c 20 30 2c 20 4d 41 58 5f 50 41 54  Path, 0, MAX_PAT
1c540 48 2b 32 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c  H+2);..  if( sql
1c550 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
1c560 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ory ){.    sqlit
1c570 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
1c580 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61  PATH-30, zTempPa
1c590 74 68 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  th, "%s", sqlite
1c5a0 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
1c5b0 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51 4c 49  );.  }.#if !SQLI
1c5c0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 65 6c  TE_OS_WINRT.  el
1c5d0 73 65 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  se if( isNT() ){
1c5e0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74  .    char *zMult
1c5f0 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57 69  i;.    WCHAR zWi
1c600 64 65 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d  dePath[MAX_PATH]
1c610 3b 0a 20 20 20 20 6f 73 47 65 74 54 65 6d 70 50  ;.    osGetTempP
1c620 61 74 68 57 28 4d 41 58 5f 50 41 54 48 2d 33 30  athW(MAX_PATH-30
1c630 2c 20 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  , zWidePath);.  
1c640 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f    zMulti = unico
1c650 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61  deToUtf8(zWidePa
1c660 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75  th);.    if( zMu
1c670 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  lti ){.      sql
1c680 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
1c690 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70  X_PATH-30, zTemp
1c6a0 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c  Path, "%s", zMul
1c6b0 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ti);.      sqlit
1c6c0 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b  e3_free(zMulti);
1c6d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c6e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c6f0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
1c700 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
1c710 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1c720 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
1c730 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20  char *zUtf8;.   
1c740 20 63 68 61 72 20 7a 4d 62 63 73 50 61 74 68 5b   char zMbcsPath[
1c750 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 6f  MAX_PATH];.    o
1c760 73 47 65 74 54 65 6d 70 50 61 74 68 41 28 4d 41  sGetTempPathA(MA
1c770 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d 62 63 73  X_PATH-30, zMbcs
1c780 50 61 74 68 29 3b 0a 20 20 20 20 7a 55 74 66 38  Path);.    zUtf8
1c790 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
1c7a0 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d  _mbcs_to_utf8(zM
1c7b0 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66  bcsPath);.    if
1c7c0 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20  ( zUtf8 ){.     
1c7d0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1c7e0 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a  f(MAX_PATH-30, z
1c7f0 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20  TempPath, "%s", 
1c800 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
1c810 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38  lite3_free(zUtf8
1c820 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c830 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c840 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1c850 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1c860 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65  #endif..  /* Che
1c870 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70  ck that the outp
1c880 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72  ut buffer is lar
1c890 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68  ge enough for th
1c8a0 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
1c8b0 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20   .  ** name. If 
1c8c0 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72  it is not, retur
1c8d0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
1c8e0 20 20 2a 2f 0a 20 20 6e 54 65 6d 70 50 61 74 68    */.  nTempPath
1c8f0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1c900 33 30 28 7a 54 65 6d 70 50 61 74 68 29 3b 0a 0a  30(zTempPath);..
1c910 20 20 69 66 28 20 28 6e 54 65 6d 70 50 61 74 68    if( (nTempPath
1c920 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
1c930 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  30(SQLITE_TEMP_F
1c940 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 38  ILE_PREFIX) + 18
1c950 29 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20 20 20  ) >= nBuf ){.   
1c960 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1c970 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  RROR;.  }..  for
1c980 28 69 3d 6e 54 65 6d 70 50 61 74 68 3b 20 69 3e  (i=nTempPath; i>
1c990 30 20 26 26 20 7a 54 65 6d 70 50 61 74 68 5b 69  0 && zTempPath[i
1c9a0 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b  -1]=='\\'; i--){
1c9b0 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d  }.  zTempPath[i]
1c9c0 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33   = 0;..  sqlite3
1c9d0 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
1c9e0 38 2c 20 7a 42 75 66 2c 20 28 6e 54 65 6d 70 50  8, zBuf, (nTempP
1c9f0 61 74 68 20 3e 20 30 29 20 3f 0a 20 20 20 20 20  ath > 0) ?.     
1ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca10 20 20 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54    "%s\\"SQLITE_T
1ca20 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 20  EMP_FILE_PREFIX 
1ca30 3a 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  : SQLITE_TEMP_FI
1ca40 4c 45 5f 50 52 45 46 49 58 2c 0a 20 20 20 20 20  LE_PREFIX,.     
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54                zT
1ca60 65 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20  empPath);.  j = 
1ca70 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1ca80 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33  zBuf);.  sqlite3
1ca90 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
1caa0 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72  &zBuf[j]);.  for
1cab0 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
1cac0 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b   j++){.    zBuf[
1cad0 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
1cae0 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
1caf0 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
1cb00 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
1cb10 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20  ;.  }.  zBuf[j] 
1cb20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d  = 0;.  zBuf[j+1]
1cb30 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45   = 0;..  OSTRACE
1cb40 28 28 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45  (("TEMP FILENAME
1cb50 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 29 3b  : %s\n", zBuf));
1cb60 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1cb70 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  _OK; .}../*.** R
1cb80 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1cb90 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20  e named file is 
1cba0 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f  really a directo
1cbb0 72 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ry.  Return fals
1cbc0 65 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f  e if.** it is so
1cbd0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
1cbe0 61 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  an a directory, 
1cbf0 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 61  or if there is a
1cc00 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72  ny kind of memor
1cc10 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  y.** allocation 
1cc20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
1cc30 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28  ic int winIsDir(
1cc40 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e  const void *zCon
1cc50 76 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44  verted){.  DWORD
1cc60 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
1cc70 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
1cc80 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 69  tErrno;..  if( i
1cc90 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74  sNT() ){.    int
1cca0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49   cnt = 0;.    WI
1ccb0 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
1ccc0 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
1ccd0 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  a;.    memset(&s
1cce0 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a  AttrData, 0, siz
1ccf0 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b  eof(sAttrData));
1cd00 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63  .    while( !(rc
1cd10 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
1cd20 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53  ibutesExW((LPCWS
1cd30 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
1cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46              GetF
1cd60 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72  ileExInfoStandar
1cd70 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd90 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20  &sAttrData)) && 
1cda0 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
1cdb0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
1cdc0 0a 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a  .    if( !rc ){.
1cdd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1cde0 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f  /* Invalid name?
1cdf0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61 74   */.    }.    at
1ce00 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
1ce10 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
1ce20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1ce30 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
1ce40 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65  .    attr = osGe
1ce50 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
1ce60 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
1ce70 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ed);.#endif.  }.
1ce80 20 20 72 65 74 75 72 6e 20 28 61 74 74 72 21 3d    return (attr!=
1ce90 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
1cea0 52 49 42 55 54 45 53 29 20 26 26 20 28 61 74 74  RIBUTES) && (att
1ceb0 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  r&FILE_ATTRIBUTE
1cec0 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a  _DIRECTORY);.}..
1ced0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
1cee0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1cef0 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69   winOpen(.  sqli
1cf00 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
1cf10 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
1cf20 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1cf30 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
1cf40 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1cf50 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  file (UTF-8) */.
1cf60 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1cf70 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  id,         /* W
1cf80 72 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20  rite the SQLite 
1cf90 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65  file handle here
1cfa0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
1cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfc0 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61  /* Open mode fla
1cfd0 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75  gs */.  int *pOu
1cfe0 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  tFlags          
1cff0 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75    /* Status retu
1d000 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20  rn flags */.){. 
1d010 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f   HANDLE h;.  DWO
1d020 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
1d030 44 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41  DWORD dwDesiredA
1d040 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64  ccess;.  DWORD d
1d050 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57  wShareMode;.  DW
1d060 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69  ORD dwCreationDi
1d070 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f  sposition;.  DWO
1d080 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74  RD dwFlagsAndAtt
1d090 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66  ributes = 0;.#if
1d0a0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
1d0b0 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20  .  int isTemp = 
1d0c0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46  0;.#endif.  winF
1d0d0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
1d0e0 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69  nFile*)id;.  voi
1d0f0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20  d *zConverted;  
1d100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1d110 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e  ilename in OS en
1d120 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73  coding */.  cons
1d130 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d  t char *zUtf8Nam
1d140 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69  e = zName; /* Fi
1d150 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20  lename in UTF-8 
1d160 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  encoding */.  in
1d170 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  t cnt = 0;..  /*
1d180 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
1d190 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
1d1a0 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
1d1b0 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
1d1c0 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
1d1d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
1d1e0 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
1d1f0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
1d200 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
1d210 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
1d220 41 58 5f 50 41 54 48 2b 32 5d 3b 20 20 20 20 20  AX_PATH+2];     
1d230 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74  /* Buffer used t
1d240 6f 20 63 72 65 61 74 65 20 74 65 6d 70 20 66 69  o create temp fi
1d250 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20 20 69 6e 74  lename */..  int
1d260 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d270 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1d280 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43  unction Return C
1d290 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ode */.#if !defi
1d2a0 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 53  ned(NDEBUG) || S
1d2b0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
1d2c0 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61   int eType = fla
1d2d0 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20  gs&0xFFFFFF00;  
1d2e0 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20  /* Type of file 
1d2f0 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69  to open */.#endi
1d300 66 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  f..  int isExclu
1d310 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
1d320 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1d330 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
1d340 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
1d350 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1d360 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
1d370 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
1d380 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
1d390 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1d3a0 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  ATE);.  int isRe
1d3b0 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67  adonly   = (flag
1d3c0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
1d3d0 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  READONLY);.  int
1d3e0 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
1d3f0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1d400 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
1d410 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
1d420 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75  .  int isOpenJou
1d430 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74 65  rnal = (isCreate
1d440 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54   && (.        eT
1d450 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1d460 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
1d470 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
1d480 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1d490 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
1d4a0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1d4b0 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23  OPEN_WAL.  ));.#
1d4c0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63  endif..  /* Chec
1d4d0 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  k the following 
1d4e0 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
1d4f0 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rue: .  **.  ** 
1d500 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e    (a) Exactly on
1d510 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49  e of the READWRI
1d520 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20  TE and READONLY 
1d530 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65  flags must be se
1d540 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28  t, and .  **   (
1d550 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20  b) if CREATE is 
1d560 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52  set, then READWR
1d570 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ITE must also be
1d580 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20   set, and.  **  
1d590 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56   (c) if EXCLUSIV
1d5a0 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
1d5b0 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
1d5c0 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28  be set..  **   (
1d5d0 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c  d) if DELETEONCL
1d5e0 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  OSE is set, then
1d5f0 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
1d600 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20  o be set..  */. 
1d610 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f   assert((isReado
1d620 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  nly==0 || isRead
1d630 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73  Write==0) && (is
1d640 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52  ReadWrite || isR
1d650 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73  eadonly));.  ass
1d660 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20  ert(isCreate==0 
1d670 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b  || isReadWrite);
1d680 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c  .  assert(isExcl
1d690 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72  usive==0 || isCr
1d6a0 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  eate);.  assert(
1d6b0 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69  isDelete==0 || i
1d6c0 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20  sCreate);..  /* 
1d6d0 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69  The main DB, mai
1d6e0 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66  n journal, WAL f
1d6f0 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a  ile and master j
1d700 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72  ournal are never
1d710 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63   .  ** automatic
1d720 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f  ally deleted. No
1d730 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20  r are they ever 
1d740 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
1d750 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
1d760 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
1d770 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
1d780 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
1d790 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  B );.  assert( (
1d7a0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
1d7b0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
1d7c0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
1d7d0 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
1d7e0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
1d7f0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
1d800 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
1d810 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b  ASTER_JOURNAL );
1d820 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
1d830 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
1d840 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
1d850 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20  _OPEN_WAL );..  
1d860 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
1d870 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68  he upper layer h
1d880 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68  as set one of th
1d890 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c  e "file-type" fl
1d8a0 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ags. */.  assert
1d8b0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
1d8c0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20  OPEN_MAIN_DB    
1d8d0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
1d8e0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20  TE_OPEN_TEMP_DB 
1d8f0 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
1d900 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
1d910 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  IN_JOURNAL || eT
1d920 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1d930 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _TEMP_JOURNAL . 
1d940 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
1d950 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
1d960 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70  OURNAL   || eTyp
1d970 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
1d980 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20  ASTER_JOURNAL . 
1d990 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
1d9a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e  SQLITE_OPEN_TRAN
1d9b0 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70  SIENT_DB || eTyp
1d9c0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
1d9d0 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72  AL.  );..  asser
1d9e0 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
1d9f0 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
1da00 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65  , sizeof(winFile
1da10 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d  ));.  pFile->h =
1da20 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
1da30 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49  VALUE;..#if SQLI
1da40 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
1da50 28 20 21 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ( !sqlite3_temp_
1da60 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  directory ){.   
1da70 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
1da80 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20  ITE_ERROR,.     
1da90 20 20 20 22 73 71 6c 69 74 65 33 5f 74 65 6d 70     "sqlite3_temp
1daa0 5f 64 69 72 65 63 74 6f 72 79 20 76 61 72 69 61  _directory varia
1dab0 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 65  ble should be se
1dac0 74 20 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20  t for WinRT");. 
1dad0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1dae0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
1daf0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
1db00 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c  unction is NULL,
1db10 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20 20 2a   generate a .  *
1db20 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  * temporary file
1db30 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a 20 20   name to use .  
1db40 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e  */.  if( !zUtf8N
1db50 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ame ){.    asser
1db60 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21 69  t(isDelete && !i
1db70 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  sOpenJournal);. 
1db80 20 20 20 6d 65 6d 73 65 74 28 7a 54 6d 70 6e 61     memset(zTmpna
1db90 6d 65 2c 20 30 2c 20 4d 41 58 5f 50 41 54 48 2b  me, 0, MAX_PATH+
1dba0 32 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74  2);.    rc = get
1dbb0 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54  Tempname(MAX_PAT
1dbc0 48 2b 32 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a  H+2, zTmpname);.
1dbd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1dbe0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1dbf0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1dc00 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20      zUtf8Name = 
1dc10 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20  zTmpname;.  }.. 
1dc20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
1dc30 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c  enames are doubl
1dc40 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65  e-zero terminate
1dc50 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f  d if they are no
1dc60 74 0a 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68  t.  ** URIs with
1dc70 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65   parameters.  He
1dc80 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c  nce, they can al
1dc90 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69  ways be passed i
1dca0 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  nto.  ** sqlite3
1dcb0 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29  _uri_parameter()
1dcc0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1dcd0 20 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f   (eType!=SQLITE_
1dce0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c  OPEN_MAIN_DB) ||
1dcf0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1dd00 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20  _OPEN_URI) ||.  
1dd10 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b        zUtf8Name[
1dd20 73 74 72 6c 65 6e 28 7a 55 74 66 38 4e 61 6d 65  strlen(zUtf8Name
1dd30 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  )+1]==0 );..  /*
1dd40 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69 6c   Convert the fil
1dd50 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79 73  ename to the sys
1dd60 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f  tem encoding. */
1dd70 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
1dd80 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
1dd90 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  ame(zUtf8Name);.
1dda0 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
1ddb0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
1ddc0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1ddd0 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  OMEM;.  }..  if(
1dde0 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65   winIsDir(zConve
1ddf0 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73 71 6c  rted) ){.    sql
1de00 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1de10 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74 75 72  rted);.    retur
1de20 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
1de30 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20  N_ISDIR;.  }..  
1de40 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
1de50 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64  ){.    dwDesired
1de60 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43  Access = GENERIC
1de70 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f  _READ | GENERIC_
1de80 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a  WRITE;.  }else{.
1de90 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
1dea0 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45  ess = GENERIC_RE
1deb0 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51  AD;.  }..  /* SQ
1dec0 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
1ded0 49 56 45 20 69 73 20 75 73 65 64 20 74 6f 20 6d  IVE is used to m
1dee0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 20  ake sure that a 
1def0 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20 20 2a  new file is .  *
1df00 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69 74  * created. SQLit
1df10 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69 74  e doesn't use it
1df20 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65 78   to indicate "ex
1df30 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22 20  clusive access" 
1df40 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20 75  .  ** as it is u
1df50 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f  sually understoo
1df60 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  d..  */.  if( is
1df70 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
1df80 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e 65   /* Creates a ne
1df90 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20  w file, only if 
1dfa0 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
1dfb0 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20  ady exist. */.  
1dfc0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
1dfd0 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69 6c   exists, it fail
1dfe0 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  s. */.    dwCrea
1dff0 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
1e000 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20  = CREATE_NEW;.  
1e010 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 65 61  }else if( isCrea
1e020 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  te ){.    /* Ope
1e030 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 2c  n existing file,
1e040 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 69 74   or create if it
1e050 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20 2a   doesn't exist *
1e060 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
1e070 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50  Disposition = OP
1e080 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c  EN_ALWAYS;.  }el
1e090 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73  se{.    /* Opens
1e0a0 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66   a file, only if
1e0b0 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20   it exists. */. 
1e0c0 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
1e0d0 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f  position = OPEN_
1e0e0 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20  EXISTING;.  }.. 
1e0f0 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 46   dwShareMode = F
1e100 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c  ILE_SHARE_READ |
1e110 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54   FILE_SHARE_WRIT
1e120 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65  E;..  if( isDele
1e130 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  te ){.#if SQLITE
1e140 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77  _OS_WINCE.    dw
1e150 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
1e160 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
1e170 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20  UTE_HIDDEN;.    
1e180 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73  isTemp = 1;.#els
1e190 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  e.    dwFlagsAnd
1e1a0 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
1e1b0 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50  E_ATTRIBUTE_TEMP
1e1c0 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20 20  ORARY.          
1e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e1e0 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52       | FILE_ATTR
1e1f0 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20  IBUTE_HIDDEN.   
1e200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e210 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
1e220 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f  LE_FLAG_DELETE_O
1e230 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a  N_CLOSE;.#endif.
1e240 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46    }else{.    dwF
1e250 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
1e260 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
1e270 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20  TE_NORMAL;.  }. 
1e280 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d   /* Reports from
1e290 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72   the internet ar
1e2a0 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e  e that performan
1e2b0 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a  ce is always.  *
1e2c0 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c 45  * better if FILE
1e2d0 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
1e2e0 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54 69  ESS is used.  Ti
1e2f0 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23  cket #2699. */.#
1e300 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1e310 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41  CE.  dwFlagsAndA
1e320 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c  ttributes |= FIL
1e330 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
1e340 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  CESS;.#endif..  
1e350 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23 69  if( isNT() ){.#i
1e360 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
1e370 54 0a 20 20 20 20 43 52 45 41 54 45 46 49 4c 45  T.    CREATEFILE
1e380 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d  2_EXTENDED_PARAM
1e390 45 54 45 52 53 20 65 78 74 65 6e 64 65 64 50 61  ETERS extendedPa
1e3a0 72 61 6d 65 74 65 72 73 3b 0a 20 20 20 20 65 78  rameters;.    ex
1e3b0 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
1e3c0 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66  .dwSize = sizeof
1e3d0 28 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54  (CREATEFILE2_EXT
1e3e0 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53  ENDED_PARAMETERS
1e3f0 29 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  );.    extendedP
1e400 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65  arameters.dwFile
1e410 41 74 74 72 69 62 75 74 65 73 20 3d 0a 20 20 20  Attributes =.   
1e420 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73           dwFlags
1e430 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20  AndAttributes & 
1e440 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d  FILE_ATTRIBUTE_M
1e450 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ASK;.    extende
1e460 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69  dParameters.dwFi
1e470 6c 65 46 6c 61 67 73 20 3d 20 64 77 46 6c 61 67  leFlags = dwFlag
1e480 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26  sAndAttributes &
1e490 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b   FILE_FLAG_MASK;
1e4a0 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
1e4b0 61 6d 65 74 65 72 73 2e 64 77 53 65 63 75 72 69  ameters.dwSecuri
1e4c0 74 79 51 6f 73 46 6c 61 67 73 20 3d 20 53 45 43  tyQosFlags = SEC
1e4d0 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b  URITY_ANONYMOUS;
1e4e0 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
1e4f0 61 6d 65 74 65 72 73 2e 6c 70 53 65 63 75 72 69  ameters.lpSecuri
1e500 74 79 41 74 74 72 69 62 75 74 65 73 20 3d 20 4e  tyAttributes = N
1e510 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64 65  ULL;.    extende
1e520 64 50 61 72 61 6d 65 74 65 72 73 2e 68 54 65 6d  dParameters.hTem
1e530 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c  plateFile = NULL
1e540 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20  ;.    while( (h 
1e550 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32 28  = osCreateFile2(
1e560 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
1e570 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
1e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e590 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
1e5a0 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss,.            
1e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5c0 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20    dwShareMode,. 
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43               dwC
1e5f0 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
1e600 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
1e610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e620 20 20 26 65 78 74 65 6e 64 65 64 50 61 72 61 6d    &extendedParam
1e630 65 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49 44  eters))==INVALID
1e640 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26  _HANDLE_VALUE &&
1e650 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1e670 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
1e680 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
1e690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e6a0 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23   Noop */.    }.#
1e6b0 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20  else.    while( 
1e6c0 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
1e6d0 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  eW((LPCWSTR)zCon
1e6e0 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
1e6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e700 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
1e710 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
1e720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e730 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
1e740 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
1e750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e760 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
1e770 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e790 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
1e7a0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
1e7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
1e7d0 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ULL))==INVALID_H
1e7e0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
1e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e800 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1e810 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
1e820 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20  astErrno) ){.   
1e830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e840 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e  oop */.    }.#en
1e850 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  dif.  }.#ifdef S
1e860 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1e870 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
1e880 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43   while( (h = osC
1e890 72 65 61 74 65 46 69 6c 65 41 28 28 4c 50 43 53  reateFileA((LPCS
1e8a0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44               dwD
1e8d0 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20  esiredAccess,.  
1e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8f0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68              dwSh
1e900 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20  areMode, NULL,. 
1e910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43               dwC
1e930 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
1e940 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  on,.            
1e950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e960 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
1e970 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20  ibutes,.        
1e980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e990 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e        NULL))==IN
1e9a0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1e9b0 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  UE &&.          
1e9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9d0 20 20 20 20 72 65 74 72 79 49 6f 65 72 72 28 26      retryIoerr(&
1e9e0 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
1e9f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ea00 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20     /* Noop */.  
1ea10 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
1ea20 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a   logIoerr(cnt);.
1ea30 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
1ea40 4e 20 25 64 20 25 73 20 30 78 25 6c 78 20 25 73  N %d %s 0x%lx %s
1ea50 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
1ea60 20 68 2c 20 7a 4e 61 6d 65 2c 20 64 77 44 65 73   h, zName, dwDes
1ea70 69 72 65 64 41 63 63 65 73 73 2c 20 0a 20 20 20  iredAccess, .   
1ea80 20 20 20 20 20 20 20 20 68 3d 3d 49 4e 56 41 4c          h==INVAL
1ea90 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
1eaa0 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b  ? "failed" : "ok
1eab0 22 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49  "));..  if( h==I
1eac0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
1ead0 4c 55 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  LUE ){.    pFile
1eae0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
1eaf0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e  stErrno;.    win
1eb00 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1eb10 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d  CANTOPEN, pFile-
1eb20 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e  >lastErrno, "win
1eb30 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65  Open", zUtf8Name
1eb40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1eb50 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
1eb60 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57  .    if( isReadW
1eb70 72 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75  rite && !isExclu
1eb80 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65  sive ){.      re
1eb90 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66  turn winOpen(pVf
1eba0 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20  s, zName, id, . 
1ebb0 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c          ((flags|
1ebc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1ebd0 4f 4e 4c 59 29 20 26 0a 20 20 20 20 20 20 20 20  ONLY) &.        
1ebe0 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 28 53               ~(S
1ebf0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1ec00 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  E|SQLITE_OPEN_RE
1ec10 41 44 57 52 49 54 45 29 29 2c 0a 20 20 20 20 20  ADWRITE)),.     
1ec20 20 20 20 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a      pOutFlags);.
1ec30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ec40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1ec50 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
1ec60 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1ec70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
1ec80 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
1ec90 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c  ){.      *pOutFl
1eca0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
1ecb0 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  N_READWRITE;.   
1ecc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
1ecd0 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  OutFlags = SQLIT
1ece0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
1ecf0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20  .    }.  }..#if 
1ed00 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1ed10 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
1ed20 65 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49  e && eType==SQLI
1ed30 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a  TE_OPEN_MAIN_DB.
1ed40 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20         && (rc = 
1ed50 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28  winceCreateLock(
1ed60 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d  zName, pFile))!=
1ed70 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20  SQLITE_OK.  ){. 
1ed80 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
1ed90 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (h);.    sqlite3
1eda0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
1edb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
1edc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54 65  ;.  }.  if( isTe
1edd0 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  mp ){.    pFile-
1ede0 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20  >zDeleteOnClose 
1edf0 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20  = zConverted;.  
1ee00 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
1ee10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1ee20 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
1ee30 20 7d 0a 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65   }..  pFile->pMe
1ee40 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74  thod = &winIoMet
1ee50 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56  hod;.  pFile->pV
1ee60 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69  fs = pVfs;.  pFi
1ee70 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28  le->h = h;.  if(
1ee80 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20   isReadonly ){. 
1ee90 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1eea0 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52  ags |= WINFILE_R
1eeb0 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
1eec0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
1eed0 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f  lean(zName, "pso
1eee0 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52  w", SQLITE_POWER
1eef0 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20  SAFE_OVERWRITE) 
1ef00 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
1ef10 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49  rlFlags |= WINFI
1ef20 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70  LE_PSOW;.  }.  p
1ef30 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1ef40 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46  = NO_ERROR;.  pF
1ef50 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61  ile->zPath = zNa
1ef60 6d 65 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 61  me;.  pFile->hMa
1ef70 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c  p = NULL;.  pFil
1ef80 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  e->pMapRegion = 
1ef90 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  0;.  pFile->mmap
1efa0 53 69 7a 65 20 3d 20 30 3b 0a 0a 20 20 4f 70 65  Size = 0;..  Ope
1efb0 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
1efc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1efd0 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e  .** Delete the n
1efe0 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  amed file..**.**
1eff0 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f   Note that Windo
1f000 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  ws does not allo
1f010 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64  w a file to be d
1f020 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  eleted if some o
1f030 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
1f040 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f  has it open.  So
1f050 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20  metimes a virus 
1f060 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78  scanner or index
1f070 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77  ing program.** w
1f080 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e  ill open a journ
1f090 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20  al file shortly 
1f0a0 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61  after it is crea
1f0b0 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
1f0c0 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69  do.** whatever i
1f0d0 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74  t does.  While t
1f0e0 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  his other proces
1f0f0 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
1f100 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77  .** file open, w
1f110 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65  e will be unable
1f120 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20   to delete it.  
1f130 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
1f140 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20  his.** problem, 
1f150 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c  we delay 100 mil
1f160 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72  liseconds and tr
1f170 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69  y to delete agai
1f180 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f  n.  Up.** to MX_
1f190 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
1f1a0 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d  s deletion attem
1f1b0 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f  pts are run befo
1f1c0 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20  re giving.** up 
1f1d0 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
1f1e0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
1f1f0 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28  c int winDelete(
1f200 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1f210 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f  pVfs,          /
1f220 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
1f230 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  n32 */.  const c
1f240 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1f250 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1f260 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a  file to delete *
1f270 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
1f280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f290 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
1f2a0 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  in32 */.){.  int
1f2b0 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
1f2c0 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  rc;.  DWORD attr
1f2d0 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
1f2e0 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  rno;.  void *zCo
1f2f0 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45  nverted;.  UNUSE
1f300 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
1f310 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1f320 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a  METER(syncDir);.
1f330 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1f340 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
1f350 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a  _IOERR_DELETE);.
1f360 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63    zConverted = c
1f370 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
1f380 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
1f390 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
1f3a0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1f3b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1f3c0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  MEM;.  }.  if( i
1f3d0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 20  sNT() ){.    do 
1f3e0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
1f3f0 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49 4e 33  WINRT.      WIN3
1f400 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
1f410 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
1f420 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73  .      memset(&s
1f430 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a  AttrData, 0, siz
1f440 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b  eof(sAttrData));
1f450 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 47 65  .      if ( osGe
1f460 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
1f470 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20 47  xW(zConverted, G
1f480 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e  etFileExInfoStan
1f490 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  dard,.          
1f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4b0 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61          &sAttrDa
1f4c0 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ta) ){.        a
1f4d0 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e  ttr = sAttrData.
1f4e0 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  dwFileAttributes
1f4f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f500 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
1f510 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1f520 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  r();.        if(
1f530 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
1f540 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
1f550 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73  .         || las
1f560 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41  tErrno==ERROR_PA
1f570 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
1f580 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1f590 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
1f5a0 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72  TE_NOENT; /* Alr
1f5b0 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20  eady gone? */.  
1f5c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f5d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1f5e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
1f5f0 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
1f600 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65  k;.      }.#else
1f610 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73  .      attr = os
1f620 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
1f630 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  sW(zConverted);.
1f640 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20  #endif.      if 
1f650 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f  ( attr==INVALID_
1f660 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
1f670 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45  ){.        lastE
1f680 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1f690 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
1f6a0 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d   if( lastErrno==
1f6b0 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
1f6c0 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c  OUND.         ||
1f6d0 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
1f6e0 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
1f6f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1f700 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1f710 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a  DELETE_NOENT; /*
1f720 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a   Already gone? *
1f730 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
1f740 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f750 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1f760 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f770 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1f780 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46       if ( attr&F
1f790 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49  ILE_ATTRIBUTE_DI
1f7a0 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20  RECTORY ){.     
1f7b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1f7c0 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f  RROR; /* Files o
1f7d0 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nly. */.        
1f7e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1f7f0 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65       if ( osDele
1f800 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74  teFileW(zConvert
1f810 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ed) ){.        r
1f820 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f  c = SQLITE_OK; /
1f830 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f  * Deleted OK. */
1f840 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1f850 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1f860 20 28 20 21 72 65 74 72 79 49 6f 65 72 72 28 26   ( !retryIoerr(&
1f870 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
1f880 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1f890 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
1f8a0 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65  * No more retrie
1f8b0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  s. */.        br
1f8c0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1f8d0 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d   } while(1);.  }
1f8e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
1f8f0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
1f900 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  else{.    do {. 
1f910 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65       attr = osGe
1f920 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
1f930 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
1f940 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49      if ( attr==I
1f950 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
1f960 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20  IBUTES ){.      
1f970 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
1f980 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1f990 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
1f9a0 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
1f9b0 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20  E_NOT_FOUND.    
1f9c0 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e       || lastErrn
1f9d0 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o==ERROR_PATH_NO
1f9e0 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
1f9f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1fa00 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
1fa10 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  ENT; /* Already 
1fa20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
1fa30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1fa40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
1fa50 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
1fa60 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1fa70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
1fa80 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49   attr&FILE_ATTRI
1fa90 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29  BUTE_DIRECTORY )
1faa0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1fab0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
1fac0 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20  Files only. */. 
1fad0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1fae0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
1faf0 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 28 7a   osDeleteFileA(z
1fb00 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
1fb10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1fb20 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64  E_OK; /* Deleted
1fb30 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   OK. */.        
1fb40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1fb50 20 20 20 20 20 69 66 20 28 20 21 72 65 74 72 79       if ( !retry
1fb60 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
1fb70 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
1fb80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1fb90 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65  RROR; /* No more
1fba0 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20   retries. */.   
1fbb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fbc0 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28    }.    } while(
1fbd0 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  1);.  }.#endif. 
1fbe0 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d 53   if( rc && rc!=S
1fbf0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
1fc00 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20  TE_NOENT ){.    
1fc10 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
1fc20 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  (SQLITE_IOERR_DE
1fc30 4c 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  LETE, lastErrno,
1fc40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77  .             "w
1fc50 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65  inDelete", zFile
1fc60 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  name);.  }else{.
1fc70 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74      logIoerr(cnt
1fc80 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1fc90 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
1fca0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
1fcb0 45 4c 45 54 45 20 5c 22 25 73 5c 22 20 25 73 5c  ELETE \"%s\" %s\
1fcc0 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28  n", zFilename, (
1fcd0 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20  rc ? "failed" : 
1fce0 22 6f 6b 22 20 29 29 29 3b 0a 20 20 72 65 74 75  "ok" )));.  retu
1fcf0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1fd00 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74 61  Check the exista
1fd10 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f  nce and status o
1fd20 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  f a file..*/.sta
1fd30 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73  tic int winAcces
1fd40 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
1fd50 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
1fd60 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
1fd70 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
1fd80 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1fd90 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1fda0 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  file to check */
1fdb0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
1fdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fdd0 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f   Type of test to
1fde0 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69   make on this fi
1fdf0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  le */.  int *pRe
1fe00 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
1fe10 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c     /* OUT: Resul
1fe20 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20  t */.){.  DWORD 
1fe30 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  attr;.  int rc =
1fe40 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   0;.  DWORD last
1fe50 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a  Errno;.  void *z
1fe60 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
1fe70 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
1fe80 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  fs);..  Simulate
1fe90 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1fea0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
1feb0 45 53 53 3b 20 29 3b 0a 20 20 7a 43 6f 6e 76 65  ESS; );.  zConve
1fec0 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
1fed0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
1fee0 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  name);.  if( zCo
1fef0 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
1ff00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ff10 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
1ff20 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
1ff30 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
1ff40 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45  ;.    WIN32_FILE
1ff50 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20  _ATTRIBUTE_DATA 
1ff60 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d  sAttrData;.    m
1ff70 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61  emset(&sAttrData
1ff80 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74  , 0, sizeof(sAtt
1ff90 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69  rData));.    whi
1ffa0 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74  le( !(rc = osGet
1ffb0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
1ffc0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
1ffd0 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fff0 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66      GetFileExInf
20000 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20 20 20 20  oStandard, .    
20010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20020 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
20030 61 74 61 29 29 20 26 26 20 72 65 74 72 79 49 6f  ata)) && retryIo
20040 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
20050 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66  rrno) ){}.    if
20060 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ( rc ){.      /*
20070 20 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41   For an SQLITE_A
20080 43 43 45 53 53 5f 45 58 49 53 54 53 20 71 75 65  CCESS_EXISTS que
20090 72 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f  ry, treat a zero
200a0 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20  -length file.   
200b0 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64     ** as if it d
200c0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20  oes not exist.. 
200d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
200e0 28 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49  (    flags==SQLI
200f0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
20100 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41  .          && sA
20110 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a  ttrData.nFileSiz
20120 65 48 69 67 68 3d 3d 30 20 0a 20 20 20 20 20 20  eHigh==0 .      
20130 20 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61      && sAttrData
20140 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30  .nFileSizeLow==0
20150 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72   ){.        attr
20160 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f   = INVALID_FILE_
20170 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
20180 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20190 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
201a0 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
201b0 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  es;.      }.    
201c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67  }else{.      log
201d0 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 20 20  Ioerr(cnt);.    
201e0 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21    if( lastErrno!
201f0 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
20200 46 4f 55 4e 44 20 26 26 20 6c 61 73 74 45 72 72  FOUND && lastErr
20210 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no!=ERROR_PATH_N
20220 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
20230 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
20240 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
20250 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ESS, lastErrno, 
20260 22 77 69 6e 41 63 63 65 73 73 22 2c 20 7a 46 69  "winAccess", zFi
20270 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
20280 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
20290 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
202a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
202b0 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20  _IOERR_ACCESS;. 
202c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
202d0 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c      attr = INVAL
202e0 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
202f0 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ES;.      }.    
20300 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
20310 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
20320 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61  SI.  else{.    a
20330 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
20340 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72  ttributesA((char
20350 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
20360 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
20370 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
20380 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20  ted);.  switch( 
20390 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73  flags ){.    cas
203a0 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
203b0 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53  READ:.    case S
203c0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
203d0 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20  STS:.      rc = 
203e0 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
203f0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
20400 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20410 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
20420 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
20430 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49      rc = attr!=I
20440 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
20450 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20  IBUTES &&.      
20460 20 20 20 20 20 20 20 28 61 74 74 72 20 26 20 46         (attr & F
20470 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45  ILE_ATTRIBUTE_RE
20480 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20  ADONLY)==0;.    
20490 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
204a0 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
204b0 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61  rt(!"Invalid fla
204c0 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20  gs argument");. 
204d0 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
204e0 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  rc;.  return SQL
204f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
20500 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  * Returns non-ze
20510 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66  ro if the specif
20520 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68  ied path name sh
20530 6f 75 6c 64 20 62 65 20 75 73 65 64 20 76 65 72  ould be used ver
20540 62 61 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f  batim.  If.** no
20550 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
20560 65 64 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e  ed from this fun
20570 63 74 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69  ction, the calli
20580 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  ng function must
20590 20 73 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74   simply.** use t
205a0 68 65 20 70 72 6f 76 69 64 65 64 20 70 61 74 68  he provided path
205b0 20 6e 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d   name verbatim -
205c0 4f 52 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69  OR- resolve it i
205d0 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20  nto a full path 
205e0 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68  name.** using th
205f0 65 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  e GetFullPathNam
20600 65 20 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63  e Win32 API func
20610 74 69 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62  tion (if availab
20620 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  le)..*/.static B
20630 4f 4f 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69  OOL winIsVerbati
20640 6d 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e  mPathname(.  con
20650 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61  st char *zPathna
20660 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20  me.){.  /*.  ** 
20670 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65  If the path name
20680 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20 66   starts with a f
20690 6f 72 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20  orward slash or 
206a0 61 20 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20  a backslash, it 
206b0 69 73 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61  is either.  ** a
206c0 20 6c 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c   legal UNC name,
206d0 20 61 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69   a volume relati
206e0 76 65 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61  ve path, or an a
206f0 62 73 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d  bsolute path nam
20700 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55  e in the.  ** "U
20710 6e 69 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57  nix" format on W
20720 69 6e 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69  indows.  There i
20730 73 20 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f  s no easy way to
20740 20 64 69 66 66 65 72 65 6e 74 69 61 74 65 20 62   differentiate b
20750 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20  etween.  ** the 
20760 66 69 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b  final two cases;
20770 20 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72   therefore, we r
20780 65 74 75 72 6e 20 74 68 65 20 73 61 66 65 72 20  eturn the safer 
20790 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
207a0 54 52 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61  TRUE.  ** so tha
207b0 74 20 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69  t callers of thi
207c0 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
207d0 73 69 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65  simply use it ve
207e0 72 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69  rbatim..  */.  i
207f0 66 20 28 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d  f ( zPathname[0]
20800 3d 3d 27 2f 27 20 7c 7c 20 7a 50 61 74 68 6e 61  =='/' || zPathna
20810 6d 65 5b 30 5d 3d 3d 27 5c 5c 27 20 29 7b 0a 20  me[0]=='\\' ){. 
20820 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a     return TRUE;.
20830 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
20840 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20  f the path name 
20850 73 74 61 72 74 73 20 77 69 74 68 20 61 20 6c 65  starts with a le
20860 74 74 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e  tter and a colon
20870 20 69 74 20 69 73 20 65 69 74 68 65 72 20 61 20   it is either a 
20880 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61  volume.  ** rela
20890 74 69 76 65 20 70 61 74 68 20 6f 72 20 61 6e 20  tive path or an 
208a0 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 20  absolute path.  
208b0 43 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20  Callers of this 
208c0 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f  function must no
208d0 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74 20 74  t.  ** attempt t
208e0 6f 20 74 72 65 61 74 20 69 74 20 61 73 20 61 20  o treat it as a 
208f0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
20900 6d 65 20 28 69 2e 65 2e 20 74 68 65 79 20 73 68  me (i.e. they sh
20910 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75 73 65 0a  ould simply use.
20920 20 20 2a 2a 20 69 74 20 76 65 72 62 61 74 69 6d    ** it verbatim
20930 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 73  )..  */.  if ( s
20940 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50  qlite3Isalpha(zP
20950 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a  athname[0]) && z
20960 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27  Pathname[1]==':'
20970 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
20980 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  RUE;.  }..  /*. 
20990 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f   ** If we get to
209a0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
209b0 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c   path name shoul
209c0 64 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  d almost certain
209d0 6c 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20  ly be a purely. 
209e0 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65   ** relative one
209f0 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43   (i.e. not a UNC
20a00 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c   name, not absol
20a10 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c  ute, and not vol
20a20 75 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20  ume relative).. 
20a30 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c   */.  return FAL
20a40 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  SE;.}../*.** Tur
20a50 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
20a60 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
20a70 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69  l pathname.  Wri
20a80 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70  te the full.** p
20a90 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75  athname into zOu
20aa0 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c  t[].  zOut[] wil
20ab0 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56  l be at least pV
20ac0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a  fs->mxPathname.*
20ad0 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
20ae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
20af0 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  inFullPathname(.
20b00 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
20b10 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
20b20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
20b30 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  s object */.  co
20b40 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74  nst char *zRelat
20b50 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ive,        /* P
20b60 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65  ossibly relative
20b70 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   input path */. 
20b80 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20   int nFull,     
20b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20ba0 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74  * Size of output
20bb0 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
20bc0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c   */.  char *zFul
20bd0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
20be0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
20bf0 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69  ffer */.){.  .#i
20c00 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
20c10 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65  IN__).  Simulate
20c20 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
20c30 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
20c40 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
20c50 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73  ER(nFull);.  ass
20c60 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74  ert( pVfs->mxPat
20c70 68 6e 61 6d 65 3e 3d 4d 41 58 5f 50 41 54 48 20  hname>=MAX_PATH 
20c80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 75  );.  assert( nFu
20c90 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll>=pVfs->mxPath
20ca0 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20 28 20 73  name );.  if ( s
20cb0 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
20cc0 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56  ctory && !winIsV
20cd0 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
20ce0 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20  zRelative) ){.  
20cf0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
20d00 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67  : We are dealing
20d10 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
20d20 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74   path name and t
20d30 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20  he data.    **  
20d40 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68       directory h
20d50 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68  as been set.  Th
20d60 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
20d70 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20  as the basis.   
20d80 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f   **       for co
20d90 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c  nverting the rel
20da0 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
20db0 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20  to an absolute. 
20dc0 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20     **       one 
20dd0 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68  by prepending th
20de0 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
20df0 20 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a 20 20   and a slash..  
20e00 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 4f    */.    char zO
20e10 75 74 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a  ut[MAX_PATH+1];.
20e20 20 20 20 20 6d 65 6d 73 65 74 28 7a 4f 75 74 2c      memset(zOut,
20e30 20 30 2c 20 4d 41 58 5f 50 41 54 48 2b 31 29 3b   0, MAX_PATH+1);
20e40 0a 20 20 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76  .    cygwin_conv
20e50 5f 70 61 74 68 28 43 43 50 5f 50 4f 53 49 58 5f  _path(CCP_POSIX_
20e60 54 4f 5f 57 49 4e 5f 41 7c 43 43 50 5f 52 45 4c  TO_WIN_A|CCP_REL
20e70 41 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76 65  ATIVE, zRelative
20e80 2c 20 7a 4f 75 74 2c 0a 20 20 20 20 20 20 20 20  , zOut,.        
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 58               MAX
20ea0 5f 50 41 54 48 2b 31 29 3b 0a 20 20 20 20 73 71  _PATH+1);.    sq
20eb0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
20ec0 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
20ed0 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
20ee0 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20  ll, "%s\\%s",.  
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f00 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
20f10 64 69 72 65 63 74 6f 72 79 2c 20 7a 4f 75 74 29  directory, zOut)
20f20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
20f30 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28  ygwin_conv_path(
20f40 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
20f50 5f 41 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a  _A, zRelative, z
20f60 46 75 6c 6c 2c 20 6e 46 75 6c 6c 29 3b 0a 20 20  Full, nFull);.  
20f70 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
20f80 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  E_OK;.#endif..#i
20f90 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f (SQLITE_OS_WIN
20fa0 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
20fb0 57 49 4e 52 54 29 20 26 26 20 21 64 65 66 69 6e  WINRT) && !defin
20fc0 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
20fd0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
20fe0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
20ff0 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69  ERROR );.  /* Wi
21000 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65  nCE has no conce
21010 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65  pt of a relative
21020 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f   pathname, or so
21030 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20   I am told. */. 
21040 20 2f 2a 20 57 69 6e 52 54 20 68 61 73 20 6e 6f   /* WinRT has no
21050 20 77 61 79 20 74 6f 20 63 6f 6e 76 65 72 74 20   way to convert 
21060 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
21070 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f  to an absolute o
21080 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 71  ne. */.  if ( sq
21090 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
210a0 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65  tory && !winIsVe
210b0 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a  rbatimPathname(z
210c0 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20  Relative) ){.   
210d0 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
210e0 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   We are dealing 
210f0 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20  with a relative 
21100 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68  path name and th
21110 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20  e data.    **   
21120 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61      directory ha
21130 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65  s been set.  The
21140 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61  refore, use it a
21150 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20  s the basis.    
21160 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e  **       for con
21170 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61  verting the rela
21180 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74  tive path name t
21190 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20  o an absolute.  
211a0 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62    **       one b
211b0 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65  y prepending the
211c0 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
211d0 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e  and a backslash.
211e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
211f0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
21200 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
21210 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
21220 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20 20  , "%s\\%s",.    
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21240 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
21250 72 65 63 74 6f 72 79 2c 20 7a 52 65 6c 61 74 69  rectory, zRelati
21260 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ve);.  }else{.  
21270 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
21280 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
21290 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
212a0 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52   zFull, "%s", zR
212b0 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20  elative);.  }.  
212c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
212d0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53  ;.#endif..#if !S
212e0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
212f0 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
21300 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  RT && !defined(_
21310 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 44 57 4f  _CYGWIN__).  DWO
21320 52 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64  RD nByte;.  void
21330 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
21340 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f  char *zOut;..  /
21350 2a 20 49 66 20 74 68 69 73 20 70 61 74 68 20 6e  * If this path n
21360 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  ame begins with 
21370 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58 22  "/X:", where "X"
21380 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65 74   is any alphabet
21390 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65  ic.  ** characte
213a0 72 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 69  r, discard the i
213b0 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20  nitial "/" from 
213c0 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20  the pathname..  
213d0 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69  */.  if( zRelati
213e0 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 73 71  ve[0]=='/' && sq
213f0 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 52 65  lite3Isalpha(zRe
21400 6c 61 74 69 76 65 5b 31 5d 29 20 26 26 20 7a 52  lative[1]) && zR
21410 65 6c 61 74 69 76 65 5b 32 5d 3d 3d 27 3a 27 20  elative[2]==':' 
21420 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69 76 65  ){.    zRelative
21430 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74  ++;.  }..  /* It
21440 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
21450 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
21460 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
21470 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
21480 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
21490 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
214a0 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
214b0 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
214c0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
214d0 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73  on failing. This
214e0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20   function could 
214f0 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61  fail if, for exa
21500 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63  mple, the.  ** c
21510 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
21520 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
21530 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f  n unlinked..  */
21540 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
21550 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
21560 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20  E_ERROR );.  if 
21570 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
21580 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
21590 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
215a0 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
215b0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
215c0 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
215d0 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
215e0 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
215f0 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
21600 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
21610 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
21620 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
21630 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
21640 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
21650 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
21660 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
21670 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
21680 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
21690 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
216a0 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
216b0 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c  ory and a backsl
216c0 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
216d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
216e0 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
216f0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
21700 46 75 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a  Full, "%s\\%s",.
21710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21720 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
21730 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 7a 52 65  a_directory, zRe
21740 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74  lative);.    ret
21750 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21760 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20   }.  zConverted 
21770 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
21780 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  ename(zRelative)
21790 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
217a0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
217b0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
217c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
217d0 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
217e0 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20  LPWSTR zTemp;.  
217f0 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
21800 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50  ullPathNameW((LP
21810 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
21820 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
21830 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
21840 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
21850 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
21860 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
21870 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21880 20 20 20 20 22 47 65 74 46 75 6c 6c 50 61 74 68      "GetFullPath
21890 4e 61 6d 65 57 31 22 2c 20 7a 43 6f 6e 76 65 72  NameW1", zConver
218a0 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
218b0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
218c0 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
218d0 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
218e0 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20  EN_FULLPATH;.   
218f0 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20   }.    nByte += 
21900 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73  3;.    zTemp = s
21910 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
21920 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
21930 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Temp[0]) );.    
21940 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a  if( zTemp==0 ){.
21950 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
21960 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
21970 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21980 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
21990 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
219a0 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68   = osGetFullPath
219b0 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a  NameW((LPCWSTR)z
219c0 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65  Converted, nByte
219d0 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20  , zTemp, 0);.   
219e0 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
219f0 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
21a00 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  or(SQLITE_ERROR,
21a10 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
21a20 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
21a30 20 20 20 20 20 22 47 65 74 46 75 6c 6c 50 61 74       "GetFullPat
21a40 68 4e 61 6d 65 57 32 22 2c 20 7a 43 6f 6e 76 65  hNameW2", zConve
21a50 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rted);.      sql
21a60 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
21a70 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rted);.      sql
21a80 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
21a90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
21aa0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
21ab0 55 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20  ULLPATH;.    }. 
21ac0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
21ad0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
21ae0 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54   zOut = unicodeT
21af0 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  oUtf8(zTemp);.  
21b00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21b10 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 69 66 64 65  Temp);.  }.#ifde
21b20 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
21b30 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
21b40 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b      char *zTemp;
21b50 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47  .    nByte = osG
21b60 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28  etFullPathNameA(
21b70 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
21b80 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  d, 0, 0, 0);.   
21b90 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
21ba0 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
21bb0 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  or(SQLITE_ERROR,
21bc0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
21bd0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
21be0 20 20 20 20 20 22 47 65 74 46 75 6c 6c 50 61 74       "GetFullPat
21bf0 68 4e 61 6d 65 41 31 22 2c 20 7a 43 6f 6e 76 65  hNameA1", zConve
21c00 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rted);.      sql
21c10 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
21c20 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
21c30 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
21c40 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20  PEN_FULLPATH;.  
21c50 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d    }.    nByte +=
21c60 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20   3;.    zTemp = 
21c70 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
21c80 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  o( nByte*sizeof(
21c90 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20  zTemp[0]) );.   
21ca0 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b   if( zTemp==0 ){
21cb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
21cc0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
21cd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21ce0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
21cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
21d00 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
21d10 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43  hNameA((char*)zC
21d20 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c  onverted, nByte,
21d30 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20   zTemp, 0);.    
21d40 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
21d50 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
21d60 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
21d70 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
21d80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21d90 20 20 20 20 22 47 65 74 46 75 6c 6c 50 61 74 68      "GetFullPath
21da0 4e 61 6d 65 41 32 22 2c 20 7a 43 6f 6e 76 65 72  NameA2", zConver
21db0 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
21dc0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
21dd0 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
21de0 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
21df0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21e00 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
21e10 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20  LLPATH;.    }.  
21e20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21e30 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
21e40 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77  zOut = sqlite3_w
21e50 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
21e60 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71  8(zTemp);.    sq
21e70 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
21e80 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
21e90 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20  if( zOut ){.    
21ea0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
21eb0 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
21ec0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
21ed0 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74  Full, "%s", zOut
21ee0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
21ef0 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72  ree(zOut);.    r
21f00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21f10 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
21f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
21f30 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e  R_NOMEM;.  }.#en
21f40 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  dif.}..#ifndef S
21f50 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
21f60 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
21f70 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
21f80 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
21f90 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
21fa0 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
21fb0 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
21fc0 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
21fd0 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
21fe0 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f  ed library..*/./
21ff0 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
22000 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
22010 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
22020 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
22030 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
22040 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
22050 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
22060 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
22070 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
22080 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74  *winDlOpen(sqlit
22090 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f  e3_vfs *pVfs, co
220a0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
220b0 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  ame){.  HANDLE h
220c0 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
220d0 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
220e0 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
220f0 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  name);.  UNUSED_
22100 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
22110 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
22120 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
22130 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
22140 69 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  isNT() ){.#if SQ
22150 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
22160 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b    h = osLoadPack
22170 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43  agedLibrary((LPC
22180 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
22190 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68   0);.#else.    h
221a0 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79   = osLoadLibrary
221b0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
221c0 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
221d0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
221e0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
221f0 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20    else{.    h = 
22200 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28  osLoadLibraryA((
22210 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
22220 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
22230 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
22240 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75  nverted);.  retu
22250 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73  rn (void*)h;.}.s
22260 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c  tatic void winDl
22270 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
22280 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
22290 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
222a0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
222b0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 67  METER(pVfs);.  g
222c0 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f  etLastErrorMsg(o
222d0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
222e0 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b   nBuf, zBufOut);
222f0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  .}.static void (
22300 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65  *winDlSym(sqlite
22310 33 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f 69 64  3_vfs *pVfs,void
22320 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61 72 20   *pH,const char 
22330 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
22340 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
22350 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
22360 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29  n (void(*)(void)
22370 29 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65 73  )osGetProcAddres
22380 73 41 28 28 48 41 4e 44 4c 45 29 70 48 2c 20 7a  sA((HANDLE)pH, z
22390 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Sym);.}.static v
223a0 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73  oid winDlClose(s
223b0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
223c0 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29  , void *pHandle)
223d0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
223e0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f 73  ETER(pVfs);.  os
223f0 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e  FreeLibrary((HAN
22400 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a  DLE)pHandle);.}.
22410 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
22420 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
22430 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65  ENSION is define
22440 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  d: */.  #define 
22450 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  winDlOpen  0.  #
22460 64 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f  define winDlErro
22470 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69  r 0.  #define wi
22480 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65  nDlSym   0.  #de
22490 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20  fine winDlClose 
224a0 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
224b0 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75   Write up to nBu
224c0 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
224d0 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e  mness into zBuf.
224e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
224f0 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  inRandomness(sql
22500 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
22510 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
22520 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  zBuf){.  int n =
22530 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   0;.  UNUSED_PAR
22540 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69  AMETER(pVfs);.#i
22550 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
22560 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75  _TEST).  n = nBu
22570 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  f;.  memset(zBuf
22580 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73  , 0, nBuf);.#els
22590 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53  e.  if( sizeof(S
225a0 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66  YSTEMTIME)<=nBuf
225b0 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d  -n ){.    SYSTEM
225c0 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47 65  TIME x;.    osGe
225d0 74 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b  tSystemTime(&x);
225e0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
225f0 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66  f[n], &x, sizeof
22600 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  (x));.    n += s
22610 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20  izeof(x);.  }.  
22620 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44  if( sizeof(DWORD
22630 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
22640 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73 47   DWORD pid = osG
22650 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
22660 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  Id();.    memcpy
22670 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c  (&zBuf[n], &pid,
22680 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
22690 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70     n += sizeof(p
226a0 69 64 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c  id);.  }.#if SQL
226b0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
226c0 66 28 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c  f( sizeof(ULONGL
226d0 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ONG)<=nBuf-n ){.
226e0 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e      ULONGLONG cn
226f0 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75  t = osGetTickCou
22700 6e 74 36 34 28 29 3b 0a 20 20 20 20 6d 65 6d 63  nt64();.    memc
22710 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e  py(&zBuf[n], &cn
22720 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b  t, sizeof(cnt));
22730 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
22740 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6c 73 65  (cnt);.  }.#else
22750 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57  .  if( sizeof(DW
22760 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ORD)<=nBuf-n ){.
22770 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20      DWORD cnt = 
22780 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29  osGetTickCount()
22790 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
227a0 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a  uf[n], &cnt, siz
227b0 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e  eof(cnt));.    n
227c0 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b   += sizeof(cnt);
227d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
227e0 28 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49  ( sizeof(LARGE_I
227f0 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20  NTEGER)<=nBuf-n 
22800 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54  ){.    LARGE_INT
22810 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51 75  EGER i;.    osQu
22820 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
22830 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20 6d  unter(&i);.    m
22840 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
22850 26 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a  &i, sizeof(i));.
22860 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
22870 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  i);.  }.#endif. 
22880 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
22890 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
228a0 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
228b0 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
228c0 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
228d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
228e0 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f  inSleep(sqlite3_
228f0 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d  vfs *pVfs, int m
22900 69 63 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c 69  icrosec){.  sqli
22910 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
22920 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
22930 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  000);.  UNUSED_P
22940 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
22950 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f    return ((micro
22960 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31  sec+999)/1000)*1
22970 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  000;.}../*.** Th
22980 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
22990 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
229a0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
229b0 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  , is interpreted
229c0 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   as.** the numbe
229d0 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e  r of seconds sin
229e0 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75  ce 1970 and is u
229f0 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72  sed to set the r
22a00 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69  esult of.** sqli
22a10 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
22a20 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  () during testin
22a30 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
22a40 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
22a50 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
22a60 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20  e = 0;  /* Fake 
22a70 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73  system time in s
22a80 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
22a90 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0. */.#endif../*
22aa0 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
22ab0 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
22ac0 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
22ad0 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
22ae0 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a  e into *piNow.**
22af0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
22b00 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
22b10 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
22b20 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30  r times 86_400_0
22b30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72  00.  In.** other
22b40 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e   words, write in
22b50 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75  to *piNow the nu
22b60 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
22b70 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a  onds since the J
22b80 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f  ulian.** epoch o
22b90 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77  f noon in Greenw
22ba0 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20  ich on November 
22bb0 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63  24, 4714 B.C acc
22bc0 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  ording to the.**
22bd0 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f   proleptic Grego
22be0 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a  rian calendar..*
22bf0 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
22c00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22c10 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  K.  Return SQLIT
22c20 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74  E_ERROR if the t
22c30 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a  ime and date .**
22c40 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
22c50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22c60 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
22c70 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20  t64(sqlite3_vfs 
22c80 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69  *pVfs, sqlite3_i
22c90 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
22ca0 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75  /* FILETIME stru
22cb0 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69  cture is a 64-bi
22cc0 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e  t value represen
22cd0 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ting the number 
22ce0 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e  of .     100-nan
22cf0 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c  osecond interval
22d00 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20  s since January 
22d10 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33  1, 1601 (= JD 23
22d20 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a  05813.5). .  */.
22d30 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20    FILETIME ft;. 
22d40 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
22d50 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46  lite3_int64 winF
22d60 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32  iletimeEpoch = 2
22d70 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33  3058135*(sqlite3
22d80 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
22d90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
22da0 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ST.  static cons
22db0 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
22dc0 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30  unixEpoch = 2440
22dd0 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  5875*(sqlite3_in
22de0 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e  t64)8640000;.#en
22df0 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20  dif.  /* 2^32 - 
22e00 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20  to avoid use of 
22e10 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20  LL and warnings 
22e20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74  in gcc */.  stat
22e30 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
22e40 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56  _int64 max32BitV
22e50 61 6c 75 65 20 3d 20 0a 20 20 20 20 20 20 28 73  alue = .      (s
22e60 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30  qlite3_int64)200
22e70 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74  0000000 + (sqlit
22e80 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30  e3_int64)2000000
22e90 30 30 30 20 2b 0a 20 20 20 20 20 20 28 73 71 6c  000 +.      (sql
22ea0 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36  ite3_int64)29496
22eb0 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54  7296;..#if SQLIT
22ec0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53  E_OS_WINCE.  SYS
22ed0 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20  TEMTIME time;.  
22ee0 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28  osGetSystemTime(
22ef0 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20  &time);.  /* if 
22f00 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
22f10 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74  Time() fails, it
22f20 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a   returns zero. *
22f30 2f 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74 65  /.  if (!osSyste
22f40 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28  mTimeToFileTime(
22f50 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20  &time,&ft)){.   
22f60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
22f70 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  RROR;.  }.#else.
22f80 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d    osGetSystemTim
22f90 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74  eAsFileTime( &ft
22fa0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70   );.#endif..  *p
22fb0 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69  iNow = winFileti
22fc0 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20  meEpoch +.      
22fd0 20 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65        ((((sqlite
22fe0 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67  3_int64)ft.dwHig
22ff0 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32  hDateTime)*max32
23000 42 69 74 56 61 6c 75 65 29 20 2b 20 0a 20 20 20  BitValue) + .   
23010 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c              (sql
23020 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77  ite3_int64)ft.dw
23030 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71  LowDateTime)/(sq
23040 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30  lite3_int64)1000
23050 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
23060 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c  E_TEST.  if( sql
23070 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
23080 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20  e ){.    *piNow 
23090 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  = 1000*(sqlite3_
230a0 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75  int64)sqlite3_cu
230b0 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69  rrent_time + uni
230c0 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64  xEpoch;.  }.#end
230d0 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  if.  UNUSED_PARA
230e0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
230f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  .}../*.** Find t
23110 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
23120 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
23130 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
23140 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
23150 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
23160 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
23170 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
23180 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
23190 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
231a0 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
231b0 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
231c0 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
231d0 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  ic int winCurren
231e0 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
231f0 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20  s *pVfs, double 
23200 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72  *prNow){.  int r
23210 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  c;.  sqlite3_int
23220 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e  64 i;.  rc = win
23230 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
23240 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66  (pVfs, &i);.  if
23250 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72  ( !rc ){.    *pr
23260 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30  Now = i/86400000
23270 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  .0;.  }.  return
23280 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
23290 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 74  e idea is that t
232a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72  his function wor
232b0 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e  ks like a combin
232c0 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c  ation of.** GetL
232d0 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46  astError() and F
232e0 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f  ormatMessage() o
232f0 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72  n Windows (or er
23300 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72  rno and.** strer
23310 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29  ror_r() on Unix)
23320 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72  . After an error
23330 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20   is returned by 
23340 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f  an OS.** functio
23350 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20  n, SQLite calls 
23360 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
23370 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67  th zBuf pointing
23380 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20   to.** a buffer 
23390 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54  of nBuf bytes. T
233a0 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75  he OS layer shou
233b0 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a  ld populate the.
233c0 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68 20 61  ** buffer with a
233d0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
233e0 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72  UTF-8 encoded er
233f0 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64  ror message.** d
23400 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61  escribing the la
23410 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68  st IO error to h
23420 61 76 65 20 6f 63 63 75 72 72 65 64 20 77 69 74  ave occurred wit
23430 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a  hin the calling.
23440 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ** thread..**.**
23450 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   If the error me
23460 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72  ssage is too lar
23470 67 65 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c  ge for the suppl
23480 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69  ied buffer,.** i
23490 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  t should be trun
234a0 63 61 74 65 64 2e 20 54 68 65 20 72 65 74 75 72  cated. The retur
234b0 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c  n value of xGetL
234c0 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a  astError.** is z
234d0 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  ero if the error
234e0 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e   message fits in
234f0 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20   the buffer, or 
23500 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65  non-zero.** othe
23510 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65  rwise (if the me
23520 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61  ssage was trunca
23530 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72  ted). If non-zer
23540 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a  o is returned,.*
23550 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  * then it is not
23560 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e   necessary to in
23570 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65  clude the nul-te
23580 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74  rminator charact
23590 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74  er.** in the out
235a0 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  put buffer..**.*
235b0 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20  * Not supplying 
235c0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
235d0 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64   will have no ad
235e0 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20  verse effect.** 
235f0 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73  on SQLite. It is
23600 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e   fine to have an
23610 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
23620 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65  that never.** re
23630 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d  turns an error m
23640 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  essage:.**.**   
23650 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f  int xGetLastErro
23660 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
23670 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
23680 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20  har *zBuf){.**  
23690 20 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30     assert(zBuf[0
236a0 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20  ]=='\0');.**    
236b0 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20   return 0;.**   
236c0 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20  }.**.** However 
236d0 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  if an error mess
236e0 61 67 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c  age is supplied,
236f0 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f   it will be inco
23700 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73  rporated.** by s
23710 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65  qlite into the e
23720 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61  rror message ava
23730 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
23740 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  er using.** sqli
23750 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f  te3_errmsg(), po
23760 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f  ssibly making IO
23770 20 65 72 72 6f 72 73 20 65 61 73 69 65 72 20 74   errors easier t
23780 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74  o debug..*/.stat
23790 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73  ic int winGetLas
237a0 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
237b0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
237c0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
237d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
237e0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
237f0 75 72 6e 20 67 65 74 4c 61 73 74 45 72 72 6f 72  urn getLastError
23800 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72  Msg(osGetLastErr
23810 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66  or(), nBuf, zBuf
23820 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
23830 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69  ialize and deini
23840 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72  tialize the oper
23850 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
23860 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erface..*/.int s
23870 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76  qlite3_os_init(v
23880 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73  oid){.  static s
23890 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66  qlite3_vfs winVf
238a0 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20  s = {.    3,    
238b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
238c0 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
238d0 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65    sizeof(winFile
238e0 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69  ),     /* szOsFi
238f0 6c 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41  le */.    MAX_PA
23900 54 48 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  TH,            /
23910 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
23920 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
23930 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
23940 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22  t */.    "win32"
23950 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
23960 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c   zName */.    0,
23970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23980 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a     /* pAppData *
23990 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20  /.    winOpen,  
239a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
239b0 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65  pen */.    winDe
239c0 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
239d0 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20  /* xDelete */.  
239e0 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20    winAccess,    
239f0 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
23a00 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c  s */.    winFull
23a10 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
23a20 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
23a30 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
23a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
23a50 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  lOpen */.    win
23a60 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
23a70 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
23a80 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20  .    winDlSym,  
23a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
23aa0 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  Sym */.    winDl
23ab0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
23ac0 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
23ad0 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73     winRandomness
23ae0 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64  ,       /* xRand
23af0 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  omness */.    wi
23b00 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  nSleep,         
23b10 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
23b20 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
23b30 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72  me,      /* xCur
23b40 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20  rentTime */.    
23b50 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  winGetLastError,
23b60 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
23b70 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
23b80 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
23b90 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d  , /* xCurrentTim
23ba0 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69  eInt64 */.    wi
23bb0 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nSetSystemCall, 
23bc0 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
23bd0 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Call */.    winG
23be0 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
23bf0 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
23c00 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78  ll */.    winNex
23c10 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f  tSystemCall,   /
23c20 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  * xNextSystemCal
23c30 6c 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 2f 2a 20  l */.  };..  /* 
23c40 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61  Double-check tha
23c50 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d  t the aSyscall[]
23c60 20 61 72 72 61 79 20 68 61 73 20 62 65 65 6e 20   array has been 
23c70 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a  constructed.  **
23c80 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65   correctly.  See
23c90 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65   ticket [bb3a86e
23ca0 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20  890c8e96ab] */. 
23cb0 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
23cc0 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 37 34  ze(aSyscall)==74
23cd0 20 29 3b 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65   );..  /* get me
23ce0 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74  mory map allocat
23cf0 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20  ion granularity 
23d00 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e  */.  memset(&win
23d10 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  SysInfo, 0, size
23d20 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29  of(SYSTEM_INFO))
23d30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
23d40 57 49 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61 74  WINRT.  osGetNat
23d50 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 28 26 77  iveSystemInfo(&w
23d60 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73  inSysInfo);.#els
23d70 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49  e.  osGetSystemI
23d80 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29  nfo(&winSysInfo)
23d90 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
23da0 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77  t( winSysInfo.dw
23db0 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c  AllocationGranul
23dc0 61 72 69 74 79 3e 30 20 29 3b 0a 20 20 61 73 73  arity>0 );.  ass
23dd0 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e  ert( winSysInfo.
23de0 64 77 50 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a  dwPageSize>0 );.
23df0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
23e00 65 67 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c  egister(&winVfs,
23e10 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   1);.  return SQ
23e20 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74  LITE_OK; .}..int
23e30 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28   sqlite3_os_end(
23e40 76 6f 69 64 29 7b 20 0a 23 69 66 20 53 51 4c 49  void){ .#if SQLI
23e50 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
23e60 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c  ( sleepObj!=NULL
23e70 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48   ){.    osCloseH
23e80 61 6e 64 6c 65 28 73 6c 65 65 70 4f 62 6a 29 3b  andle(sleepObj);
23e90 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20  .    sleepObj = 
23ea0 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  NULL;.  }.#endif
23eb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23ec0 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
23ed0 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20  * SQLITE_OS_WIN 
23ee0 2a 2f 0a                                         */.