/ Hex Artifact Content
Login

Artifact f7da4dc0a2545c0a430080380809946ae4d676d6:


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 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  .};../*.** Allow
1360: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69  ed values for wi
1370: 6e 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a  nFile.ctrlFlags.
1380: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
1390: 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20  LE_PERSIST_WAL  
13a0: 20 20 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72     0x04   /* Per
13b0: 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65  sistent WAL mode
13c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46   */.#define WINF
13d0: 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20  ILE_PSOW        
13e0: 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51      0x10   /* SQ
13f0: 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1400: 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a  SAFE_OVERWRITE *
1410: 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a  /../*. * The siz
1420: 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
1430: 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  used by sqlite3_
1440: 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75  win32_write_debu
1450: 67 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  g().. */.#ifndef
1460: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
1470: 47 5f 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65  G_BUF_SIZE.#  de
1480: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
1490: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20  2_DBG_BUF_SIZE  
14a0: 20 28 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a   ((int)(4096-siz
14b0: 65 6f 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e  eof(DWORD))).#en
14c0: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76  dif../*. * The v
14d0: 61 6c 75 65 20 75 73 65 64 20 77 69 74 68 20 73  alue used with s
14e0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
14f0: 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20  _directory() to 
1500: 73 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20  specify that. * 
1510: 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
1520: 72 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61  ry should be cha
1530: 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  nged.. */.#ifnde
1540: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  f SQLITE_WIN32_D
1550: 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  ATA_DIRECTORY_TY
1560: 50 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  PE.#  define SQL
1570: 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44  ITE_WIN32_DATA_D
1580: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28 31  IRECTORY_TYPE (1
1590: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
15a0: 54 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77  The value used w
15b0: 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  ith sqlite3_win3
15c0: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
15d0: 29 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61  ) to specify tha
15e0: 74 0a 20 2a 20 74 68 65 20 74 65 6d 70 6f 72 61  t. * the tempora
15f0: 72 79 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f  ry directory sho
1600: 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  uld be changed..
1610: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1620: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
1630: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20  RECTORY_TYPE.#  
1640: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
1650: 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f  N32_TEMP_DIRECTO
1660: 52 59 5f 54 59 50 45 20 28 32 29 0a 23 65 6e 64  RY_TYPE (2).#end
1670: 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d  if../*. * If com
1680: 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
1690: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f  E_WIN32_MALLOC o
16a0: 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69  n Windows, we wi
16b0: 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61  ll use the. * va
16c0: 72 69 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20  rious Win32 API 
16d0: 68 65 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69  heap functions i
16e0: 6e 73 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77  nstead of our ow
16f0: 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  n.. */.#ifdef SQ
1700: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
1710: 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73  C../*. * If this
1720: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e   is non-zero, an
1730: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
1740: 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 62  ill be created b
1750: 79 20 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e  y the native Win
1760: 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20  32. * allocator 
1770: 73 75 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72  subsystem; other
1780: 77 69 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c  wise, the defaul
1790: 74 20 70 72 6f 63 65 73 73 20 68 65 61 70 20 77  t process heap w
17a0: 69 6c 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68  ill be used.  Th
17b0: 69 73 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61  is. * setting ha
17c0: 73 20 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e  s no effect when
17d0: 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57   compiling for W
17e0: 69 6e 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c  inRT.  By defaul
17f0: 74 2c 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c  t, this is enabl
1800: 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f  ed. * and an iso
1810: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20  lated heap will 
1820: 62 65 20 63 72 65 61 74 65 64 20 74 6f 20 73 74  be created to st
1830: 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65  ore all allocate
1840: 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a  d data.. *. ****
1850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41  **********. * WA
18a0: 52 4e 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70  RNING: It is imp
18b0: 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74  ortant to note t
18c0: 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 73 65  hat when this se
18d0: 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72  tting is non-zer
18e0: 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20  o and the. *    
18f0: 20 20 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74        winMemShut
1900: 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  down function is
1910: 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79   called (e.g. by
1920: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75   the sqlite3_shu
1930: 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20  tdown. *        
1940: 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c    function), all
1950: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 61   data that was a
1960: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74  llocated using t
1970: 68 65 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70  he isolated heap
1980: 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20   will. *        
1990: 20 20 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64    be freed immed
19a0: 69 61 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61  iately and any a
19b0: 74 74 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73  ttempt to access
19c0: 20 61 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65   any of that fre
19d0: 65 64 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64  ed. *          d
19e0: 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20  ata will almost 
19f0: 63 65 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74  certainly result
1a00: 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65   in an immediate
1a10: 20 61 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f   access violatio
1a20: 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.. ************
1a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a70: 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  **. */.#ifndef S
1a80: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
1a90: 5f 43 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e  _CREATE.#  defin
1aa0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
1ab0: 45 41 50 5f 43 52 45 41 54 45 20 20 20 20 28 54  EAP_CREATE    (T
1ac0: 52 55 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  RUE).#endif../*.
1ad0: 20 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73   * The initial s
1ae0: 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ize of the Win32
1af0: 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20  -specific heap. 
1b00: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
1b10: 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66  be zero.. */.#if
1b20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
1b30: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
1b40: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
1b50: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
1b60: 54 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45 5f  T_SIZE ((SQLITE_
1b70: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
1b80: 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20  ZE) * \.        
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1bb0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
1bc0: 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 34  AGE_SIZE) + 4194
1bd0: 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  304).#endif../*.
1be0: 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73   * The maximum s
1bf0: 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ize of the Win32
1c00: 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20  -specific heap. 
1c10: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
1c20: 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66  be zero.. */.#if
1c30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
1c40: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a  2_HEAP_MAX_SIZE.
1c50: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
1c60: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
1c70: 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69 66  SIZE  (0).#endif
1c80: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72  ../*. * The extr
1c90: 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69  a flags to use i
1ca0: 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57  n calls to the W
1cb0: 69 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e 20  in32 heap APIs. 
1cc0: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
1cd0: 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74  be. * zero for t
1ce0: 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76  he default behav
1cf0: 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ior.. */.#ifndef
1d00: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
1d10: 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69  AP_FLAGS.#  defi
1d20: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
1d30: 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20 28  HEAP_FLAGS     (
1d40: 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0).#endif../*.**
1d50: 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61 20   The winMemData 
1d60: 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65 73  structure stores
1d70: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71   information req
1d80: 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69 6e  uired by the Win
1d90: 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 73  32-specific.** s
1da0: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
1db0: 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ds implementatio
1dc0: 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  n..*/.typedef st
1dd0: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
1de0: 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72 75  winMemData;.stru
1df0: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b 0a  ct winMemData {.
1e00: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1e10: 20 75 33 32 20 6d 61 67 69 63 3b 20 20 20 20 2f   u32 magic;    /
1e20: 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74  * Magic number t
1e30: 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75  o detect structu
1e40: 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a  re corruption. *
1e50: 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44 4c  /.#endif.  HANDL
1e60: 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65 20  E hHeap; /* The 
1e70: 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68 65  handle to our he
1e80: 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f  ap. */.  BOOL bO
1e90: 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65 20  wned;  /* Do we 
1ea0: 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69 2e  own the heap (i.
1eb0: 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f 6e  e. destroy it on
1ec0: 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a 7d   shutdown)? */.}
1ed0: 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
1ee0: 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d  G.#define WINMEM
1ef0: 5f 4d 41 47 49 43 20 20 20 20 20 30 78 34 32 62  _MAGIC     0x42b
1f00: 32 38 33 30 62 0a 23 65 6e 64 69 66 0a 0a 73 74  2830b.#endif..st
1f10: 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d  atic struct winM
1f20: 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64  emData win_mem_d
1f30: 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20  ata = {.#ifndef 
1f40: 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f  NDEBUG.  WINMEM_
1f50: 4d 41 47 49 43 2c 0a 23 65 6e 64 69 66 0a 20 20  MAGIC,.#endif.  
1f60: 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 7d 3b 0a 0a  NULL, FALSE.};..
1f70: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
1f80: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73  define winMemAss
1f90: 65 72 74 4d 61 67 69 63 28 29 20 61 73 73 65 72  ertMagic() asser
1fa0: 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e  t( win_mem_data.
1fb0: 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  magic==WINMEM_MA
1fc0: 47 49 43 20 29 0a 23 65 6c 73 65 0a 23 64 65 66  GIC ).#else.#def
1fd0: 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ine winMemAssert
1fe0: 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a  Magic().#endif..
1ff0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65  #define winMemGe
2000: 74 48 65 61 70 28 29 20 77 69 6e 5f 6d 65 6d 5f  tHeap() win_mem_
2010: 64 61 74 61 2e 68 48 65 61 70 0a 0a 73 74 61 74  data.hHeap..stat
2020: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d  ic void *winMemM
2030: 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73  alloc(int nBytes
2040: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
2050: 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a  inMemFree(void *
2060: 70 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20  pPrior);.static 
2070: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c  void *winMemReal
2080: 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  loc(void *pPrior
2090: 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  , int nBytes);.s
20a0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
20b0: 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73  Size(void *p);.s
20c0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
20d0: 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a  Roundup(int n);.
20e0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
20f0: 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70  mInit(void *pApp
2100: 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f  Data);.static vo
2110: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77  id winMemShutdow
2120: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  n(void *pAppData
2130: 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  );..const sqlite
2140: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73  3_mem_methods *s
2150: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
2160: 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20  2(void);.#endif 
2170: 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
2180: 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  MALLOC */../*.**
2190: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
21a0: 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d  ariable is (norm
21b0: 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61  ally) set once a
21c0: 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73  nd never changes
21d0: 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20  .** thereafter. 
21e0: 20 49 74 20 72 65 63 6f 72 64 73 20 77 68 65 74   It records whet
21f0: 68 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e  her the operatin
2200: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
2210: 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a  x.** or WinNT..*
2220: 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74  *.** 0:   Operat
2230: 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f  ing system unkno
2240: 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72  wn..** 1:   Oper
2250: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
2260: 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f  Win9x..** 2:   O
2270: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
2280: 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20  is WinNT..**.** 
2290: 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69  In order to faci
22a0: 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f  litate testing o
22b0: 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d  n a WinNT system
22c0: 2c 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75  , the test fixtu
22d0: 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c  re.** can manual
22e0: 6c 79 20 73 65 74 20 74 68 69 73 20 76 61 6c 75  ly set this valu
22f0: 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74  e to 1 to emulat
2300: 65 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72  e Win98 behavior
2310: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2320: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
2330: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b  te3_os_type = 0;
2340: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e  .#else.static in
2350: 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  t sqlite3_os_typ
2360: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 0;.#endif..#
2370: 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23  ifndef SYSCALL.#
2380: 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c    define SYSCALL
2390: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
23a0: 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  _ptr.#endif../*.
23b0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
23c0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
23d0: 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20  e on Windows CE 
23e0: 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23  or WinRT.. */..#
23f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2400: 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
2410: 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20  WINRT.#  define 
2420: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
2430: 49 28 29 20 20 20 20 20 20 20 31 0a 23 65 6e 64  I()       1.#end
2440: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73  if../*.** Many s
2450: 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20  ystem calls are 
2460: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
2470: 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63   pointer-to-func
2480: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a  tions so that.**
2490: 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65   they may be ove
24a0: 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69  rridden at runti
24b0: 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  me to facilitate
24c0: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
24d0: 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69   during.** testi
24e0: 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e  ng and sandboxin
24f0: 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  g.  The followin
2500: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68  g array holds th
2510: 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e  e names and poin
2520: 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f  ters.** to all o
2530: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
2540: 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  em calls..*/.sta
2550: 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73  tic struct win_s
2560: 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74  yscall {.  const
2570: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
2580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2590: 20 6f 66 20 74 68 65 20 73 79 74 65 6d 20 63 61   of the sytem ca
25a0: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
25b0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72  syscall_ptr pCur
25c0: 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74  rent; /* Current
25d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
25e0: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
25f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2600: 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20  tr pDefault; /* 
2610: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f  Default value */
2620: 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20  .} aSyscall[] = 
2630: 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
2640: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
2650: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
2660: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22  AreFileApisANSI"
2670: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
2680: 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73 41 4e  LL)AreFileApisAN
2690: 53 49 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  SI,         0 },
26a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72 65 46  .#else.  { "AreF
26b0: 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20  ileApisANSI",   
26c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
26d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
26f0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41  dif..#ifndef osA
2700: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 0a 23  reFileApisANSI.#
2710: 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65  define osAreFile
2720: 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28  ApisANSI ((BOOL(
2730: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
2740: 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72  Syscall[0].pCurr
2750: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
2760: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
2770: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
2780: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2790: 45 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65  E).  { "CharLowe
27a0: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
27b0: 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 4c    (SYSCALL)CharL
27c0: 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20 20 20  owerW,          
27d0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
27e0: 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c   { "CharLowerW",
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
2800: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
2830: 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65 72  fine osCharLower
2840: 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50  W ((LPWSTR(WINAP
2850: 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79 73  I*)(LPWSTR))aSys
2860: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
2870: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
2880: 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65  _WINCE && define
2890: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
28a0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68  AS_WIDE).  { "Ch
28b0: 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20 20  arUpperW",      
28c0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
28d0: 29 43 68 61 72 55 70 70 65 72 57 2c 20 20 20 20  )CharUpperW,    
28e0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
28f0: 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 55 70  else.  { "CharUp
2900: 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  perW",          
2910: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
2940: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61  f..#define osCha
2950: 72 55 70 70 65 72 57 20 28 28 4c 50 57 53 54 52  rUpperW ((LPWSTR
2960: 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52  (WINAPI*)(LPWSTR
2970: 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43  ))aSyscall[2].pC
2980: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c  urrent)..  { "Cl
2990: 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20 20 20 20  oseHandle",     
29a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
29b0: 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20  )CloseHandle,   
29c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
29d0: 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48  #define osCloseH
29e0: 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  andle ((BOOL(WIN
29f0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
2a00: 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65  yscall[3].pCurre
2a10: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
2a20: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2a30: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43 72 65  S_ANSI).  { "Cre
2a40: 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  ateFileA",      
2a50: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2a60: 43 72 65 61 74 65 46 69 6c 65 41 2c 20 20 20 20  CreateFileA,    
2a70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2a80: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
2a90: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
2aa0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2ad0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
2ae0: 74 65 46 69 6c 65 41 20 28 28 48 41 4e 44 4c 45  teFileA ((HANDLE
2af0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
2b00: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
2b10: 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49          LPSECURI
2b20: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57  TY_ATTRIBUTES,DW
2b30: 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45  ORD,DWORD,HANDLE
2b40: 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43  ))aSyscall[4].pC
2b50: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
2b60: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
2b70: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2b80: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
2b90: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57    { "CreateFileW
2ba0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
2bb0: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
2bc0: 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  leW,            
2bd0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2be0: 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20  "CreateFileW",  
2bf0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
2c00: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2c20: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2c30: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 20  e osCreateFileW 
2c40: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
2c50: 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c  )(LPCWSTR,DWORD,
2c60: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
2c70: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
2c80: 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f  IBUTES,DWORD,DWO
2c90: 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63  RD,HANDLE))aSysc
2ca0: 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29  all[5].pCurrent)
2cb0: 0a 0a 23 69 66 20 28 21 53 51 4c 49 54 45 5f 4f  ..#if (!SQLITE_O
2cc0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
2cd0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2ce0: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a 20  HAS_ANSI) && \. 
2cf0: 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28         !defined(
2d00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
2d10: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
2d20: 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20  eMappingA",     
2d30: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
2d40: 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20 20 20  FileMappingA,   
2d50: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
2d60: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
2d70: 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59  pingA",      (SY
2d80: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2da0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
2db0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
2dc0: 4d 61 70 70 69 6e 67 41 20 28 28 48 41 4e 44 4c  MappingA ((HANDL
2dd0: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  E(WINAPI*)(HANDL
2de0: 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  E,LPSECURITY_ATT
2df0: 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20  RIBUTES, \.     
2e00: 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44     DWORD,DWORD,D
2e10: 57 4f 52 44 2c 4c 50 43 53 54 52 29 29 61 53 79  WORD,LPCSTR))aSy
2e20: 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e  scall[6].pCurren
2e30: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
2e40: 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c  S_WINCE || (!SQL
2e50: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
2e60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2e70: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26  IN32_HAS_WIDE) &
2e80: 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66  & \.        !def
2e90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2ea0: 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65 61  _WAL)).  { "Crea
2eb0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c  teFileMappingW",
2ec0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
2ed0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
2ee0: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
2ef0: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
2f00: 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20  leMappingW",    
2f10: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2f40: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
2f50: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28  eFileMappingW ((
2f60: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
2f70: 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54  HANDLE,LPSECURIT
2f80: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a  Y_ATTRIBUTES, \.
2f90: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57          DWORD,DW
2fa0: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54  ORD,DWORD,LPCWST
2fb0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70  R))aSyscall[7].p
2fc0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
2fd0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
2fe0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
2ff0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3000: 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65  .  { "CreateMute
3010: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xW",            
3020: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d  (SYSCALL)CreateM
3030: 75 74 65 78 57 2c 20 20 20 20 20 20 20 20 20 20  utexW,          
3040: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3050: 20 22 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c   "CreateMutexW",
3060: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3070: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3090: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
30a0: 6e 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78  ne osCreateMutex
30b0: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
30c0: 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41  I*)(LPSECURITY_A
30d0: 54 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20  TTRIBUTES,BOOL, 
30e0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53 54  \.        LPCWST
30f0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70  R))aSyscall[8].p
3100: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3110: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3120: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
3130: 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20   "DeleteFileA", 
3140: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3150: 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41  CALL)DeleteFileA
3160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3170: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65  },.#else.  { "De
3180: 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  leteFileA",     
3190: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
31a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
31b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
31c0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
31d0: 73 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42  sDeleteFileA ((B
31e0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
31f0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  STR))aSyscall[9]
3200: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3210: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3220: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
3230: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22   { "DeleteFileW"
3240: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
3250: 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c  YSCALL)DeleteFil
3260: 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eW,             
3270: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3280: 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20  DeleteFileW",   
3290: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
32a0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
32c0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
32d0: 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28   osDeleteFileW (
32e0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
32f0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
3300: 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [10].pCurrent)..
3310: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
3320: 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  NCE.  { "FileTim
3330: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
3340: 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65  ", (SYSCALL)File
3350: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
3360: 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ime, 0 },.#else.
3370: 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c    { "FileTimeToL
3380: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28  ocalFileTime", (
3390: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
33c0: 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65  efine osFileTime
33d0: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20  ToLocalFileTime 
33e0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
33f0: 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c  CONST FILETIME*,
3400: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c   \.        LPFIL
3410: 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  ETIME))aSyscall[
3420: 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  11].pCurrent)..#
3430: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
3440: 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  CE.  { "FileTime
3450: 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  ToSystemTime",  
3460: 20 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54    (SYSCALL)FileT
3470: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c  imeToSystemTime,
3480: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3490: 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79   { "FileTimeToSy
34a0: 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53  stemTime",    (S
34b0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
34e0: 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54  fine osFileTimeT
34f0: 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f  oSystemTime ((BO
3500: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53  OL(WINAPI*)(CONS
3510: 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20  T FILETIME*, \. 
3520: 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54         LPSYSTEMT
3530: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32  IME))aSyscall[12
3540: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3550: 20 22 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65   "FlushFileBuffe
3560: 72 73 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  rs",        (SYS
3570: 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75  CALL)FlushFileBu
3580: 66 66 65 72 73 2c 20 20 20 20 20 20 20 20 30 20  ffers,        0 
3590: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c  },..#define osFl
35a0: 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 20 28  ushFileBuffers (
35b0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
35c0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
35d0: 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  13].pCurrent)..#
35e0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
35f0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
3600: 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  ).  { "FormatMes
3610: 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20  sageA",         
3620: 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74   (SYSCALL)Format
3630: 4d 65 73 73 61 67 65 41 2c 20 20 20 20 20 20 20  MessageA,       
3640: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3650: 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  { "FormatMessage
3660: 41 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  A",          (SY
3670: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3690: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
36a0: 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  ine osFormatMess
36b0: 61 67 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e  ageA ((DWORD(WIN
36c0: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56  API*)(DWORD,LPCV
36d0: 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  OID,DWORD,DWORD,
36e0: 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  LPSTR, \.       
36f0: 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29   DWORD,va_list*)
3700: 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43  )aSyscall[14].pC
3710: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3720: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3730: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
3740: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22  "FormatMessageW"
3750: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
3760: 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67  ALL)FormatMessag
3770: 65 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  eW,          0 }
3780: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72  ,.#else.  { "For
3790: 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20  matMessageW",   
37a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
37b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
37c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
37d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
37e0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28  FormatMessageW (
37f0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3800: 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57  DWORD,LPCVOID,DW
3810: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52  ORD,DWORD,LPWSTR
3820: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
3830: 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73  D,va_list*))aSys
3840: 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e  call[15].pCurren
3850: 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t)..#if !defined
3860: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41  (SQLITE_OMIT_LOA
3870: 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b  D_EXTENSION).  {
3880: 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20   "FreeLibrary", 
3890: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
38a0: 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79  CALL)FreeLibrary
38b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
38c0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72  },.#else.  { "Fr
38d0: 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  eeLibrary",     
38e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
38f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3900: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3910: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3920: 73 46 72 65 65 4c 69 62 72 61 72 79 20 28 28 42  sFreeLibrary ((B
3930: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f  OOL(WINAPI*)(HMO
3940: 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  DULE))aSyscall[1
3950: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  6].pCurrent)..  
3960: 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f  { "GetCurrentPro
3970: 63 65 73 73 49 64 22 2c 20 20 20 20 20 28 53 59  cessId",     (SY
3980: 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74  SCALL)GetCurrent
3990: 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30  ProcessId,     0
39a0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
39b0: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
39c0: 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  Id ((DWORD(WINAP
39d0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
39e0: 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[17].pCurrent)
39f0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
3a00: 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65  _WINCE && define
3a10: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3a20: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
3a30: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 22  tDiskFreeSpaceA"
3a40: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
3a50: 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  )GetDiskFreeSpac
3a60: 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  eA,       0 },.#
3a70: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73  else.  { "GetDis
3a80: 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 20 20  kFreeSpaceA",   
3a90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ab0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3ac0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3ad0: 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 20 28  DiskFreeSpaceA (
3ae0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
3af0: 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50  PCSTR,LPDWORD,LP
3b00: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c  DWORD,LPDWORD, \
3b10: 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44  .        LPDWORD
3b20: 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70  ))aSyscall[18].p
3b30: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
3b40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
3b50: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
3b60: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
3b70: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3b80: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73  IDE).  { "GetDis
3b90: 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20  kFreeSpaceW",   
3ba0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
3bb0: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20  DiskFreeSpaceW, 
3bc0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3bd0: 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65  .  { "GetDiskFre
3be0: 65 53 70 61 63 65 57 22 2c 20 20 20 20 20 20 20  eSpaceW",       
3bf0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3c20: 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b  define osGetDisk
3c30: 46 72 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f  FreeSpaceW ((BOO
3c40: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  L(WINAPI*)(LPCWS
3c50: 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f  TR,LPDWORD,LPDWO
3c60: 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20  RD,LPDWORD, \.  
3c70: 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61        LPDWORD))a
3c80: 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72  Syscall[19].pCur
3c90: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3ca0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3cb0: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47  HAS_ANSI).  { "G
3cc0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3cd0: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
3ce0: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
3cf0: 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tesA,      0 },.
3d00: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
3d10: 6c 65 41 74 74 72 69 62 75 74 65 73 41 22 2c 20  leAttributesA", 
3d20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3d50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
3d60: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
3d70: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
3d80: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
3d90: 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[20].pCurrent)
3da0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
3db0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
3dc0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3dd0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
3de0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
3df0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
3e00: 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  )GetFileAttribut
3e10: 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  esW,      0 },.#
3e20: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
3e30: 65 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20  eAttributesW",  
3e40: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3e70: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3e80: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 20  FileAttributesW 
3e90: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
3ea0: 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  (LPCWSTR))aSysca
3eb0: 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[21].pCurrent)
3ec0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
3ed0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3ee0: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c  IDE).  { "GetFil
3ef0: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c  eAttributesExW",
3f00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
3f10: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
3f20: 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  W,    0 },.#else
3f30: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
3f40: 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20  ributesExW",    
3f50: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f70: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3f80: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
3f90: 41 74 74 72 69 62 75 74 65 73 45 78 57 20 28 28  AttributesExW ((
3fa0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
3fb0: 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58  CWSTR,GET_FILEEX
3fc0: 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a  _INFO_LEVELS, \.
3fd0: 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29          LPVOID))
3fe0: 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75  aSyscall[22].pCu
3ff0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4000: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
4010: 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20   "GetFileSize", 
4020: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4030: 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65  CALL)GetFileSize
4040: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
4050: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4060: 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20  tFileSize",     
4070: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4080: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4090: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
40a0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
40b0: 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44  sGetFileSize ((D
40c0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
40d0: 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53  NDLE,LPDWORD))aS
40e0: 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72  yscall[23].pCurr
40f0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4100: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
4110: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4120: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
4130: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
4140: 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eA",        (SYS
4150: 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68  CALL)GetFullPath
4160: 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20  NameA,        0 
4170: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4180: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c  tFullPathNameA",
4190: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
41a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
41b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
41c0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
41d0: 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
41e0: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
41f0: 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c  *)(LPCSTR,DWORD,
4200: 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  LPSTR, \.       
4210: 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c   LPSTR*))aSyscal
4220: 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[24].pCurrent).
4230: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4240: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
4250: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
4260: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4270: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4280: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
4290: 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  W",        (SYSC
42a0: 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e  ALL)GetFullPathN
42b0: 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d  ameW,        0 }
42c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
42d0: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20  FullPathNameW", 
42e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
42f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4300: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4310: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4320: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
4330: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
4340: 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c  )(LPCWSTR,DWORD,
4350: 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  LPWSTR, \.      
4360: 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63    LPWSTR*))aSysc
4370: 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74  all[25].pCurrent
4380: 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45  )..  { "GetLastE
4390: 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20  rror",          
43a0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61    (SYSCALL)GetLa
43b0: 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  stError,        
43c0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
43d0: 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  e osGetLastError
43e0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
43f0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
4400: 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [26].pCurrent)..
4410: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
4420: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
4430: 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c  TENSION).#if SQL
4440: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
4450: 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41 64 64  * The GetProcAdd
4460: 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20  ressA() routine 
4470: 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
4480: 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e  e on Windows CE.
4490: 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63   */.  { "GetProc
44a0: 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20  AddressA",      
44b0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50     (SYSCALL)GetP
44c0: 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20 20  rocAddressA,    
44d0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
44e0: 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57    /* All other W
44f0: 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73  indows platforms
4500: 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63 41   expect GetProcA
4510: 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65  ddress() to take
4520: 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74  .  ** an ANSI st
4530: 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ring regardless 
4540: 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20  of the _UNICODE 
4550: 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22  setting */.  { "
4560: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22  GetProcAddressA"
4570: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
4580: 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73  LL)GetProcAddres
4590: 73 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  s,          0 },
45a0: 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20  .#endif.#else.  
45b0: 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73  { "GetProcAddres
45c0: 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  sA",         (SY
45d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
45f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4600: 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64  ine osGetProcAdd
4610: 72 65 73 73 41 20 28 28 46 41 52 50 52 4f 43 28  ressA ((FARPROC(
4620: 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45  WINAPI*)(HMODULE
4630: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53  , \.        LPCS
4640: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d  TR))aSyscall[27]
4650: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4660: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
4670: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49  .  { "GetSystemI
4680: 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20  nfo",           
4690: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
46a0: 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  emInfo,         
46b0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
46c0: 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22   "GetSystemInfo"
46d0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
46e0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4700: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4710: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e  ne osGetSystemIn
4720: 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  fo ((VOID(WINAPI
4730: 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f  *)(LPSYSTEM_INFO
4740: 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70  ))aSyscall[28].p
4750: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
4760: 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  etSystemTime",  
4770: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4780: 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c  L)GetSystemTime,
4790: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
47a0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79  .#define osGetSy
47b0: 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28  stemTime ((VOID(
47c0: 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45  WINAPI*)(LPSYSTE
47d0: 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  MTIME))aSyscall[
47e0: 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  29].pCurrent)..#
47f0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4800: 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74  NCE.  { "GetSyst
4810: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
4820: 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53  ", (SYSCALL)GetS
4830: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
4840: 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ime, 0 },.#else.
4850: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69    { "GetSystemTi
4860: 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28  meAsFileTime", (
4870: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
48a0: 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65  efine osGetSyste
48b0: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20  mTimeAsFileTime 
48c0: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
48d0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c   \.        LPFIL
48e0: 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  ETIME))aSyscall[
48f0: 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  30].pCurrent)..#
4900: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4910: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
4920: 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  ).  { "GetTempPa
4930: 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  thA",           
4940: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d   (SYSCALL)GetTem
4950: 70 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20  pPathA,         
4960: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4970: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22  { "GetTempPathA"
4980: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
4990: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
49b0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
49c0: 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74  ine osGetTempPat
49d0: 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  hA ((DWORD(WINAP
49e0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29  I*)(DWORD,LPSTR)
49f0: 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43  )aSyscall[31].pC
4a00: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4a10: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
4a20: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4a30: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4a40: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
4a50: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
4a60: 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50  SYSCALL)GetTempP
4a70: 61 74 68 57 2c 20 20 20 20 20 20 20 20 20 20 20  athW,           
4a80: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4a90: 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20  "GetTempPathW", 
4aa0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4ab0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4ad0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4ae0: 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57  e osGetTempPathW
4af0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
4b00: 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29  )(DWORD,LPWSTR))
4b10: 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75  aSyscall[32].pCu
4b20: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4b30: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
4b40: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c   "GetTickCount",
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4b60: 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e  CALL)GetTickCoun
4b70: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  t,            0 
4b80: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4b90: 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20  tTickCount",    
4ba0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4bb0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4bc0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4bd0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4be0: 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28  sGetTickCount ((
4bf0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56  DWORD(WINAPI*)(V
4c00: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33  OID))aSyscall[33
4c10: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4c20: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4c30: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
4c40: 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45    { "GetVersionE
4c50: 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  xA",           (
4c60: 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69  SYSCALL)GetVersi
4c70: 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20 20  onExA,          
4c80: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4c90: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c  "GetVersionExA",
4ca0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4cb0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4cd0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4ce0: 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78  e osGetVersionEx
4cf0: 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  A ((BOOL(WINAPI*
4d00: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  )( \.        LPO
4d10: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61  SVERSIONINFOA))a
4d20: 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72  Syscall[34].pCur
4d30: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
4d40: 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20  Alloc",         
4d50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
4d60: 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20  eapAlloc,       
4d70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
4d80: 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f  efine osHeapAllo
4d90: 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  c ((LPVOID(WINAP
4da0: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
4db0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
4dc0: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d  _T))aSyscall[35]
4dd0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4de0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
4df0: 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74 65  .  { "HeapCreate
4e00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4e10: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65  (SYSCALL)HeapCre
4e20: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
4e30: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4e40: 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20   "HeapCreate",  
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4e60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4e80: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4e90: 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65 20  ne osHeapCreate 
4ea0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
4eb0: 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20  )(DWORD,SIZE_T, 
4ec0: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
4ed0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70  ))aSyscall[36].p
4ee0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4ef0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
4f00: 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79 22   { "HeapDestroy"
4f10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4f20: 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74 72  YSCALL)HeapDestr
4f30: 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oy,             
4f40: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4f50: 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20  HeapDestroy",   
4f60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4f70: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4f90: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4fa0: 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20 28   osHeapDestroy (
4fb0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
4fc0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
4fd0: 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  37].pCurrent).. 
4fe0: 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20 20   { "HeapFree",  
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
5000: 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c  YSCALL)HeapFree,
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5030: 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28  HeapFree ((BOOL(
5040: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5050: 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53  DWORD,LPVOID))aS
5060: 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72  yscall[38].pCurr
5070: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52  ent)..  { "HeapR
5080: 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20  eAlloc",        
5090: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
50a0: 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20  apReAlloc,      
50b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
50c0: 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c  fine osHeapReAll
50d0: 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  oc ((LPVOID(WINA
50e0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
50f0: 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20  D,LPVOID, \.    
5100: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
5110: 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e  call[39].pCurren
5120: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a  t)..  { "HeapSiz
5130: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5140: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5150: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
5160: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5170: 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28  ne osHeapSize ((
5180: 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28  SIZE_T(WINAPI*)(
5190: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
51a0: 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29          LPCVOID)
51b0: 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43  )aSyscall[40].pC
51c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
51d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
51e0: 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65 22  { "HeapValidate"
51f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5200: 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61  SCALL)HeapValida
5210: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  te,            0
5220: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
5230: 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20  eapValidate",   
5240: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5250: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5260: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5270: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5280: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20 28  osHeapValidate (
5290: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
52a0: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20  ANDLE,DWORD, \. 
52b0: 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29         LPCVOID))
52c0: 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75  aSyscall[41].pCu
52d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
52e0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
52f0: 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64  _HAS_ANSI) && !d
5300: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5310: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
5320: 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  N).  { "LoadLibr
5330: 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20  aryA",          
5340: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c    (SYSCALL)LoadL
5350: 69 62 72 61 72 79 41 2c 20 20 20 20 20 20 20 20  ibraryA,        
5360: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5370: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41   { "LoadLibraryA
5380: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5390: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
53c0: 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61  fine osLoadLibra
53d0: 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49  ryA ((HMODULE(WI
53e0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
53f0: 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72  Syscall[42].pCur
5400: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5410: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
5420: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5430: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26  N32_HAS_WIDE) &&
5440: 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69   \.        !defi
5450: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5460: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
5470: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
5480: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
5490: 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72  SYSCALL)LoadLibr
54a0: 61 72 79 57 2c 20 20 20 20 20 20 20 20 20 20 20  aryW,           
54b0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
54c0: 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20  "LoadLibraryW", 
54d0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
54e0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5500: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5510: 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  e osLoadLibraryW
5520: 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50   ((HMODULE(WINAP
5530: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
5540: 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65  scall[43].pCurre
5550: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5560: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c  _OS_WINRT.  { "L
5570: 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20  ocalFree",      
5580: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5590: 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20  L)LocalFree,    
55a0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
55b0: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61 6c  #else.  { "Local
55c0: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
55d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5600: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
5610: 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c  calFree ((HLOCAL
5620: 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c  (WINAPI*)(HLOCAL
5630: 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70  ))aSyscall[44].p
5640: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5650: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
5660: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
5670: 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  RT.  { "LockFile
5680: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5690: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46    (SYSCALL)LockF
56a0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
56b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
56c0: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
56e0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0 },.#endif..#if
5710: 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a  ndef osLockFile.
5720: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69  #define osLockFi
5730: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
5740: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
5750: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
5760: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
5770: 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72  yscall[45].pCurr
5780: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
5790: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
57a0: 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45  E.  { "LockFileE
57b0: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  x",             
57c0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69   (SYSCALL)LockFi
57d0: 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20  leEx,           
57e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
57f0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  { "LockFileEx", 
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5810: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5830: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
5840: 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78  def osLockFileEx
5850: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46  .#define osLockF
5860: 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  ileEx ((BOOL(WIN
5870: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
5880: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  RD,DWORD,DWORD,D
5890: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
58a0: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
58b0: 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72  yscall[46].pCurr
58c0: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
58d0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
58e0: 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f   || (!SQLITE_OS_
58f0: 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
5900: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
5910: 4c 29 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77  L)).  { "MapView
5920: 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  OfFile",        
5930: 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56     (SYSCALL)MapV
5940: 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20  iewOfFile,      
5950: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5960: 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69    { "MapViewOfFi
5970: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  le",           (
5980: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
59b0: 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f  efine osMapViewO
59c0: 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28 57  fFile ((LPVOID(W
59d0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
59e0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
59f0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
5a00: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d  _T))aSyscall[47]
5a10: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5a20: 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  "MultiByteToWide
5a30: 43 68 61 72 22 2c 20 20 20 20 20 28 53 59 53 43  Char",     (SYSC
5a40: 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f 57  ALL)MultiByteToW
5a50: 69 64 65 43 68 61 72 2c 20 20 20 20 20 30 20 7d  ideChar,     0 }
5a60: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c  ,..#define osMul
5a70: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
5a80: 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28   ((int(WINAPI*)(
5a90: 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54  UINT,DWORD,LPCST
5aa0: 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a  R,int,LPWSTR, \.
5ab0: 20 20 20 20 20 20 20 20 69 6e 74 29 29 61 53 79          int))aSy
5ac0: 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65  scall[48].pCurre
5ad0: 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79 50  nt)..  { "QueryP
5ae0: 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
5af0: 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 65  r", (SYSCALL)Que
5b00: 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
5b10: 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66  nter, 0 },..#def
5b20: 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66 6f  ine osQueryPerfo
5b30: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 28  rmanceCounter ((
5b40: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c  BOOL(WINAPI*)( \
5b50: 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f 49  .        LARGE_I
5b60: 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63 61 6c  NTEGER*))aSyscal
5b70: 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[49].pCurrent).
5b80: 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22 2c  .  { "ReadFile",
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69 6c  (SYSCALL)ReadFil
5bb0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
5bc0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5bd0: 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f 4f  osReadFile ((BOO
5be0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
5bf0: 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c  E,LPVOID,DWORD,L
5c00: 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  PDWORD, \.      
5c10: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
5c20: 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75  aSyscall[50].pCu
5c30: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74  rrent)..  { "Set
5c40: 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  EndOfFile",     
5c50: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5c60: 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20  SetEndOfFile,   
5c70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
5c80: 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f  define osSetEndO
5c90: 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  fFile ((BOOL(WIN
5ca0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
5cb0: 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72  yscall[51].pCurr
5cc0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5cd0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
5ce0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c  SetFilePointer",
5cf0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5d00: 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  LL)SetFilePointe
5d10: 72 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  r,          0 },
5d20: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46  .#else.  { "SetF
5d30: 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20  ilePointer",    
5d40: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5d50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5d60: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5d70: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53  dif..#define osS
5d80: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 28  etFilePointer ((
5d90: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48  DWORD(WINAPI*)(H
5da0: 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47  ANDLE,LONG,PLONG
5db0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
5dc0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e  D))aSyscall[52].
5dd0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5de0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
5df0: 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20    { "Sleep",    
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5e10: 53 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20  SYSCALL)Sleep,  
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e30: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5e40: 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20  "Sleep",        
5e50: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5e60: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5e80: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5e90: 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f 49 44  e osSleep ((VOID
5ea0: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 29  (WINAPI*)(DWORD)
5eb0: 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43  )aSyscall[53].pC
5ec0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79  urrent)..  { "Sy
5ed0: 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
5ee0: 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  me",    (SYSCALL
5ef0: 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c  )SystemTimeToFil
5f00: 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a  eTime,    0 },..
5f10: 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74 65 6d  #define osSystem
5f20: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20 28  TimeToFileTime (
5f30: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43  (BOOL(WINAPI*)(C
5f40: 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d 45 2a  ONST SYSTEMTIME*
5f50: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  , \.        LPFI
5f60: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
5f70: 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [54].pCurrent)..
5f80: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5f90: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
5fa0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55 6e  OS_WINRT.  { "Un
5fb0: 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  lockFile",      
5fc0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5fd0: 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20  )UnlockFile,    
5fe0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5ff0: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  else.  { "Unlock
6000: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
6010: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6030: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6040: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e 6c  f..#ifndef osUnl
6050: 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20  ockFile.#define 
6060: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42  osUnlockFile ((B
6070: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6080: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
6090: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
60a0: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
60b0: 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  [55].pCurrent).#
60c0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49  endif..#if !SQLI
60d0: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20  TE_OS_WINCE.  { 
60e0: 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  "UnlockFileEx", 
60f0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6100: 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  ALL)UnlockFileEx
6110: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
6120: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c  ,.#else.  { "Unl
6130: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
6140: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6150: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6160: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6170: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6180: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42  UnlockFileEx ((B
6190: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
61a0: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
61b0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
61c0: 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61   LPOVERLAPPED))a
61d0: 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72  Syscall[56].pCur
61e0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
61f0: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21 64  E_OS_WINCE || !d
6200: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6210: 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 55 6e 6d  IT_WAL).  { "Unm
6220: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
6230: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6240: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  UnmapViewOfFile,
6250: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6260: 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69  lse.  { "UnmapVi
6270: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
6280: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
62b0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61  ..#define osUnma
62c0: 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f  pViewOfFile ((BO
62d0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56  OL(WINAPI*)(LPCV
62e0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37  OID))aSyscall[57
62f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6300: 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74   "WideCharToMult
6310: 69 42 79 74 65 22 2c 20 20 20 20 20 28 53 59 53  iByte",     (SYS
6320: 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d  CALL)WideCharToM
6330: 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30 20  ultiByte,     0 
6340: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69  },..#define osWi
6350: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
6360: 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  e ((int(WINAPI*)
6370: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57  (UINT,DWORD,LPCW
6380: 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e  STR,int,LPSTR,in
6390: 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  t, \.        LPC
63a0: 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73  STR,LPBOOL))aSys
63b0: 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e  call[58].pCurren
63c0: 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69  t)..  { "WriteFi
63d0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
63e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74     (SYSCALL)Writ
63f0: 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  eFile,          
6400: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6410: 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28  ne osWriteFile (
6420: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6430: 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57  ANDLE,LPCVOID,DW
6440: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
6450: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
6460: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39  PED))aSyscall[59
6470: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6480: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
6490: 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e  .  { "CreateEven
64a0: 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  tExW",          
64b0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 45  (SYSCALL)CreateE
64c0: 76 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20 20  ventExW,        
64d0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
64e0: 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57   "CreateEventExW
64f0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
6500: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6520: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6530: 6e 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74  ne osCreateEvent
6540: 45 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ExW ((HANDLE(WIN
6550: 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59  API*)(LPSECURITY
6560: 5f 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43 57  _ATTRIBUTES,LPCW
6570: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
6580: 57 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79 73  WORD,DWORD))aSys
6590: 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e  call[60].pCurren
65a0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
65b0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61  OS_WINRT.  { "Wa
65c0: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
65d0: 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  t",     (SYSCALL
65e0: 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  )WaitForSingleOb
65f0: 6a 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a 23  ject,     0 },.#
6600: 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f  else.  { "WaitFo
6610: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20  rSingleObject", 
6620: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6650: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69  f..#define osWai
6660: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
6670: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
6680: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
6690: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
66a0: 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74  all[61].pCurrent
66b0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
66c0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 74  _WINRT.  { "Wait
66d0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
66e0: 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 57  x",   (SYSCALL)W
66f0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
6700: 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65 6c  ctEx,   0 },.#el
6710: 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53  se.  { "WaitForS
6720: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20  ingleObjectEx", 
6730: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6750: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6760: 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46  .#define osWaitF
6770: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
6780: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
6790: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
67a0: 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29 29  \.        BOOL))
67b0: 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75  aSyscall[62].pCu
67c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
67d0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
67e0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  "SetFilePointerE
67f0: 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  x",        (SYSC
6800: 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74  ALL)SetFilePoint
6810: 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20 7d  erEx,        0 }
6820: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74  ,.#else.  { "Set
6830: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20  FilePointerEx", 
6840: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6850: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6860: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6870: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6880: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
6890: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
68a0: 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e  (HANDLE,LARGE_IN
68b0: 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20 20  TEGER, \.       
68c0: 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c   PLARGE_INTEGER,
68d0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
68e0: 36 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  63].pCurrent)..#
68f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
6900: 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49  RT.  { "GetFileI
6910: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
6920: 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29  leEx", (SYSCALL)
6930: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
6940: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30 20  onByHandleEx, 0 
6950: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
6960: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
6970: 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59  ByHandleEx", (SY
6980: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6990: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
69a0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
69b0: 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  sGetFileInformat
69c0: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28 28  ionByHandleEx ((
69d0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
69e0: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
69f0: 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e  FILE_INFO_BY_HAN
6a00: 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44  DLE_CLASS,LPVOID
6a10: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
6a20: 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [64].pCurrent)..
6a30: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
6a40: 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
6a50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
6a60: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46  .  { "MapViewOfF
6a70: 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20  ileFromApp",    
6a80: 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77  (SYSCALL)MapView
6a90: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 2c 20 20  OfFileFromApp,  
6aa0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6ab0: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46   "MapViewOfFileF
6ac0: 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53  romApp",    (SYS
6ad0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6af0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6b00: 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69  ne osMapViewOfFi
6b10: 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c 50 56 4f  leFromApp ((LPVO
6b20: 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  ID(WINAPI*)(HAND
6b30: 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34  LE,ULONG,ULONG64
6b40: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
6b50: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d  _T))aSyscall[65]
6b60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6b70: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6b80: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32    { "CreateFile2
6b90: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
6ba0: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
6bb0: 6c 65 32 2c 20 20 20 20 20 20 20 20 20 20 20 20  le2,            
6bc0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6bd0: 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20  "CreateFile2",  
6be0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6bf0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6c10: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6c20: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32 20  e osCreateFile2 
6c30: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
6c40: 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c  )(LPCWSTR,DWORD,
6c50: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
6c60: 20 20 20 20 20 20 20 4c 50 43 52 45 41 54 45 46         LPCREATEF
6c70: 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41  ILE2_EXTENDED_PA
6c80: 52 41 4d 45 54 45 52 53 29 29 61 53 79 73 63 61  RAMETERS))aSysca
6c90: 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[66].pCurrent)
6ca0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
6cb0: 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
6cc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
6cd0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
6ce0: 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c  { "LoadPackagedL
6cf0: 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 59  ibrary",     (SY
6d00: 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 67  SCALL)LoadPackag
6d10: 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20 20 30  edLibrary,     0
6d20: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
6d30: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
6d40: 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ry",     (SYSCAL
6d50: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6d60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6d70: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6d80: 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69  osLoadPackagedLi
6d90: 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c 45 28  brary ((HMODULE(
6da0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
6db0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
6dc0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e  D))aSyscall[67].
6dd0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
6de0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6df0: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
6e00: 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  64",          (S
6e10: 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f  YSCALL)GetTickCo
6e20: 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20 20 20  unt64,          
6e30: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6e40: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c  GetTickCount64",
6e50: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6e60: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6e80: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6e90: 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36   osGetTickCount6
6ea0: 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49  4 ((ULONGLONG(WI
6eb0: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
6ec0: 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65  scall[68].pCurre
6ed0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
6ee0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65  OS_WINRT.  { "Ge
6ef0: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
6f00: 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  o",     (SYSCALL
6f10: 29 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  )GetNativeSystem
6f20: 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a 23  Info,     0 },.#
6f30: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e 61 74  else.  { "GetNat
6f40: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  iveSystemInfo", 
6f50: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f70: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6f80: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
6f90: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
6fa0: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
6fb0: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59  ( \.        LPSY
6fc0: 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63  STEM_INFO))aSysc
6fd0: 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74  all[69].pCurrent
6fe0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
6ff0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
7000: 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74 70 75  ANSI).  { "Outpu
7010: 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20  tDebugStringA", 
7020: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75       (SYSCALL)Ou
7030: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
7040: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
7050: 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  e.  { "OutputDeb
7060: 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20  ugStringA",     
7070: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
70a0: 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74  #define osOutput
70b0: 44 65 62 75 67 53 74 72 69 6e 67 41 20 28 28 56  DebugStringA ((V
70c0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OID(WINAPI*)(LPC
70d0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 30  STR))aSyscall[70
70e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
70f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
7100: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
7110: 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67    { "OutputDebug
7120: 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28  StringW",      (
7130: 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65  SYSCALL)OutputDe
7140: 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20 20 20  bugStringW,     
7150: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7160: 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  "OutputDebugStri
7170: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
7180: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
71a0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
71b0: 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53  e osOutputDebugS
71c0: 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28 57 49  tringW ((VOID(WI
71d0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
71e0: 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75  aSyscall[71].pCu
71f0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
7200: 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20 20 20  ProcessHeap",   
7210: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7220: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 2c 20  GetProcessHeap, 
7230: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
7240: 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63  define osGetProc
7250: 65 73 73 48 65 61 70 20 28 28 48 41 4e 44 4c 45  essHeap ((HANDLE
7260: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
7270: 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75  aSyscall[72].pCu
7280: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7290: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
72a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
72b0: 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43 72  MIT_WAL).  { "Cr
72c0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
72d0: 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c  romApp", (SYSCAL
72e0: 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  L)CreateFileMapp
72f0: 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c  ingFromApp, 0 },
7300: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
7310: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
7320: 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29  mApp", (SYSCALL)
7330: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7340: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
7350: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
7360: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
7370: 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c 45  FromApp ((HANDLE
7380: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7390: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
73a0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
73b0: 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c  S,ULONG,ULONG64,
73c0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
73d0: 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[73].pCurrent).
73e0: 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68  .}; /* End of th
73f0: 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  e overrideable s
7400: 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a  ystem calls */..
7410: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
7420: 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  e xSetSystemCall
7430: 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c  () method of sql
7440: 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c  ite3_vfs for all
7450: 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33   of the.** "win3
7460: 32 22 20 56 46 53 65 73 2e 20 20 52 65 74 75 72  2" VFSes.  Retur
7470: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e  n SQLITE_OK opon
7480: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70   successfully up
7490: 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79  dating the.** sy
74a0: 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65  stem call pointe
74b0: 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54  r, or SQLITE_NOT
74c0: 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20 69  FOUND if there i
74d0: 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c  s no configurabl
74e0: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
74f0: 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f   named zName..*/
7500: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
7510: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
7520: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
7530: 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a  tUsed,        /*
7540: 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72   The VFS pointer
7550: 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  .  Not used */. 
7560: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
7570: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  me,            /
7580: 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d  * Name of system
7590: 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64   call to overrid
75a0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
75b0: 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46  yscall_ptr pNewF
75c0: 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  unc  /* Pointer 
75d0: 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61  to new system ca
75e0: 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20  ll value */.){. 
75f0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
7600: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
7610: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20  TE_NOTFOUND;..  
7620: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
7630: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  (pNotUsed);.  if
7640: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
7650: 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65    /* If no zName
7660: 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f   is given, resto
7670: 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61  re all system ca
7680: 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66  lls to their def
7690: 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74  ault.    ** sett
76a0: 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ings and return 
76b0: 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20  NULL.    */.    
76c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
76d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
76e0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
76f0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
7700: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
7710: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
7720: 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  .pDefault ){.   
7730: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
7740: 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73  .pCurrent = aSys
7750: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
7760: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7770: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
7780: 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63  If zName is spec
7790: 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f  ified, operate o
77a0: 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73  n only the one s
77b0: 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a  ystem call.    *
77c0: 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20  * specified..   
77d0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
77e0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
77f0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
7800: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
7810: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
7820: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
7830: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
7840: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73          if( aSys
7850: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
7860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7870: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
7880: 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c  fault = aSyscall
7890: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
78a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
78b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
78c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
78d0: 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75  Func==0 ) pNewFu
78e0: 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nc = aSyscall[i]
78f0: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
7900: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
7910: 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75  Current = pNewFu
7920: 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  nc;.        brea
7930: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
7940: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
7950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7960: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  n the value of a
7970: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
7980: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
7990: 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ame is not a.** 
79a0: 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65  recognized syste
79b0: 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55  m call name.  NU
79c0: 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  LL is also retur
79d0: 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65  ned if the syste
79e0: 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72  m call.** is cur
79f0: 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64  rently undefined
7a00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
7a10: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
7a20: 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
7a30: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
7a40: 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e  *pNotUsed,.  con
7a50: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
7a60: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
7a70: 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
7a80: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
7a90: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
7aa0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
7ab0: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
7ac0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
7ad0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
7ae0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
7af0: 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
7b00: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
7b10: 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrent;.  }.  ret
7b20: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7b30: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
7b40: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
7b50: 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a  tem call after z
7b60: 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d  Name.  If zName=
7b70: 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65  =NULL.** then re
7b80: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
7b90: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
7ba0: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
7bb0: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a  NULL if zName.**
7bc0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73   is the last sys
7bd0: 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a  tem call or if z
7be0: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Name is not the 
7bf0: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a  name of a valid.
7c00: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  ** system call..
7c10: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
7c20: 63 68 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73  char *winNextSys
7c30: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
7c40: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
7c50: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
7c60: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
7c70: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
7c80: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
7c90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7ca0: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
7cb0: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
7cc0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
7cd0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
7ce0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
7cf0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
7d00: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
7d10: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
7d20: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
7d30: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
7d40: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
7d50: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
7d60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
7d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
7d80: 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73  function outputs
7d90: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 28   the specified (
7da0: 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20  ANSI) string to 
7db0: 74 68 65 20 57 69 6e 33 32 20 64 65 62 75 67 67  the Win32 debugg
7dc0: 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61  er.** (if availa
7dd0: 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73  ble)..*/..void s
7de0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69  qlite3_win32_wri
7df0: 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74 20 63  te_debug(const c
7e00: 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e  har *zBuf, int n
7e10: 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a 44 62  Buf){.  char zDb
7e20: 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33  gBuf[SQLITE_WIN3
7e30: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b  2_DBG_BUF_SIZE];
7e40: 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49  .  int nMin = MI
7e50: 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54 45 5f  N(nBuf, (SQLITE_
7e60: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
7e70: 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79  ZE - 1)); /* may
7e80: 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f   be negative. */
7e90: 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29  .  if( nMin<-1 )
7ea0: 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61   nMin = -1; /* a
7eb0: 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75  ll negative valu
7ec0: 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f  es become -1. */
7ed0: 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d  .  assert( nMin=
7ee0: 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c  =-1 || nMin==0 |
7ef0: 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49  | nMin<SQLITE_WI
7f00: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
7f10: 20 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   );.#if defined(
7f20: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
7f30: 5f 41 4e 53 49 29 0a 20 20 69 66 28 20 6e 4d 69  _ANSI).  if( nMi
7f40: 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  n>0 ){.    memse
7f50: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
7f60: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
7f70: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65  UF_SIZE);.    me
7f80: 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42  mcpy(zDbgBuf, zB
7f90: 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f  uf, nMin);.    o
7fa0: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
7fb0: 6e 67 41 28 7a 44 62 67 42 75 66 29 3b 0a 20 20  ngA(zDbgBuf);.  
7fc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74  }else{.    osOut
7fd0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 28  putDebugStringA(
7fe0: 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66  zBuf);.  }.#elif
7ff0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
8000: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
8010: 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66    memset(zDbgBuf
8020: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  , 0, SQLITE_WIN3
8030: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b  2_DBG_BUF_SIZE);
8040: 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c 74 69 42  .  if ( osMultiB
8050: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 0a 20  yteToWideChar(. 
8060: 20 20 20 20 20 20 20 20 20 6f 73 41 72 65 46 69           osAreFi
8070: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43  leApisANSI() ? C
8080: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
8090: 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20  , 0, zBuf,.     
80a0: 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53       nMin, (LPWS
80b0: 54 52 29 7a 44 62 67 42 75 66 2c 20 53 51 4c 49  TR)zDbgBuf, SQLI
80c0: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
80d0: 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48  _SIZE/sizeof(WCH
80e0: 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72  AR))<=0 ){.    r
80f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f  eturn;.  }.  osO
8100: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
8110: 57 28 28 4c 50 43 57 53 54 52 29 7a 44 62 67 42  W((LPCWSTR)zDbgB
8120: 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  uf);.#else.  if(
8130: 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d   nMin>0 ){.    m
8140: 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30  emset(zDbgBuf, 0
8150: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
8160: 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20  BG_BUF_SIZE);.  
8170: 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66    memcpy(zDbgBuf
8180: 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20  , zBuf, nMin);. 
8190: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
81a0: 72 2c 20 22 25 73 22 2c 20 7a 44 62 67 42 75 66  r, "%s", zDbgBuf
81b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
81c0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
81d0: 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d  "%s", zBuf);.  }
81e0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
81f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
8200: 6f 75 74 69 6e 65 20 73 75 73 70 65 6e 64 73 20  outine suspends 
8210: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
8220: 61 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  ad for at least 
8230: 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e  ms.** millisecon
8240: 64 73 2e 20 20 54 68 69 73 20 69 73 20 65 71 75  ds.  This is equ
8250: 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 57  ivalent to the W
8260: 69 6e 33 32 20 53 6c 65 65 70 28 29 20 69 6e 74  in32 Sleep() int
8270: 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53  erface..*/.#if S
8280: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73  QLITE_OS_WINRT.s
8290: 74 61 74 69 63 20 48 41 4e 44 4c 45 20 73 6c 65  tatic HANDLE sle
82a0: 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65  epObj = NULL;.#e
82b0: 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74  ndif..void sqlit
82c0: 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 44  e3_win32_sleep(D
82d0: 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  WORD millisecond
82e0: 73 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  s){.#if SQLITE_O
82f0: 53 5f 57 49 4e 52 54 0a 20 20 69 66 20 28 20 73  S_WINRT.  if ( s
8300: 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b  leepObj==NULL ){
8310: 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20  .    sleepObj = 
8320: 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45 78 57  osCreateEventExW
8330: 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45  (NULL, NULL, CRE
8340: 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c  ATE_EVENT_MANUAL
8350: 5f 52 45 53 45 54 2c 0a 20 20 20 20 20 20 20 20  _RESET,.        
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 20 20 20 20 20 20 20 20 53 59 4e 43 48 52 4f 4e          SYNCHRON
8380: 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  IZE);.  }.  asse
8390: 72 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55  rt( sleepObj!=NU
83a0: 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f  LL );.  osWaitFo
83b0: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28  rSingleObjectEx(
83c0: 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73  sleepObj, millis
83d0: 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a  econds, FALSE);.
83e0: 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65 70 28  #else.  osSleep(
83f0: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23  milliseconds);.#
8400: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
8410: 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d  eturn true (non-
8420: 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20  zero) if we are 
8430: 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69  running under Wi
8440: 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58  nNT, Win2K, WinX
8450: 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20  P,.** or WinCE. 
8460: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a   Return false (z
8470: 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20  ero) for Win95, 
8480: 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e  Win98, or WinME.
8490: 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61  .**.** Here is a
84a0: 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62  n interesting ob
84b0: 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39  servation:  Win9
84c0: 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69  5, Win98, and Wi
84d0: 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20  nME lack.** the 
84e0: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
84f0: 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74  .  But we can st
8500: 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  ill statically l
8510: 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74  ink against that
8520: 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20  .** API as long 
8530: 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c  as we don't call
8540: 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67   it when running
8550: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41   Win95/98/ME.  A
8560: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73   call to.** this
8570: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
8580: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
8590: 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e   the host is Win
85a0: 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57  95/98/ME or.** W
85b0: 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68  inNT/2K/XP so th
85c0: 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  at we will know 
85d0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77  whether or not w
85e0: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c  e can safely cal
85f0: 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  l.** the LockFil
8600: 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69  eEx() API..*/.#i
8610: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
8620: 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  E || SQLITE_OS_W
8630: 49 4e 52 54 0a 23 20 64 65 66 69 6e 65 20 69 73  INRT.# define is
8640: 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20  NT()  (1).#elif 
8650: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8660: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
8670: 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29 20  # define isNT() 
8680: 20 28 30 29 0a 23 65 6c 73 65 0a 20 20 73 74 61   (0).#else.  sta
8690: 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76 6f 69  tic int isNT(voi
86a0: 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  d){.    if( sqli
86b0: 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29  te3_os_type==0 )
86c0: 7b 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49 4f  {.      OSVERSIO
86d0: 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20  NINFOA sInfo;.  
86e0: 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65      sInfo.dwOSVe
86f0: 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20  rsionInfoSize = 
8700: 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20  sizeof(sInfo);. 
8710: 20 20 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f       osGetVersio
8720: 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20  nExA(&sInfo);.  
8730: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74      sqlite3_os_t
8740: 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c  ype = sInfo.dwPl
8750: 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c  atformId==VER_PL
8760: 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20  ATFORM_WIN32_NT 
8770: 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20  ? 2 : 1;.    }. 
8780: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
8790: 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20 20  3_os_type==2;.  
87a0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
87b0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
87c0: 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  LLOC./*.** Alloc
87d0: 61 74 65 20 6e 42 79 74 65 73 20 6f 66 20 6d 65  ate nBytes of me
87e0: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
87f0: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c  void *winMemMall
8800: 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a  oc(int nBytes){.
8810: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
8820: 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69    void *p;..  wi
8830: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
8840: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
8850: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
8860: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
8870: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
8880: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
8890: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
88a0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
88b0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
88c0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
88d0: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
88e0: 65 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69  ert ( osHeapVali
88f0: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
8900: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
8910: 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65  AGS, NULL) );.#e
8920: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e  ndif.  assert( n
8930: 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20  Bytes>=0 );.  p 
8940: 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48  = osHeapAlloc(hH
8950: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
8960: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53  2_HEAP_FLAGS, (S
8970: 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20  IZE_T)nBytes);. 
8980: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73   if( !p ){.    s
8990: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
89a0: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
89b0: 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75   to HeapAlloc %u
89c0: 20 62 79 74 65 73 20 28 25 64 29 2c 20 68 65 61   bytes (%d), hea
89d0: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
89e0: 20 20 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f         nBytes, o
89f0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
8a00: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
8a10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
8a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65  }../*.** Free me
8a30: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
8a40: 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28  void winMemFree(
8a50: 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20  void *pPrior){. 
8a60: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a   HANDLE hHeap;..
8a70: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
8a80: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
8a90: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
8aa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
8ab0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
8ac0: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
8ad0: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
8ae0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
8af0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
8b00: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
8b10: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
8b20: 20 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70   assert ( osHeap
8b30: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
8b40: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
8b50: 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29  P_FLAGS, pPrior)
8b60: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   );.#endif.  if(
8b70: 20 21 70 50 72 69 6f 72 20 29 20 72 65 74 75 72   !pPrior ) retur
8b80: 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20 4e 55  n; /* Passing NU
8b90: 4c 4c 20 74 6f 20 48 65 61 70 46 72 65 65 20 69  LL to HeapFree i
8ba0: 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a 2f 0a  s undefined. */.
8bb0: 20 20 69 66 28 20 21 6f 73 48 65 61 70 46 72 65    if( !osHeapFre
8bc0: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
8bd0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
8be0: 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20  , pPrior) ){.   
8bf0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
8c00: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
8c10: 65 64 20 74 6f 20 48 65 61 70 46 72 65 65 20 62  ed to HeapFree b
8c20: 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c 20 68 65  lock %p (%d), he
8c30: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
8c40: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20          pPrior, 
8c50: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
8c60: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
8c70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
8c80: 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ange the size of
8c90: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d   an existing mem
8ca0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
8cb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
8cc0: 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69  inMemRealloc(voi
8cd0: 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e  d *pPrior, int n
8ce0: 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45  Bytes){.  HANDLE
8cf0: 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a   hHeap;.  void *
8d00: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
8d10: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
8d20: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
8d30: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
8d40: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
8d50: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
8d60: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
8d70: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
8d80: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
8d90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
8da0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
8db0: 45 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73  E).  assert ( os
8dc0: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
8dd0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
8de0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
8df0: 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ior) );.#endif. 
8e00: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e   assert( nBytes>
8e10: 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72  =0 );.  if( !pPr
8e20: 69 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f  ior ){.    p = o
8e30: 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70  sHeapAlloc(hHeap
8e40: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
8e50: 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45  EAP_FLAGS, (SIZE
8e60: 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65  _T)nBytes);.  }e
8e70: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48  lse{.    p = osH
8e80: 65 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70  eapReAlloc(hHeap
8e90: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
8ea0: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
8eb0: 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  r, (SIZE_T)nByte
8ec0: 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  s);.  }.  if( !p
8ed0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8ee0: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
8ef0: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20  , "failed to %s 
8f00: 25 75 20 62 79 74 65 73 20 28 25 64 29 2c 20 68  %u bytes (%d), h
8f10: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
8f20: 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20           pPrior 
8f30: 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20  ? "HeapReAlloc" 
8f40: 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e  : "HeapAlloc", n
8f50: 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74  Bytes, osGetLast
8f60: 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
8f70: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
8f80: 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65  hHeap);.  }.  re
8f90: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
8fa0: 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
8fb0: 20 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69   of an outstandi
8fc0: 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  ng allocation, i
8fd0: 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  n bytes..*/.stat
8fe0: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a  ic int winMemSiz
8ff0: 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41  e(void *p){.  HA
9000: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53 49  NDLE hHeap;.  SI
9010: 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65  ZE_T n;..  winMe
9020: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
9030: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
9040: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
9050: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
9060: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
9070: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
9080: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
9090: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
90a0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
90b0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
90c0: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
90d0: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
90e0: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
90f0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
9100: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
9110: 66 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  f.  if( !p ) ret
9120: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48  urn 0;.  n = osH
9130: 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53  eapSize(hHeap, S
9140: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
9150: 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66  _FLAGS, p);.  if
9160: 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20  ( n==(SIZE_T)-1 
9170: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
9180: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
9190: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
91a0: 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25  Size block %p (%
91b0: 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  d), heap=%p",.  
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
91d0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
91e0: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29  ), (void*)hHeap)
91f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
9200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
9210: 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  t)n;.}../*.** Ro
9220: 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74  und up a request
9230: 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78   size to the nex
9240: 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69  t valid allocati
9250: 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  on size..*/.stat
9260: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75  ic int winMemRou
9270: 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72  ndup(int n){.  r
9280: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
9290: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
92a0: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
92b0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e  tic int winMemIn
92c0: 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  it(void *pAppDat
92d0: 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61  a){.  winMemData
92e0: 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20   *pWinMemData = 
92f0: 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41  (winMemData *)pA
9300: 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21  ppData;..  if( !
9310: 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65  pWinMemData ) re
9320: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
9330: 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  R;.  assert( pWi
9340: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d  nMemData->magic=
9350: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b  =WINMEM_MAGIC );
9360: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
9370: 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45  _WINRT && SQLITE
9380: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41  _WIN32_HEAP_CREA
9390: 54 45 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  TE.  if( !pWinMe
93a0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a  mData->hHeap ){.
93b0: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
93c0: 3e 68 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43  >hHeap = osHeapC
93d0: 72 65 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e  reate(SQLITE_WIN
93e0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20  32_HEAP_FLAGS,. 
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9410: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
9420: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
9430: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9450: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
9460: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
9470: 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57  ZE);.    if( !pW
9480: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
9490: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
94a0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
94b0: 45 4d 2c 0a 20 20 20 20 20 20 20 20 20 20 22 66  EM,.          "f
94c0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65  ailed to HeapCre
94d0: 61 74 65 20 28 25 64 29 2c 20 66 6c 61 67 73 3d  ate (%d), flags=
94e0: 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c  %u, initSize=%u,
94f0: 20 6d 61 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20   maxSize=%u",.  
9500: 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
9510: 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45  tError(), SQLITE
9520: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
9530: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  S,.          SQL
9540: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
9550: 4e 49 54 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45  NIT_SIZE, SQLITE
9560: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
9570: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 65 74  SIZE);.      ret
9580: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9590: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e  ;.    }.    pWin
95a0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
95b0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 61 73 73 65  = TRUE;.    asse
95c0: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
95d0: 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23  >bOwned );.  }.#
95e0: 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61  else.  pWinMemDa
95f0: 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47 65  ta->hHeap = osGe
9600: 74 50 72 6f 63 65 73 73 48 65 61 70 28 29 3b 0a  tProcessHeap();.
9610: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
9620: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
9630: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
9640: 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20  ITE_NOMEM,.     
9650: 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 47 65     "failed to Ge
9660: 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 25 64  tProcessHeap (%d
9670: 29 22 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  )", osGetLastErr
9680: 6f 72 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72  or());.    retur
9690: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
96a0: 20 20 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74    }.  pWinMemDat
96b0: 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53  a->bOwned = FALS
96c0: 45 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 57  E;.  assert( !pW
96d0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
96e0: 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  d );.#endif.  as
96f0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
9700: 61 2d 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  a->hHeap!=0 );. 
9710: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
9720: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56  Data->hHeap!=INV
9730: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
9740: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
9750: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
9760: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
9770: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
9780: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
9790: 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e  eapValidate(pWin
97a0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20  MemData->hHeap, 
97b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
97c0: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
97d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
97e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
97f0: 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69  /*.** Deinitiali
9800: 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  ze this module..
9810: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
9820: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f  inMemShutdown(vo
9830: 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20  id *pAppData){. 
9840: 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69   winMemData *pWi
9850: 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d  nMemData = (winM
9860: 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74  emData *)pAppDat
9870: 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d  a;..  if( !pWinM
9880: 65 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 3b  emData ) return;
9890: 0a 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61  .  if( pWinMemDa
98a0: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
98b0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
98c0: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56  Data->hHeap!=INV
98d0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
98e0: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
98f0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
9900: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
9910: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
9920: 45 29 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  E).    assert( o
9930: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57  sHeapValidate(pW
9940: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
9950: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
9960: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29  EAP_FLAGS, NULL)
9970: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69   );.#endif.    i
9980: 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  f( pWinMemData->
9990: 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20  bOwned ){.      
99a0: 69 66 28 20 21 6f 73 48 65 61 70 44 65 73 74 72  if( !osHeapDestr
99b0: 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  oy(pWinMemData->
99c0: 68 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20  hHeap) ){.      
99d0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
99e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
99f0: 6c 65 64 20 74 6f 20 48 65 61 70 44 65 73 74 72  led to HeapDestr
9a00: 6f 79 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  oy (%d), heap=%p
9a10: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
9a20: 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74         osGetLast
9a30: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
9a40: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
9a50: 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ap);.      }.   
9a60: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
9a70: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
9a80: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
9a90: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e  mData->hHeap = N
9aa0: 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ULL;.  }.}../*.*
9ab0: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c  * Populate the l
9ac0: 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20  ow-level memory 
9ad0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74  allocation funct
9ae0: 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a  ion pointers in.
9af0: 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ** sqlite3Global
9b00: 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f  Config.m with po
9b10: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f  inters to the ro
9b20: 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66  utines in this f
9b30: 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75  ile. The.** argu
9b40: 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68  ments specify th
9b50: 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
9b60: 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a  y to manage..**.
9b70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9b80: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
9b90: 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  y sqlite3_config
9ba0: 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72  (), and therefor
9bb0: 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75  e.** is not requ
9bc0: 69 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61  ired to be threa
9bd0: 64 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74  dsafe (it is not
9be0: 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69  )..*/.const sqli
9bf0: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
9c00: 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69  *sqlite3MemGetWi
9c10: 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  n32(void){.  sta
9c20: 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
9c30: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69  3_mem_methods wi
9c40: 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a  nMemMethods = {.
9c50: 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63      winMemMalloc
9c60: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65  ,.    winMemFree
9c70: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c  ,.    winMemReal
9c80: 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53  loc,.    winMemS
9c90: 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52  ize,.    winMemR
9ca0: 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d  oundup,.    winM
9cb0: 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d  emInit,.    winM
9cc0: 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20  emShutdown,.    
9cd0: 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20  &win_mem_data.  
9ce0: 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e  };.  return &win
9cf0: 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76  MemMethods;.}..v
9d00: 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65  oid sqlite3MemSe
9d10: 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a  tDefault(void){.
9d20: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
9d30: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d  (SQLITE_CONFIG_M
9d40: 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65  ALLOC, sqlite3Me
9d50: 6d 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a  mGetWin32());.}.
9d60: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9d70: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f  _WIN32_MALLOC */
9d80: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
9d90: 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74  a UTF-8 string t
9da0: 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  o Microsoft Unic
9db0: 6f 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a  ode (UTF-16?). .
9dc0: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
9dd0: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
9de0: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
9df0: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
9e00: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54  .*/.static LPWST
9e10: 52 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  R utf8ToUnicode(
9e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
9e30: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43  ename){.  int nC
9e40: 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57  har;.  LPWSTR zW
9e50: 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20  ideFilename;..  
9e60: 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42  nChar = osMultiB
9e70: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
9e80: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
9e90: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30  ame, -1, NULL, 0
9ea0: 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
9eb0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
9ec0: 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69  0;.  }.  zWideFi
9ed0: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
9ee0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61  MallocZero( nCha
9ef0: 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69  r*sizeof(zWideFi
9f00: 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20  lename[0]) );.  
9f10: 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  if( zWideFilenam
9f20: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
9f30: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61  rn 0;.  }.  nCha
9f40: 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  r = osMultiByteT
9f50: 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46  oWideChar(CP_UTF
9f60: 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  8, 0, zFilename,
9f70: 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61   -1, zWideFilena
9f80: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66      nChar);.  if
9fb0: 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
9fc0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9fd0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  WideFilename);. 
9fe0: 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65     zWideFilename
9ff0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
a000: 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  rn zWideFilename
a010: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
a020: 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  rt Microsoft Uni
a030: 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20  code to UTF-8.  
a040: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
a050: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
a060: 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  g is.** obtained
a070: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
a080: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
a090: 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54  c char *unicodeT
a0a0: 6f 55 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57  oUtf8(LPCWSTR zW
a0b0: 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20  ideFilename){.  
a0c0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61  int nByte;.  cha
a0d0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20  r *zFilename;.. 
a0e0: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
a0f0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43  harToMultiByte(C
a100: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65  P_UTF8, 0, zWide
a110: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c  Filename, -1, 0,
a120: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
a130: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
a140: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
a150: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73  .  zFilename = s
a160: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
a170: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
a180: 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b   zFilename==0 ){
a190: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a1a0: 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57   }.  nByte = osW
a1b0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
a1c0: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
a1d0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
a1e0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79  , zFilename, nBy
a1f0: 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a210: 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28      0, 0);.  if(
a220: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
a230: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a240: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
a250: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
a260: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c   }.  return zFil
a270: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
a280: 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53 49 20  Convert an ANSI 
a290: 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73  string to Micros
a2a0: 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20 62 61 73  oft Unicode, bas
a2b0: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72  ed on the.** cur
a2c0: 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20 73 65  rent codepage se
a2d0: 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c 65 20  ttings for file 
a2e0: 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61  apis..** .** Spa
a2f0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
a300: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
a310: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
a320: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
a330: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57  c..*/.static LPW
a340: 53 54 52 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64  STR mbcsToUnicod
a350: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
a360: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
a370: 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20  nByte;.  LPWSTR 
a380: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20  zMbcsFilename;. 
a390: 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20   int codepage = 
a3a0: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
a3b0: 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43  I() ? CP_ACP : C
a3c0: 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74  P_OEMCP;..  nByt
a3d0: 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  e = osMultiByteT
a3e0: 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61  oWideChar(codepa
a3f0: 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  ge, 0, zFilename
a400: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  , -1, NULL,.    
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a420: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 2a 73              0)*s
a430: 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20  izeof(WCHAR);.  
a440: 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
a450: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a460: 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  }.  zMbcsFilenam
a470: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
a480: 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a  cZero( nByte*siz
a490: 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  eof(zMbcsFilenam
a4a0: 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a  e[0]) );.  if( z
a4b0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  MbcsFilename==0 
a4c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
a4d0: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
a4e0: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
a4f0: 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30  Char(codepage, 0
a500: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
a510: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a   zMbcsFilename,.
a520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42  nByte);.  if( nB
a550: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  yte==0 ){.    sq
a560: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73  lite3_free(zMbcs
a570: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
a580: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30  MbcsFilename = 0
a590: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
a5a0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  MbcsFilename;.}.
a5b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d  ./*.** Convert M
a5c0: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
a5d0: 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20 63   to multi-byte c
a5e0: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c  haracter string,
a5f0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
a600: 20 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f 64   user's ANSI cod
a610: 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  epage..**.** Spa
a620: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
a630: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
a640: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
a650: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
a660: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
a670: 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d 62  har *unicodeToMb
a680: 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  cs(LPCWSTR zWide
a690: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
a6a0: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
a6b0: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74  zFilename;.  int
a6c0: 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72   codepage = osAr
a6d0: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
a6e0: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
a6f0: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
a700: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
a710: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
a720: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
a730: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
a740: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
a750: 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  = 0 ){.    retur
a760: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
a770: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
a780: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20  llocZero( nByte 
a790: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
a7a0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
a7b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
a7c0: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
a7d0: 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70  oMultiByte(codep
a7e0: 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  age, 0, zWideFil
a7f0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65  ename, -1, zFile
a800: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
a810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a820: 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20        nByte, 0, 
a830: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
a840: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
a850: 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61  te3_free(zFilena
a860: 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  me);.    zFilena
a870: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
a880: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
a890: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
a8a0: 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61   multibyte chara
a8b0: 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55  cter string to U
a8c0: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
a8d0: 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75  hold the.** retu
a8e0: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
a8f0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
a900: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
a910: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
a920: 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
a930: 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  f8(const char *z
a940: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61  Filename){.  cha
a950: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  r *zFilenameUtf8
a960: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57  ;.  LPWSTR zTmpW
a970: 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65  ide;..  zTmpWide
a980: 20 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65   = mbcsToUnicode
a990: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
a9a0: 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29  f( zTmpWide==0 )
a9b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a9c0: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55    }.  zFilenameU
a9d0: 74 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  tf8 = unicodeToU
a9e0: 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  tf8(zTmpWide);. 
a9f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
aa00: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
aa10: 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b  n zFilenameUtf8;
aa20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
aa30: 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69  t UTF-8 to multi
aa40: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
aa50: 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f  tring.  Space to
aa60: 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65   hold the .** re
aa70: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
aa80: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
aa90: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
aaa0: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
aab0: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
aac0: 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20  mbcs(const char 
aad0: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
aae0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62  har *zFilenameMb
aaf0: 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d  cs;.  LPWSTR zTm
ab00: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
ab10: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  de = utf8ToUnico
ab20: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
ab30: 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30   if( zTmpWide==0
ab40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
ab50: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
ab60: 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54  eMbcs = unicodeT
ab70: 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b  oMbcs(zTmpWide);
ab80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
ab90: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74  zTmpWide);.  ret
aba0: 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63  urn zFilenameMbc
abb0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s;.}../*.** This
abc0: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74   function sets t
abd0: 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
abe0: 79 20 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61  y or the tempora
abf0: 72 79 20 64 69 72 65 63 74 6f 72 79 20 62 61 73  ry directory bas
ac00: 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 72 6f  ed on.** the pro
ac10: 76 69 64 65 64 20 61 72 67 75 6d 65 6e 74 73 2e  vided arguments.
ac20: 20 20 54 68 65 20 74 79 70 65 20 61 72 67 75 6d    The type argum
ac30: 65 6e 74 20 6d 75 73 74 20 62 65 20 31 20 69 6e  ent must be 1 in
ac40: 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68   order to set th
ac50: 65 0a 2a 2a 20 64 61 74 61 20 64 69 72 65 63 74  e.** data direct
ac60: 6f 72 79 20 6f 72 20 32 20 69 6e 20 6f 72 64 65  ory or 2 in orde
ac70: 72 20 74 6f 20 73 65 74 20 74 68 65 20 74 65 6d  r to set the tem
ac80: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
ac90: 2e 20 20 54 68 65 20 7a 56 61 6c 75 65 0a 2a 2a  .  The zValue.**
aca0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
acb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72   name of the dir
acc0: 65 63 74 6f 72 79 20 74 6f 20 75 73 65 2e 20 20  ectory to use.  
acd0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
ace0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c 49   will be.** SQLI
acf0: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
ad00: 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ful..*/.int sqli
ad10: 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
ad20: 72 65 63 74 6f 72 79 28 44 57 4f 52 44 20 74 79  rectory(DWORD ty
ad30: 70 65 2c 20 4c 50 43 57 53 54 52 20 7a 56 61 6c  pe, LPCWSTR zVal
ad40: 75 65 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70  ue){.  char **pp
ad50: 44 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23  Directory = 0;.#
ad60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ad70: 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e  IT_AUTOINIT.  in
ad80: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69  t rc = sqlite3_i
ad90: 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69  nitialize();.  i
ada0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
adb0: 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  c;.#endif.  if( 
adc0: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e  type==SQLITE_WIN
add0: 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52  32_DATA_DIRECTOR
ade0: 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70  Y_TYPE ){.    pp
adf0: 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c  Directory = &sql
ae00: 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
ae10: 6f 72 79 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ory;.  }else if(
ae20: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
ae30: 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f  N32_TEMP_DIRECTO
ae40: 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70  RY_TYPE ){.    p
ae50: 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71  pDirectory = &sq
ae60: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
ae70: 74 6f 72 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65  tory;.  }.  asse
ae80: 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79  rt( !ppDirectory
ae90: 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45   || type==SQLITE
aea0: 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45  _WIN32_DATA_DIRE
aeb0: 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 20 20 20  CTORY_TYPE.     
aec0: 20 20 20 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51       || type==SQ
aed0: 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f  LITE_WIN32_TEMP_
aee0: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20  DIRECTORY_TYPE. 
aef0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
af00: 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 73 71  pDirectory || sq
af10: 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73  lite3MemdebugHas
af20: 54 79 70 65 28 2a 70 70 44 69 72 65 63 74 6f 72  Type(*ppDirector
af30: 79 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41 50 29  y, MEMTYPE_HEAP)
af40: 20 29 3b 0a 20 20 69 66 28 20 70 70 44 69 72 65   );.  if( ppDire
af50: 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 63 68 61  ctory ){.    cha
af60: 72 20 2a 7a 56 61 6c 75 65 55 74 66 38 20 3d 20  r *zValueUtf8 = 
af70: 30 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 6c 75  0;.    if( zValu
af80: 65 20 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29  e && zValue[0] )
af90: 7b 0a 20 20 20 20 20 20 7a 56 61 6c 75 65 55 74  {.      zValueUt
afa0: 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  f8 = unicodeToUt
afb0: 66 38 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20  f8(zValue);.    
afc0: 20 20 69 66 20 28 20 7a 56 61 6c 75 65 55 74 66    if ( zValueUtf
afd0: 38 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  8==0 ){.        
afe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
aff0: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
b000: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
b010: 72 65 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79  ree(*ppDirectory
b020: 29 3b 0a 20 20 20 20 2a 70 70 44 69 72 65 63 74  );.    *ppDirect
b030: 6f 72 79 20 3d 20 7a 56 61 6c 75 65 55 74 66 38  ory = zValueUtf8
b040: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
b050: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
b060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
b070: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  R;.}../*.** The 
b080: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
b090: 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a  getLastErrorMsg.
b0a0: 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
b0b0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
b0c0: 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
b0d0: 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
b0e0: 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
b0f0: 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
b100: 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a   truncated)..*/.
b110: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4c 61  static int getLa
b120: 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44  stErrorMsg(DWORD
b130: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20   lastErrno, int 
b140: 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
b150: 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65  ){.  /* FormatMe
b160: 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20  ssage returns 0 
b170: 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68  on failure.  Oth
b180: 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72  erwise it.  ** r
b190: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
b1a0: 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74  r of TCHARs writ
b1b0: 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ten to the outpu
b1c0: 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65  t.  ** buffer, e
b1d0: 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72  xcluding the ter
b1e0: 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68  minating null ch
b1f0: 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44  ar..  */.  DWORD
b200: 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68   dwLen = 0;.  ch
b210: 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20  ar *zOut = 0;.. 
b220: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23   if( isNT() ){.#
b230: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
b240: 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65  RT.    WCHAR zTe
b250: 6d 70 57 69 64 65 5b 4d 41 58 5f 50 41 54 48 2b  mpWide[MAX_PATH+
b260: 31 5d 3b 20 2f 2a 20 4e 4f 54 45 3a 20 53 6f 6d  1]; /* NOTE: Som
b270: 65 77 68 61 74 20 61 72 62 69 74 72 61 72 79 2e  ewhat arbitrary.
b280: 20 2a 2f 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20   */.    dwLen = 
b290: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  osFormatMessageW
b2a0: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
b2b0: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
b2e0: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
b2f0: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b310: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b330: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72            lastEr
b340: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b380: 20 20 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20    zTempWide,.   
b390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3a0: 20 20 20 20 20 20 20 20 20 20 4d 41 58 5f 50 41            MAX_PA
b3b0: 54 48 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TH,.            
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3d0: 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c   0);.#else.    L
b3e0: 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20  PWSTR zTempWide 
b3f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65  = NULL;.    dwLe
b400: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
b410: 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageW(FORMAT_MESS
b420: 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46  AGE_ALLOCATE_BUF
b430: 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20  FER |.          
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b450: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
b460: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
b490: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
b4a0: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74              last
b4f0: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 20 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54      (LPWSTR) &zT
b540: 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20  empWide,.       
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b580: 20 20 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66        0);.#endif
b590: 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e  .    if( dwLen >
b5a0: 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61   0 ){.      /* a
b5b0: 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72  llocate a buffer
b5c0: 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20   and convert to 
b5d0: 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71  UTF8 */.      sq
b5e0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
b5f0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
b600: 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f  zOut = unicodeTo
b610: 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b  Utf8(zTempWide);
b620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
b630: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
b640: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
b650: 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66  WINRT.      /* f
b660: 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62  ree the system b
b670: 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
b680: 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  by FormatMessage
b690: 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61   */.      osLoca
b6a0: 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29  lFree(zTempWide)
b6b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
b6c0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
b6d0: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
b6e0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72    else{.    char
b6f0: 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a   *zTemp = NULL;.
b700: 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f      dwLen = osFo
b710: 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52  rmatMessageA(FOR
b720: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f  MAT_MESSAGE_ALLO
b730: 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20  CATE_BUFFER |.  
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b750: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
b760: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
b770: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b790: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
b7a0: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
b7b0: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7d0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b830: 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 53              (LPS
b840: 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20  TR) &zTemp,.    
b850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b860: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20           0);.   
b890: 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29   if( dwLen > 0 )
b8a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  {.      /* alloc
b8b0: 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64  ate a buffer and
b8c0: 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38   convert to UTF8
b8d0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
b8e0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
b8f0: 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74  oc();.      zOut
b900: 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
b910: 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54  _mbcs_to_utf8(zT
b920: 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  emp);.      sqli
b930: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
b940: 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66  oc();.      /* f
b950: 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62  ree the system b
b960: 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
b970: 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  by FormatMessage
b980: 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61   */.      osLoca
b990: 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  lFree(zTemp);.  
b9a0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
b9b0: 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20   if( 0 == dwLen 
b9c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
b9d0: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
b9e0: 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25  uf, "OsError 0x%
b9f0: 78 20 28 25 75 29 22 2c 20 6c 61 73 74 45 72 72  x (%u)", lastErr
ba00: 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a  no, lastErrno);.
ba10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
ba20: 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f  copy a maximum o
ba30: 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20  f nBuf chars to 
ba40: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  output buffer */
ba50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
ba60: 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
ba70: 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
ba80: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55     /* free the U
ba90: 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  TF8 buffer */.  
baa0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
bab0: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Out);.  }.  retu
bac0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  rn 0;.}../*.**.*
bad0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
bae0: 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c  - winLogErrorAtL
baf0: 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20  ine() - is only 
bb00: 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20  ever called via 
bb10: 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e  the macro.** win
bb20: 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a  LogError()..**.*
bb30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
bb40: 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20  s invoked after 
bb50: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
bb60: 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f  in an OS functio
bb70: 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20  n..** It logs a 
bb80: 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
bb90: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74  lite3_log() cont
bba0: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
bbb0: 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65  nt value of.** e
bbc0: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69  rror code and, i
bbd0: 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
bbe0: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
bbf0: 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a  quivalent from .
bc00: 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  ** FormatMessage
bc10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
bc20: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
bc30: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
bc40: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
bc50: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
bc60: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
bc70: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
bc80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
bc90: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
bca0: 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20  TOPEN). .** The 
bcb0: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
bcc0: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
bcd0: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
bce0: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
bcf0: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e  hat.** failed an
bd00: 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  d the associated
bd10: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74   file-system pat
bd20: 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  h, if any..*/.#d
bd30: 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f  efine winLogErro
bd40: 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e  r(a,b,c,d)   win
bd50: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
bd60: 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29  ,b,c,d,__LINE__)
bd70: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
bd80: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20  ogErrorAtLine(. 
bd90: 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20   int errcode,   
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72   /* SQLite error
bdc0: 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44   code */.  DWORD
bdd0: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20   lastErrno,     
bde0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69             /* Wi
bdf0: 6e 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a  n32 last error *
be00: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
be10: 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20  zFunc,          
be20: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f      /* Name of O
be30: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  S function that 
be40: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  failed */.  cons
be50: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
be60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
be70: 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61  ile path associa
be80: 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a  ted with error *
be90: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20  /.  int iLine   
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
beb0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69      /* Source li
bec0: 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  ne number where 
bed0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
bee0: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67  /.){.  char zMsg
bef0: 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [500];          
bf00: 20 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20         /* Human 
bf10: 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74  readable error t
bf20: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ext */.  int i; 
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
bf50: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a   counter */..  z
bf60: 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 67 65  Msg[0] = 0;.  ge
bf70: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6c 61  tLastErrorMsg(la
bf80: 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28  stErrno, sizeof(
bf90: 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20  zMsg), zMsg);.  
bfa0: 61 73 73 65 72 74 28 20 65 72 72 63 6f 64 65 21  assert( errcode!
bfb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
bfc0: 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a  if( zPath==0 ) z
bfd0: 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72  Path = "";.  for
bfe0: 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26  (i=0; zMsg[i] &&
bff0: 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26   zMsg[i]!='\r' &
c000: 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b  & zMsg[i]!='\n';
c010: 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69   i++){}.  zMsg[i
c020: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
c030: 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20  _log(errcode,.  
c040: 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64      "os_win.c:%d
c050: 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20  : (%d) %s(%s) - 
c060: 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65  %s",.      iLine
c070: 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75  , lastErrno, zFu
c080: 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a  nc, zPath, zMsg.
c090: 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65    );..  return e
c0a0: 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrcode;.}../*.**
c0b0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
c0c0: 69 6d 65 73 20 74 68 61 74 20 61 20 52 65 61 64  imes that a Read
c0d0: 46 69 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c  File(), WriteFil
c0e0: 65 28 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46  e(), and DeleteF
c0f0: 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65  ile().** will be
c100: 20 72 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69   retried followi
c110: 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72  ng a locking err
c120: 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61  or - probably ca
c130: 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e 74 69  used by .** anti
c140: 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 2e 20  virus software. 
c150: 20 41 6c 73 6f 20 74 68 65 20 69 6e 69 74 69 61   Also the initia
c160: 6c 20 64 65 6c 61 79 20 62 65 66 6f 72 65 20 74  l delay before t
c170: 68 65 20 66 69 72 73 74 20 72 65 74 72 79 2e 0a  he first retry..
c180: 2a 2a 20 54 68 65 20 64 65 6c 61 79 20 69 6e 63  ** The delay inc
c190: 72 65 61 73 65 73 20 6c 69 6e 65 61 72 6c 79 20  reases linearly 
c1a0: 77 69 74 68 20 65 61 63 68 20 72 65 74 72 79 2e  with each retry.
c1b0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
c1c0: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
c1d0: 45 54 52 59 0a 23 20 64 65 66 69 6e 65 20 53 51  ETRY.# define SQ
c1e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
c1f0: 5f 52 45 54 52 59 20 31 30 0a 23 65 6e 64 69 66  _RETRY 10.#endif
c200: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c210: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
c220: 59 5f 44 45 4c 41 59 0a 23 20 64 65 66 69 6e 65  Y_DELAY.# define
c230: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
c240: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 20  ERR_RETRY_DELAY 
c250: 32 35 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  25.#endif.static
c260: 20 69 6e 74 20 77 69 6e 33 32 49 6f 65 72 72 52   int win32IoerrR
c270: 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  etry = SQLITE_WI
c280: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 3b  N32_IOERR_RETRY;
c290: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33  .static int win3
c2a0: 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  2IoerrRetryDelay
c2b0: 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   = SQLITE_WIN32_
c2c0: 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
c2d0: 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52  Y;../*.** If a R
c2e0: 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69  eadFile() or Wri
c2f0: 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f  teFile() error o
c300: 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68  ccurs, invoke th
c310: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f  is routine.** to
c320: 20 73 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c   see if it shoul
c330: 64 20 62 65 20 72 65 74 72 69 65 64 2e 20 20 52  d be retried.  R
c340: 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65  eturn TRUE to re
c350: 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  try.  Return FAL
c360: 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70  SE.** to give up
c370: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a   with an error..
c380: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
c390: 74 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e  tryIoerr(int *pn
c3a0: 52 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70 45  Retry, DWORD *pE
c3b0: 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20 65  rror){.  DWORD e
c3c0: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
c3d0: 72 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65  r();.  if( *pnRe
c3e0: 74 72 79 3e 3d 77 69 6e 33 32 49 6f 65 72 72 52  try>=win32IoerrR
c3f0: 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20  etry ){.    if( 
c400: 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  pError ){.      
c410: 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20  *pError = e;.   
c420: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   }.    return 0;
c430: 0a 20 20 7d 0a 20 20 69 66 28 20 65 3d 3d 45 52  .  }.  if( e==ER
c440: 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45  ROR_ACCESS_DENIE
c450: 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52  D ||.      e==ER
c460: 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49  ROR_LOCK_VIOLATI
c470: 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45  ON ||.      e==E
c480: 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f  RROR_SHARING_VIO
c490: 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71  LATION ){.    sq
c4a0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
c4b0: 70 28 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72  p(win32IoerrRetr
c4c0: 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74  yDelay*(1+*pnRet
c4d0: 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52  ry));.    ++*pnR
c4e0: 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e  etry;.    return
c4f0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
c500: 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72  rror ){.    *pEr
c510: 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72  ror = e;.  }.  r
c520: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
c530: 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f  * Log a I/O erro
c540: 72 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e  r retry episode.
c550: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c560: 6c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65  logIoerr(int nRe
c570: 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74  try){.  if( nRet
c580: 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ry ){.    sqlite
c590: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45  3_log(SQLITE_IOE
c5a0: 52 52 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61  RR, .      "dela
c5b0: 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63  yed %dms for loc
c5c0: 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69  k/sharing confli
c5d0: 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 33 32  ct",.      win32
c5e0: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
c5f0: 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31  nRetry*(nRetry+1
c600: 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  )/2.    );.  }.}
c610: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
c620: 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  WINCE./*********
c630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c670: 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e  .** This section
c680: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66   contains code f
c690: 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a  or WinCE only..*
c6a0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
c6b0: 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
c6c0: 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51  TIME_API) || !SQ
c6d0: 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
c6e0: 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68  IME_API./*.** Th
c6f0: 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69  e MSVC CRT on Wi
c700: 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74  ndows CE may not
c710: 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d   have a localtim
c720: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  e() function.  S
c730: 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75  o.** create a su
c740: 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e  bstitute..*/.#in
c750: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
c760: 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63  truct tm *__cdec
c770: 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73  l localtime(cons
c780: 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20  t time_t *t).{. 
c790: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74   static struct t
c7a0: 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20  m y;.  FILETIME 
c7b0: 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54  uTm, lTm;.  SYST
c7c0: 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71  EMTIME pTm;.  sq
c7d0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b  lite3_int64 t64;
c7e0: 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74  .  t64 = *t;.  t
c7f0: 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34  64 = (t64 + 1164
c800: 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30  4473600)*1000000
c810: 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61  0;.  uTm.dwLowDa
c820: 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29  teTime = (DWORD)
c830: 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46  (t64 & 0xFFFFFFF
c840: 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68  F);.  uTm.dwHigh
c850: 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44  DateTime= (DWORD
c860: 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20  )(t64 >> 32);.  
c870: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
c880: 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26  lFileTime(&uTm,&
c890: 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69  lTm);.  osFileTi
c8a0: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26  meToSystemTime(&
c8b0: 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74  lTm,&pTm);.  y.t
c8c0: 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65  m_year = pTm.wYe
c8d0: 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74  ar - 1900;.  y.t
c8e0: 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e  m_mon = pTm.wMon
c8f0: 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77  th - 1;.  y.tm_w
c900: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66  day = pTm.wDayOf
c910: 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61  Week;.  y.tm_mda
c920: 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20  y = pTm.wDay;.  
c930: 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e  y.tm_hour = pTm.
c940: 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69  wHour;.  y.tm_mi
c950: 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b  n = pTm.wMinute;
c960: 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54  .  y.tm_sec = pT
c970: 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74  m.wSecond;.  ret
c980: 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66  urn &y;.}.#endif
c990: 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45  ..#define HANDLE
c9a0: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28  _TO_WINFILE(a) (
c9b0: 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72  winFile*)&((char
c9c0: 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65  *)a)[-(int)offse
c9d0: 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a  tof(winFile,h)].
c9e0: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
c9f0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e   lock on the han
ca00: 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20  dle h.*/.static 
ca10: 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41  void winceMutexA
ca20: 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29  cquire(HANDLE h)
ca30: 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72  {.   DWORD dwErr
ca40: 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64  ;.   do {.     d
ca50: 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72  wErr = osWaitFor
ca60: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20  SingleObject(h, 
ca70: 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20  INFINITE);.   } 
ca80: 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20  while (dwErr != 
ca90: 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26  WAIT_OBJECT_0 &&
caa0: 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41   dwErr != WAIT_A
cab0: 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a  BANDONED);.}./*.
cac0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63  ** Release a loc
cad0: 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69  k acquired by wi
cae0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
caf0: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ).*/.#define win
cb00: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68  ceMutexRelease(h
cb10: 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68  ) ReleaseMutex(h
cb20: 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  )../*.** Create 
cb30: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68  the mutex and sh
cb40: 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64  ared memory used
cb50: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20   for locking in 
cb60: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  the file.** desc
cb70: 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a  riptor pFile.*/.
cb80: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65  static int wince
cb90: 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74  CreateLock(const
cba0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
cbb0: 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  , winFile *pFile
cbc0: 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b  ){.  LPWSTR zTok
cbd0: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65  ;.  LPWSTR zName
cbe0: 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
cbf0: 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67  rno;.  BOOL bLog
cc00: 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42  ged = FALSE;.  B
cc10: 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45  OOL bInit = TRUE
cc20: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 75 74 66  ;..  zName = utf
cc30: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
cc40: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  name);.  if( zNa
cc50: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
cc60: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f  out of memory */
cc70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
cc80: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
cc90: 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
cca0: 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c  lize the local l
ccb0: 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d  ockdata */.  mem
ccc0: 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61  set(&pFile->loca
ccd0: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69  l, 0, sizeof(pFi
cce0: 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20  le->local));..  
ccf0: 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 62  /* Replace the b
cd00: 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20  ackslashes from 
cd10: 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  the filename and
cd20: 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20   lowercase it.  
cd30: 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d  ** to derive a m
cd40: 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20  utex name. */.  
cd50: 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77  zTok = osCharLow
cd60: 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f  erW(zName);.  fo
cd70: 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b  r (;*zTok;zTok++
cd80: 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b  ){.    if (*zTok
cd90: 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20   == '\\') *zTok 
cda0: 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  = '_';.  }..  /*
cdb0: 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65   Create/open the
cdc0: 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a   named mutex */.
cdd0: 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20    pFile->hMutex 
cde0: 3d 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57  = osCreateMutexW
cdf0: 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e  (NULL, FALSE, zN
ce00: 61 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69  ame);.  if (!pFi
ce10: 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20  le->hMutex){.   
ce20: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
ce30: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
ce40: 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  or();.    winLog
ce50: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
ce60: 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  RR, pFile->lastE
ce70: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
ce80: 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61        "winceCrea
ce90: 74 65 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e  teLock1", zFilen
cea0: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
ceb0: 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  3_free(zName);. 
cec0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ced0: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _IOERR;.  }..  /
cee0: 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75  * Acquire the mu
cef0: 74 65 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  tex before conti
cf00: 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65  nuing */.  wince
cf10: 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
cf20: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a  le->hMutex);.  .
cf30: 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e    /* Since the n
cf40: 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75  ames of named mu
cf50: 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65  texes, semaphore
cf60: 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73  s, file mappings
cf70: 20 65 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63   etc are .  ** c
cf80: 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74  ase-sensitive, t
cf90: 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
cfa0: 20 74 68 61 74 20 62 79 20 75 70 70 65 72 63 61   that by upperca
cfb0: 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e  sing the mutex n
cfc0: 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69  ame.  ** and usi
cfd0: 6e 67 20 74 68 61 74 20 61 73 20 74 68 65 20 73  ng that as the s
cfe0: 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e  hared filemappin
cff0: 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f  g name..  */.  o
d000: 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d  sCharUpperW(zNam
d010: 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68  e);.  pFile->hSh
d020: 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46  ared = osCreateF
d030: 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41  ileMappingW(INVA
d040: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
d050: 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
d090: 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
d0a0: 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ock),.          
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
d0d0: 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65  ame);  ..  /* Se
d0e0: 74 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e  t a flag that in
d0f0: 64 69 63 61 74 65 73 20 77 65 27 72 65 20 74 68  dicates we're th
d100: 65 20 66 69 72 73 74 20 74 6f 20 63 72 65 61 74  e first to creat
d110: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20  e the memory so 
d120: 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65  it .  ** must be
d130: 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65   zero-initialize
d140: 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f  d */.  lastErrno
d150: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
d160: 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73 74 45  r();.  if (lastE
d170: 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c  rrno == ERROR_AL
d180: 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20  READY_EXISTS){. 
d190: 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45     bInit = FALSE
d1a0: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
d1b0: 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20  _free(zName);.. 
d1c0: 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65 65   /* If we succee
d1d0: 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68  ded in making th
d1e0: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
d1f0: 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20  handle, map it. 
d200: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
d210: 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 70  hShared ){.    p
d220: 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28  File->shared = (
d230: 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70  winceLock*)osMap
d240: 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
d250: 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20 20 20  ->hShared, .    
d260: 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41           FILE_MA
d270: 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f  P_READ|FILE_MAP_
d280: 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a  WRITE, 0, 0, siz
d290: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b  eof(winceLock));
d2a0: 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69  .    /* If mappi
d2b0: 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65  ng failed, close
d2c0: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
d2d0: 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72  ry handle and er
d2e0: 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ase it */.    if
d2f0: 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ( !pFile->shared
d300: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
d310: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
d320: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
d330: 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72       winLogError
d340: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70  (SQLITE_IOERR, p
d350: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
d360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d370: 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c     "winceCreateL
d380: 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ock2", zFilename
d390: 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64  );.      bLogged
d3a0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 6f   = TRUE;.      o
d3b0: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
d3c0: 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20  le->hShared);.  
d3d0: 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72      pFile->hShar
d3e0: 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ed = NULL;.    }
d3f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68  .  }..  /* If sh
d400: 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c  ared memory coul
d410: 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64  d not be created
d420: 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
d430: 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20   mutex and fail 
d440: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
d450: 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b  hShared==NULL ){
d460: 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67 65  .    if( !bLogge
d470: 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d ){.      pFile
d480: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
d490: 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 77  stErrno;.      w
d4a0: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
d4b0: 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e  E_IOERR, pFile->
d4c0: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
d4e0: 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22 2c  nceCreateLock3",
d4f0: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
d500: 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55     bLogged = TRU
d510: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6e  E;.    }.    win
d520: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
d530: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
d540: 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
d550: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
d560: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  .    pFile->hMut
d570: 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72  ex = NULL;.    r
d580: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
d590: 52 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  RR;.  }.  .  /* 
d5a0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
d5b0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20  hared memory if 
d5c0: 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74  we're supposed t
d5d0: 6f 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74  o */.  if( bInit
d5e0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
d5f0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c  File->shared, 0,
d600: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
d610: 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63  k));.  }..  winc
d620: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
d630: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
d640: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d650: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72  ;.}../*.** Destr
d660: 6f 79 20 74 68 65 20 70 61 72 74 20 6f 66 20 77  oy the part of w
d670: 69 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c  inFile that deal
d680: 73 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63  s with wince loc
d690: 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ks.*/.static voi
d6a0: 64 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f  d winceDestroyLo
d6b0: 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  ck(winFile *pFil
d6c0: 65 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d  e){.  if (pFile-
d6d0: 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a  >hMutex){.    /*
d6e0: 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74   Acquire the mut
d6f0: 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d  ex */.    winceM
d700: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
d710: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20  e->hMutex);..   
d720: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
d730: 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20  g blocks should 
d740: 70 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20  probably assert 
d750: 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62  in debug mode, b
d760: 75 74 20 74 68 65 79 0a 20 20 20 20 20 20 20 61  ut they.       a
d770: 72 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e  re to cleanup in
d780: 20 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20   case any locks 
d790: 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f  remained open */
d7a0: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
d7b0: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b  local.nReaders){
d7c0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
d7d0: 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
d7e0: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  -;.    }.    if 
d7f0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52  (pFile->local.bR
d800: 65 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20  eserved){.      
d810: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
d820: 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
d830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
d840: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
d850: 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46  nding){.      pF
d860: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
d870: 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
d880: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
d890: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
d8a0: 73 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69  sive){.      pFi
d8b0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
d8c0: 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
d8d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
d8e0: 2d 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63  -reference and c
d8f0: 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66  lose our copy of
d900: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
d910: 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20  ry handle */.   
d920: 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   osUnmapViewOfFi
d930: 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  le(pFile->shared
d940: 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  );.    osCloseHa
d950: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
d960: 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  red);..    /* Do
d970: 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65  ne with the mute
d980: 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
d990: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
d9a0: 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20 20 0a 20  ->hMutex);    . 
d9b0: 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
d9c0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
d9d0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  .    pFile->hMut
d9e0: 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d  ex = NULL;.  }.}
d9f0: 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c  ../* .** An impl
da00: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
da10: 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49  e LockFile() API
da20: 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20   of Windows for 
da30: 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  CE.*/.static BOO
da40: 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28  L winceLockFile(
da50: 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69  .  LPHANDLE phFi
da60: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
da70: 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
da80: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
da90: 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
daa0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
dab0: 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  ockLow,.  DWORD 
dac0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
dad0: 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69  LockHigh.){.  wi
dae0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48  nFile *pFile = H
daf0: 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
db00: 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c  (phFile);.  BOOL
db10: 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45   bReturn = FALSE
db20: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
db30: 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73  METER(dwFileOffs
db40: 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45  etHigh);.  UNUSE
db50: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d  D_PARAMETER(nNum
db60: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
db70: 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
db80: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
db90: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
dba0: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
dbb0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
dbc0: 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20    /* Wanting an 
dbd0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20  exclusive lock? 
dbe0: 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f  */.  if (dwFileO
dbf0: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
dc00: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a  RD)SHARED_FIRST.
dc10: 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
dc20: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
dc30: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
dc40: 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66  ED_SIZE){.    if
dc50: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
dc60: 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26  >nReaders == 0 &
dc70: 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d  & pFile->shared-
dc80: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30  >bExclusive == 0
dc90: 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ){.       pFile-
dca0: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
dcb0: 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
dcc0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
dcd0: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55  bExclusive = TRU
dce0: 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75 72  E;.       bRetur
dcf0: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
dd00: 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
dd10: 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f   read-only lock?
dd20: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
dd30: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
dd40: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
dd50: 46 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 20  FIRST &&.       
dd60: 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74      nNumberOfByt
dd70: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  esToLockLow == 1
dd80: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
dd90: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
dda0: 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
ddb0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e    pFile->local.n
ddc0: 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20  Readers ++;.    
ddd0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
dde0: 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31  al.nReaders == 1
ddf0: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
de00: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
de10: 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  rs ++;.      }. 
de20: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
de30: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
de40: 20 20 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64    /* Want a pend
de50: 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ing lock? */.  e
de60: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
de70: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
de80: 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20  D)PENDING_BYTE. 
de90: 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
dea0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
deb0: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
dec0: 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67  /* If no pending
ded0: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61   lock has been a
dee0: 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63  cquired, then ac
def0: 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20  quire it */.    
df00: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
df10: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30  d->bPending == 0
df20: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
df30: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
df40: 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  g = TRUE;.      
df50: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
df60: 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20  nding = TRUE;.  
df70: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
df80: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
df90: 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72   /* Want a reser
dfa0: 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ved lock? */.  e
dfb0: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
dfc0: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
dfd0: 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a  D)RESERVED_BYTE.
dfe0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e             && nN
dff0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
e000: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
e010: 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
e020: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d  ed->bReserved ==
e030: 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c   0) {.      pFil
e040: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
e050: 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  rved = TRUE;.   
e060: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
e070: 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
e080: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
e090: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
e0a0: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
e0b0: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
e0c0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
e0d0: 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  bReturn;.}../*.*
e0e0: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
e0f0: 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63  ion of the Unloc
e100: 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e  kFile API of Win
e110: 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73  dows for CE.*/.s
e120: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
e130: 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  UnlockFile(.  LP
e140: 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
e150: 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
e160: 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
e170: 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
e180: 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
e190: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
e1a0: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  Low,.  DWORD nNu
e1b0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
e1c0: 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e  ockHigh.){.  win
e1d0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41  File *pFile = HA
e1e0: 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28  NDLE_TO_WINFILE(
e1f0: 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20  phFile);.  BOOL 
e200: 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b  bReturn = FALSE;
e210: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
e220: 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65  ETER(dwFileOffse
e230: 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44  tHigh);.  UNUSED
e240: 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62  _PARAMETER(nNumb
e250: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
e260: 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21  kHigh);..  if (!
e270: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72  pFile->hMutex) r
e280: 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69  eturn TRUE;.  wi
e290: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
e2a0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
e2b0: 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20  .  /* Releasing 
e2c0: 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72  a reader lock or
e2d0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
e2e0: 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69  ck */.  if (dwFi
e2f0: 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28  leOffsetLow == (
e300: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52  DWORD)SHARED_FIR
e310: 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20  ST){.    /* Did 
e320: 77 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75  we have an exclu
e330: 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
e340: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
e350: 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a  al.bExclusive){.
e360: 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75        assert(nNu
e370: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
e380: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
e390: 29 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20  )SHARED_SIZE);. 
e3a0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
e3b0: 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46  l.bExclusive = F
e3c0: 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
e3d0: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
e3e0: 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
e3f0: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
e400: 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  RUE;.    }..    
e410: 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68  /* Did we just h
e420: 61 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ave a reader loc
e430: 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  k? */.    else i
e440: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
e450: 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20  nReaders){.     
e460: 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f   assert(nNumberO
e470: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
e480: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
e490: 45 44 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20  ED_SIZE.        
e4a0: 20 20 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f       || nNumberO
e4b0: 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
e4c0: 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70  w == 1);.      p
e4d0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
e4e0: 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69  ders --;.      i
e4f0: 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
e500: 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20  nReaders == 0). 
e510: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70       {.        p
e520: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52  File->shared->nR
e530: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
e540: 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e   }.      bReturn
e550: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
e560: 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69   }..  /* Releasi
e570: 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  ng a pending loc
e580: 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  k */.  else if (
e590: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
e5a0: 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e  == (DWORD)PENDIN
e5b0: 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20  G_BYTE.         
e5c0: 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
e5d0: 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
e5e0: 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46  = 1){.    if (pF
e5f0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
e600: 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ing){.      pFil
e610: 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
e620: 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  g = FALSE;.     
e630: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
e640: 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
e650: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
e660: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
e670: 7d 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  }.  /* Releasing
e680: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
e690: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
e6a0: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
e6b0: 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56 45  = (DWORD)RESERVE
e6c0: 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20  D_BYTE.         
e6d0: 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
e6e0: 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
e6f0: 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46  = 1){.    if (pF
e700: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
e710: 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46  rved) {.      pF
e720: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
e730: 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
e740: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
e750: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46  d->bReserved = F
e760: 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
e770: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
e780: 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  }.  }..  winceMu
e790: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
e7a0: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
e7b0: 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f  urn bReturn;.}./
e7c0: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  *.** End of the 
e7d0: 73 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72  special code for
e7e0: 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a   wince.*********
e7f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e830: 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ****/.#endif /* 
e840: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
e850: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61  */../*.** Lock a
e860: 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f   file region..*/
e870: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
e880: 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  LockFile(.  LPHA
e890: 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
e8a0: 57 4f 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57  WORD flags,.  DW
e8b0: 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20  ORD offsetLow,. 
e8c0: 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67   DWORD offsetHig
e8d0: 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  h,.  DWORD numBy
e8e0: 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  tesLow,.  DWORD 
e8f0: 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a  numBytesHigh.){.
e900: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
e910: 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f  NCE.  /*.  ** NO
e920: 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69  TE: Windows CE i
e930: 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72  s handled differ
e940: 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69  ently here due i
e950: 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57  ts lack of the W
e960: 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20  in32.  **       
e970: 41 50 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20  API LockFile..  
e980: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63  */.  return winc
e990: 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65  eLockFile(phFile
e9a0: 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
e9b0: 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20  setHigh,.       
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9d0: 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d  numBytesLow, num
e9e0: 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73  BytesHigh);.#els
e9f0: 65 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  e.  if( isNT() )
ea00: 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  {.    OVERLAPPED
ea10: 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65   ovlp;.    memse
ea20: 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65  t(&ovlp, 0, size
ea30: 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b  of(OVERLAPPED));
ea40: 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
ea50: 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20   = offsetLow;.  
ea60: 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67    ovlp.OffsetHig
ea70: 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a  h = offsetHigh;.
ea80: 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63      return osLoc
ea90: 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c  kFileEx(*phFile,
eaa0: 20 66 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79   flags, 0, numBy
eab0: 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
eac0: 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20  High, &ovlp);.  
ead0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
eae0: 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68  n osLockFile(*ph
eaf0: 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
eb00: 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
eb10: 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb30: 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
eb40: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
eb50: 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  ** Unlock a file
eb60: 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61   region.. */.sta
eb70: 74 69 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f  tic BOOL winUnlo
eb80: 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
eb90: 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
eba0: 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  RD offsetLow,.  
ebb0: 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68  DWORD offsetHigh
ebc0: 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
ebd0: 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  esLow,.  DWORD n
ebe0: 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23  umBytesHigh.){.#
ebf0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
ec00: 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54  CE.  /*.  ** NOT
ec10: 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73  E: Windows CE is
ec20: 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
ec30: 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74  ntly here due it
ec40: 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69  s lack of the Wi
ec50: 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41  n32.  **       A
ec60: 50 49 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20  PI UnlockFile.. 
ec70: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e   */.  return win
ec80: 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46  ceUnlockFile(phF
ec90: 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20  ile, offsetLow, 
eca0: 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20  offsetHigh,.    
ecb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecc0: 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77       numBytesLow
ecd0: 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b  , numBytesHigh);
ece0: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 69 73 4e  .#else.  if( isN
ecf0: 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c  T() ){.    OVERL
ed00: 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20  APPED ovlp;.    
ed10: 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c  memset(&ovlp, 0,
ed20: 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50   sizeof(OVERLAPP
ed30: 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  ED));.    ovlp.O
ed40: 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f  ffset = offsetLo
ed50: 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  w;.    ovlp.Offs
ed60: 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48  etHigh = offsetH
ed70: 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  igh;.    return 
ed80: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a  osUnlockFileEx(*
ed90: 70 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79  phFile, 0, numBy
eda0: 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
edb0: 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20  High, &ovlp);.  
edc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
edd0: 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a  n osUnlockFile(*
ede0: 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f  phFile, offsetLo
edf0: 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e  w, offsetHigh, n
ee00: 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20  umBytesLow,.    
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee20: 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68      numBytesHigh
ee30: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
ee40: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
ee50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
ee90: 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75  ** The next grou
eea0: 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d  p of routines im
eeb0: 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20  plement the I/O 
eec0: 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66 69 65  methods specifie
eed0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69  d.** by the sqli
eee0: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
eef0: 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  bject..*********
ef00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef40: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f  *****/../*.** So
ef50: 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d  me Microsoft com
ef60: 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73  pilers lack this
ef70: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a   definition..*/.
ef80: 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f  #ifndef INVALID_
ef90: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
efa0: 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49  .# define INVALI
efb0: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
efc0: 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23  ER ((DWORD)-1).#
efd0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
efe0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  e the current po
eff0: 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  sition of the fi
f000: 6c 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  le handle passed
f010: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a   as the first .*
f020: 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66  * argument to of
f030: 66 73 65 74 20 69 4f 66 66 73 65 74 20 77 69 74  fset iOffset wit
f040: 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66  hin the file. If
f050: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
f060: 75 72 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72  urn 0. .** Other
f070: 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d  wise, set pFile-
f080: 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72  >lastErrno and r
f090: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
f0a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
f0b0: 65 6b 57 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c  ekWinFile(winFil
f0c0: 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
f0d0: 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29  3_int64 iOffset)
f0e0: 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
f0f0: 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70  _WINRT.  LONG up
f100: 70 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20  perBits;        
f110: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74           /* Most
f120: 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66   sig. 32 bits of
f130: 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20   new offset */. 
f140: 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b   LONG lowerBits;
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f160: 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33   /* Least sig. 3
f170: 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66  2 bits of new of
f180: 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20  fset */.  DWORD 
f190: 64 77 52 65 74 3b 20 20 20 20 20 20 20 20 20 20  dwRet;          
f1a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
f1b0: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ue returned by S
f1c0: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20  etFilePointer() 
f1d0: 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
f1e0: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
f1f0: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
f200: 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73  turned by GetLas
f210: 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 75  tError() */..  u
f220: 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47  pperBits = (LONG
f230: 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20  )((iOffset>>32) 
f240: 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  & 0x7fffffff);. 
f250: 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f   lowerBits = (LO
f260: 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20 30 78  NG)(iOffset & 0x
f270: 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a  ffffffff);..  /*
f280: 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20   API oddity: If 
f290: 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46  successful, SetF
f2a0: 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74  ilePointer() ret
f2b0: 75 72 6e 73 20 61 20 64 77 6f 72 64 20 0a 20 20  urns a dword .  
f2c0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
f2d0: 65 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20  e lower 32-bits 
f2e0: 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d  of the new file-
f2f0: 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69  offset. Or, if i
f300: 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74  t fails,.  ** it
f310: 20 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44   returns INVALID
f320: 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
f330: 52 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72  R. However accor
f340: 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20  ding to MSDN, . 
f350: 20 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f   ** INVALID_SET_
f360: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79  FILE_POINTER may
f370: 20 61 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64   also be a valid
f380: 20 6e 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20   new offset. So 
f390: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
f3a0: 2a 2a 20 77 68 65 74 68 65 72 20 61 6e 20 65 72  ** whether an er
f3b0: 72 6f 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79  ror has actually
f3c0: 20 6f 63 63 75 72 65 64 2c 20 69 74 20 69 73 20   occured, it is 
f3d0: 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74  also necessary t
f3e0: 6f 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74  o call .  ** Get
f3f0: 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a  LastError()..  *
f400: 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65  /.  dwRet = osSe
f410: 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69  tFilePointer(pFi
f420: 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73  le->h, lowerBits
f430: 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49  , &upperBits, FI
f440: 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66  LE_BEGIN);..  if
f450: 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49  ( (dwRet==INVALI
f460: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
f470: 45 52 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61  ER.      && ((la
f480: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
f490: 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f  astError())!=NO_
f4a0: 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70  ERROR)) ){.    p
f4b0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f4c0: 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
f4d0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
f4e0: 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20  ITE_IOERR_SEEK, 
f4f0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f500: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
f510: 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46  seekWinFile", pF
f520: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
f530: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
f540: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73    return 0;.#els
f550: 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65  e.  /*.  ** Same
f560: 20 61 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70   as above, excep
f570: 74 20 74 68 61 74 20 74 68 69 73 20 69 6d 70 6c  t that this impl
f580: 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73  ementation works
f590: 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f   for WinRT..  */
f5a0: 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45  ..  LARGE_INTEGE
f5b0: 52 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  R x;            
f5c0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
f5d0: 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ffset */.  BOOL 
f5e0: 62 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  bRet;           
f5f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
f600: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
f610: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
f620: 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50  () */..  x.QuadP
f630: 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20  art = iOffset;. 
f640: 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c   bRet = osSetFil
f650: 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65  ePointerEx(pFile
f660: 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f  ->h, x, 0, FILE_
f670: 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62  BEGIN);..  if(!b
f680: 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  Ret){.    pFile-
f690: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
f6a0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
f6b0: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
f6c0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
f6d0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
f6e0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
f6f0: 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20   "seekWinFile", 
f700: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
f710: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
f720: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ..  return 0;.#e
f730: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ndif.}../*.** Cl
f740: 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  ose a file..**.*
f750: 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64  * It is reported
f760: 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74   that an attempt
f770: 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64   to close a hand
f780: 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d  le might sometim
f790: 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69  es.** fail.  Thi
f7a0: 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72 65  s is a very unre
f7b0: 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c  asonable result,
f7c0: 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73 20   but Windows is 
f7d0: 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72  notorious.** for
f7e0: 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61   being unreasona
f7f0: 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20  ble so I do not 
f800: 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d 69  doubt that it mi
f810: 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a  ght happen.  If.
f820: 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69  ** the close fai
f830: 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72  ls, we pause for
f840: 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64   100 millisecond
f850: 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e  s and try again.
f860: 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20    As.** many as 
f870: 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
f880: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f   attempts to clo
f890: 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72  se the handle ar
f8a0: 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a  e made before.**
f8b0: 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72   giving up and r
f8c0: 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
f8d0: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58  r..*/.#define MX
f8e0: 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33  _CLOSE_ATTEMPT 3
f8f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
f900: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
f910: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63  e *id){.  int rc
f920: 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e  , cnt = 0;.  win
f930: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
f940: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  inFile*)id;..  a
f950: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
f960: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f970: 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74  MIT_WAL.  assert
f980: 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30  ( pFile->pShm==0
f990: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54   );.#endif.  OST
f9a0: 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
f9b0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
f9c0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
f9d0: 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c  >h!=NULL && pFil
f9e0: 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  e->h!=INVALID_HA
f9f0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20  NDLE_VALUE );.  
fa00: 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43  do{.    rc = osC
fa10: 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
fa20: 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d  ->h);.    /* Sim
fa30: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
fa40: 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45  =0; cnt=MX_CLOSE
fa50: 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a  _ATTEMPT; ); */.
fa60: 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20    }while( rc==0 
fa70: 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c  && ++cnt < MX_CL
fa80: 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28  OSE_ATTEMPT && (
fa90: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
faa0: 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a  eep(100), 1) );.
fab0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
fac0: 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43  NCE.#define WINC
fad0: 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  E_DELETION_ATTEM
fae0: 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73  PTS 3.  winceDes
faf0: 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  troyLock(pFile);
fb00: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44  .  if( pFile->zD
fb10: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a  eleteOnClose ){.
fb20: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
fb30: 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20  .    while(.    
fb40: 20 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46         osDeleteF
fb50: 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  ileW(pFile->zDel
fb60: 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20  eteOnClose)==0. 
fb70: 20 20 20 20 20 20 20 26 26 20 6f 73 47 65 74 46         && osGetF
fb80: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 70  ileAttributesW(p
fb90: 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
fba0: 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66 66  lose)!=0xfffffff
fbb0: 66 20 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e  f .        && cn
fbc0: 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45  t++ < WINCE_DELE
fbd0: 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20  TION_ATTEMPTS.  
fbe0: 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69    ){.       sqli
fbf0: 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
fc00: 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61  100);  /* Wait a
fc10: 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74   little before t
fc20: 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20  rying again */. 
fc30: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
fc40: 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65  _free(pFile->zDe
fc50: 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20  leteOnClose);.  
fc60: 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41  }.#endif.  OSTRA
fc70: 43 45 28 28 22 43 4c 4f 53 45 20 25 64 20 25 73  CE(("CLOSE %d %s
fc80: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
fc90: 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  c ? "ok" : "fail
fca0: 65 64 22 29 29 3b 0a 20 20 69 66 28 20 72 63 20  ed"));.  if( rc 
fcb0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20  ){.    pFile->h 
fcc0: 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70  = NULL;.  }.  Op
fcd0: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
fce0: 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
fcf0: 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
fd00: 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72     : winLogError
fd10: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
fd20: 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  OSE, osGetLastEr
fd30: 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd50: 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69   "winClose", pFi
fd60: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f  le->zPath);.}../
fd70: 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
fd80: 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
fd90: 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
fda0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
fdb0: 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
fdc0: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
fdd0: 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
fde0: 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
fdf0: 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
fe00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
fe10: 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
fe20: 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
fe30: 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65     /* File to re
fe40: 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69  ad from */.  voi
fe50: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
fe60: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
fe70: 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68   content into th
fe80: 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  is buffer */.  i
fe90: 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
fea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
feb0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
fec0: 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  read */.  sqlite
fed0: 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20  3_int64 offset  
fee0: 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
fef0: 61 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66  ading at this of
ff00: 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  fset */.){.#if !
ff10: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
ff20: 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65    OVERLAPPED ove
ff30: 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20  rlapped;        
ff40: 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20    /* The offset 
ff50: 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f  for ReadFile. */
ff60: 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c  .#endif.  winFil
ff70: 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
ff80: 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c  ile*)id;  /* fil
ff90: 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57  e handle */.  DW
ffa0: 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20  ORD nRead;      
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ffc0: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
ffd0: 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
ffe0: 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  rom file */.  in
fff0: 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20  t nRetry = 0;   
10000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10010 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79   Number of retry
10020 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
10030 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c  id!=0 );.  Simul
10040 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
10050 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
10060 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  EAD);.  OSTRACE(
10070 28 22 52 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25  ("READ %d lock=%
10080 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
10090 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
100a0 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  );..#if SQLITE_O
100b0 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 73 65  S_WINCE.  if( se
100c0 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c  ekWinFile(pFile,
100d0 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20   offset) ){.    
100e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
100f0 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  LL;.  }.  while(
10100 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69   !osReadFile(pFi
10110 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
10120 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a  , &nRead, 0) ){.
10130 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28 26  #else.  memset(&
10140 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73  overlapped, 0, s
10150 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
10160 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64  ));.  overlapped
10170 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
10180 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
10190 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70  ffff);.  overlap
101a0 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  ped.OffsetHigh =
101b0 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e   (LONG)((offset>
101c0 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
101d0 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f 73  f);.  while( !os
101e0 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ReadFile(pFile->
101f0 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e  h, pBuf, amt, &n
10200 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70 65  Read, &overlappe
10210 64 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 6f  d) &&.         o
10220 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21  sGetLastError()!
10230 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f  =ERROR_HANDLE_EO
10240 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20  F ){.#endif.    
10250 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
10260 0a 20 20 20 20 69 66 28 20 72 65 74 72 79 49 6f  .    if( retryIo
10270 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61  err(&nRetry, &la
10280 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69  stErrno) ) conti
10290 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  nue;.    pFile->
102a0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
102b0 45 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72  Errno;.    retur
102c0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
102d0 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c  LITE_IOERR_READ,
102e0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
102f0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
10300 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65  "winRead", pFile
10310 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  ->zPath);.  }.  
10320 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29  logIoerr(nRetry)
10330 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44  ;.  if( nRead<(D
10340 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20  WORD)amt ){.    
10350 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
10360 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
10370 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
10380 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
10390 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e  &((char*)pBuf)[n
103a0 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52  Read], 0, amt-nR
103b0 65 61 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ead);.    return
103c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
103d0 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ORT_READ;.  }.. 
103e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
103f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  K;.}../*.** Writ
10400 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
10410 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
10420 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
10430 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
10440 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
10450 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
10460 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
10470 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20   int winWrite(. 
10480 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
10490 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
104a0 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74   /* File to writ
104b0 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73  e into */.  cons
104c0 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20  t void *pBuf,   
104d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
104e0 68 65 20 62 79 74 65 73 20 74 6f 20 62 65 20 77  he bytes to be w
104f0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  ritten */.  int 
10500 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
10510 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10520 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
10530 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c  o write */.  sql
10540 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
10550 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
10560 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  Offset into the 
10570 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72  file to begin wr
10580 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20  iting at */.){. 
10590 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105b0 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f   /* True if erro
105c0 72 20 68 61 73 20 6f 63 63 75 72 65 64 2c 20 65  r has occured, e
105d0 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77  lse false */.  w
105e0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
105f0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
10600 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  * File handle */
10610 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20  .  int nRetry = 
10620 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
10630 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10640 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73  retries */..  as
10650 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20  sert( amt>0 );. 
10660 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
10670 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
10680 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
10690 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a  E_IOERR_WRITE);.
106a0 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
106b0 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  llError(return S
106c0 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20  QLITE_FULL);..  
106d0 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
106e0 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  %d lock=%d\n", p
106f0 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
10700 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66  locktype));..#if
10710 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
10720 0a 20 20 72 63 20 3d 20 73 65 65 6b 57 69 6e 46  .  rc = seekWinF
10730 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ile(pFile, offse
10740 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  t);.  if( rc==0 
10750 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e  ){.#else.  {.#en
10760 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  dif.#if !SQLITE_
10770 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 4f 56 45  OS_WINCE.    OVE
10780 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70  RLAPPED overlapp
10790 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed;        /* Th
107a0 65 20 6f 66 66 73 65 74 20 66 6f 72 20 57 72 69  e offset for Wri
107b0 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69  teFile. */.#endi
107c0 66 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20 3d  f.    u8 *aRem =
107d0 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20 20   (u8 *)pBuf;    
107e0 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74 20      /* Data yet 
107f0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f  to be written */
10800 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  .    int nRem = 
10810 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  amt;            
10820 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10830 62 79 74 65 73 20 79 65 74 20 74 6f 20 62 65 20  bytes yet to be 
10840 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44  written */.    D
10850 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20 20  WORD nWrite;    
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10870 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79  Bytes written by
10880 20 65 61 63 68 20 57 72 69 74 65 46 69 6c 65 28   each WriteFile(
10890 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57  ) call */.    DW
108a0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
108b0 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56  NO_ERROR;   /* V
108c0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
108d0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
108e0 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  */..#if !SQLITE_
108f0 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 6d 65 6d  OS_WINCE.    mem
10900 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c  set(&overlapped,
10910 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
10920 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 65  APPED));.    ove
10930 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d  rlapped.Offset =
10940 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26   (LONG)(offset &
10950 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
10960 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
10970 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29  setHigh = (LONG)
10980 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  ((offset>>32) & 
10990 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e  0x7fffffff);.#en
109a0 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  dif..    while( 
109b0 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51  nRem>0 ){.#if SQ
109c0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
109d0 20 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65      if( !osWrite
109e0 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61  File(pFile->h, a
109f0 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69  Rem, nRem, &nWri
10a00 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a  te, 0) ){.#else.
10a10 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69        if( !osWri
10a20 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  teFile(pFile->h,
10a30 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57   aRem, nRem, &nW
10a40 72 69 74 65 2c 20 26 6f 76 65 72 6c 61 70 70 65  rite, &overlappe
10a50 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20  d) ){.#endif.   
10a60 20 20 20 20 20 69 66 28 20 72 65 74 72 79 49 6f       if( retryIo
10a70 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61  err(&nRetry, &la
10a80 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69  stErrno) ) conti
10a90 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nue;.        bre
10aa0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
10ab0 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
10ac0 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28  ==0 || nWrite<=(
10ad0 44 57 4f 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20  DWORD)nRem );.  
10ae0 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d      if( nWrite==
10af0 30 20 7c 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f  0 || nWrite>(DWO
10b00 52 44 29 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20  RD)nRem ){.     
10b10 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
10b20 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
10b30 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
10b40 20 20 20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c        }.#if !SQL
10b50 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
10b60 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72     offset += nWr
10b70 69 74 65 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c  ite;.      overl
10b80 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
10b90 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30  LONG)(offset & 0
10ba0 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20  xffffffff);.    
10bb0 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
10bc0 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29  setHigh = (LONG)
10bd0 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  ((offset>>32) & 
10be0 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e  0x7fffffff);.#en
10bf0 64 69 66 0a 20 20 20 20 20 20 61 52 65 6d 20 2b  dif.      aRem +
10c00 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  = nWrite;.      
10c10 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a  nRem -= nWrite;.
10c20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52      }.    if( nR
10c30 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46  em>0 ){.      pF
10c40 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
10c50 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
10c60 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
10c70 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b    }..  if( rc ){
10c80 0a 20 20 20 20 69 66 28 20 20 20 28 20 70 46 69  .    if(   ( pFi
10c90 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
10ca0 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b  RROR_HANDLE_DISK
10cb0 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c  _FULL ).       |
10cc0 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  | ( pFile->lastE
10cd0 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b  rrno==ERROR_DISK
10ce0 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20  _FULL )){.      
10cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
10d00 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  LL;.    }.    re
10d10 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
10d20 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52  (SQLITE_IOERR_WR
10d30 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ITE, pFile->last
10d40 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
10d50 20 20 20 20 22 77 69 6e 57 72 69 74 65 22 2c 20      "winWrite", 
10d60 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
10d70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 67 49   }else{.    logI
10d80 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20  oerr(nRetry);.  
10d90 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
10da0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
10db0 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
10dc0 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
10dd0 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74  ied size.*/.stat
10de0 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61  ic int winTrunca
10df0 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  te(sqlite3_file 
10e00 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
10e10 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e  64 nByte){.  win
10e20 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
10e30 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20  inFile*)id;  /* 
10e40 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65  File handle obje
10e50 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ct */.  int rc =
10e60 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
10e70 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
10e80 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20  n code for this 
10e90 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61  function */..  a
10ea0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
10eb0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55  .  OSTRACE(("TRU
10ec0 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22  NCATE %d %lld\n"
10ed0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74  , pFile->h, nByt
10ee0 65 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e));.  SimulateI
10ef0 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
10f00 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
10f10 41 54 45 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ATE);..  /* If t
10f20 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
10f30 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
10f40 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
10f50 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  e, truncate the.
10f60 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61    ** file so tha
10f70 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  t it consists of
10f80 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
10f90 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e  er of chunks (i.
10fa0 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  e. the.  ** actu
10fb0 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74  al file size aft
10fc0 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  er the operation
10fd0 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74   may be larger t
10fe0 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
10ff0 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20  d.  ** size)..  
11000 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
11010 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
11020 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65   nByte = ((nByte
11030 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   + pFile->szChun
11040 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a  k - 1)/pFile->sz
11050 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
11060 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  szChunk;.  }..  
11070 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28  /* SetEndOfFile(
11080 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  ) returns non-ze
11090 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73 66  ro when successf
110a0 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e  ul, or zero when
110b0 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
110c0 69 66 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28  if( seekWinFile(
110d0 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b  pFile, nByte) ){
110e0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
110f0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
11100 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
11110 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
11120 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
11130 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c  Truncate1", pFil
11140 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
11150 73 65 20 69 66 28 20 30 3d 3d 6f 73 53 65 74 45  se if( 0==osSetE
11160 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ndOfFile(pFile->
11170 68 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  h) ){.    pFile-
11180 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
11190 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
111a0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
111b0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
111c0 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65  _TRUNCATE, pFile
111d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
111e0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72            "winTr
111f0 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d  uncate2", pFile-
11200 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20  >zPath);.  }..  
11210 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41  OSTRACE(("TRUNCA
11220 54 45 20 25 64 20 25 6c 6c 64 20 25 73 5c 6e 22  TE %d %lld %s\n"
11230 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74  , pFile->h, nByt
11240 65 2c 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22  e, rc ? "failed"
11250 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74   : "ok"));.  ret
11260 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65  urn rc;.}..#ifde
11270 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
11280 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
11290 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63  mber of fullsync
112a0 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e  s and normal syn
112b0 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  cs.  This is use
112c0 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61  d to test.** tha
112d0 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c  t syncs and full
112e0 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69  syncs are occuri
112f0 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
11300 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
11310 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
11320 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
11330 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
11340 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
11350 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
11360 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
11370 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
11380 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
11390 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  isk..*/.static i
113a0 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74  nt winSync(sqlit
113b0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
113c0 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65 66   flags){.#ifndef
113d0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
113e0 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f    /*.  ** Used o
113f0 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  nly when SQLITE_
11400 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64  NO_SYNC is not d
11410 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20  efined..   */.  
11420 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a  BOOL rc;.#endif.
11430 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
11440 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  BUG) || !defined
11450 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29  (SQLITE_NO_SYNC)
11460 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66 69 6e   || \.    (defin
11470 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
11480 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
11490 45 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a 0a 20  E_DEBUG)).  /*. 
114a0 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20 53 51   ** Used when SQ
114b0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20  LITE_NO_SYNC is 
114c0 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e 64 20  not defined and 
114d0 62 79 20 74 68 65 20 61 73 73 65 72 74 28 29 20  by the assert() 
114e0 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52  and/or.  ** OSTR
114f0 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20  ACE() macros..  
11500 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   */.  winFile *p
11510 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
11520 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  )id;.#else.  UNU
11530 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64  SED_PARAMETER(id
11540 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  );.#endif..  ass
11550 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
11560 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e  /* Check that on
11570 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43  e of SQLITE_SYNC
11580 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20  _NORMAL or FULL 
11590 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20  was passed */.  
115a0 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78  assert((flags&0x
115b0 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
115c0 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c  _NORMAL.      ||
115d0 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
115e0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
115f0 20 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28    );..  OSTRACE(
11600 28 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25  ("SYNC %d lock=%
11610 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
11620 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
11630 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61  );..  /* Unix ca
11640 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73  nnot, but some s
11650 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72  ystems may retur
11660 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72  n SQLITE_FULL fr
11670 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20  om here. This.  
11680 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65  ** line is to te
11690 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f  st that doing so
116a0 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
116b0 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  any problems..  
116c0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  */.  SimulateDis
116d0 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75  kfullError( retu
116e0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  rn SQLITE_FULL )
116f0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
11700 45 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f  E_TEST.  UNUSED_
11710 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29  PARAMETER(flags)
11720 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66  ;.#else.  if( (f
11730 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
11740 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a  TE_SYNC_FULL ){.
11750 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c      sqlite3_full
11760 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sync_count++;.  
11770 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  }.  sqlite3_sync
11780 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66  _count++;.#endif
11790 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d  ..  /* If we com
117a0 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53  piled with the S
117b0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c  QLITE_NO_SYNC fl
117c0 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67  ag, then syncing
117d0 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70   is a.  ** no-op
117e0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
117f0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 65  ITE_NO_SYNC.  re
11800 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11810 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46  #else.  rc = osF
11820 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28  lushFileBuffers(
11830 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d  pFile->h);.  Sim
11840 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
11850 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20  =FALSE );.  if( 
11860 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
11870 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
11880 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
11890 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
118a0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
118b0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
118c0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
118d0 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e  R_FSYNC, pFile->
118e0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
118f0 20 20 20 20 20 20 20 20 22 77 69 6e 53 79 6e 63          "winSync
11900 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
11910 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
11920 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
11930 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
11940 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79   of a file in by
11950 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  tes.*/.static in
11960 74 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 73 71  t winFileSize(sq
11970 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11980 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
11990 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65  Size){.  winFile
119a0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
119b0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
119c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
119d0 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
119e0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
119f0 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
11a00 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a  E_IOERR_FSTAT);.
11a10 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
11a20 4e 52 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45  NRT.  {.    FILE
11a30 5f 53 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69  _STANDARD_INFO i
11a40 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47  nfo;.    if( osG
11a50 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
11a60 6e 42 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c  nByHandleEx(pFil
11a70 65 2d 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61  e->h, FileStanda
11a80 72 64 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20  rdInfo,.        
11a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69 6e               &in
11ab0 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
11ac0 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ) ){.      *pSiz
11ad0 65 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69  e = info.EndOfFi
11ae0 6c 65 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20  le.QuadPart;.   
11af0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
11b00 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
11b10 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
11b20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
11b30 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
11b40 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46  _IOERR_FSTAT, pF
11b50 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
11b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b70 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53         "winFileS
11b80 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ize", pFile->zPa
11b90 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  th);.    }.  }.#
11ba0 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f  else.  {.    DWO
11bb0 52 44 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20  RD upperBits;.  
11bc0 20 20 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74    DWORD lowerBit
11bd0 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73  s;.    DWORD las
11be0 74 45 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77  tErrno;..    low
11bf0 65 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69  erBits = osGetFi
11c00 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c  leSize(pFile->h,
11c10 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20   &upperBits);.  
11c20 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71    *pSize = (((sq
11c30 6c 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65  lite3_int64)uppe
11c40 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f  rBits)<<32) + lo
11c50 77 65 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28  werBits;.    if(
11c60 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d     (lowerBits ==
11c70 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49   INVALID_FILE_SI
11c80 5a 45 29 0a 20 20 20 20 20 20 20 26 26 20 28 28  ZE).       && ((
11c90 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
11ca0 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e  tLastError())!=N
11cb0 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20  O_ERROR) ){.    
11cc0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11cd0 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
11ce0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
11cf0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
11d00 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65  ERR_FSTAT, pFile
11d10 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
11d20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69            "winFi
11d30 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e  leSize", pFile->
11d40 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
11d50 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
11d60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
11d70 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
11d80 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65  EDIATELY is unde
11d90 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69  fined on some Wi
11da0 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a  ndows systems..*
11db0 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49  /.#ifndef LOCKFI
11dc0 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
11dd0 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43  ELY.# define LOC
11de0 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
11df0 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a  IATELY 1.#endif.
11e00 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c  .#ifndef LOCKFIL
11e10 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
11e20 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49  .# define LOCKFI
11e30 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
11e40 4b 20 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  K 2.#endif../*.*
11e50 2a 20 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20  * Historically, 
11e60 53 51 4c 69 74 65 20 68 61 73 20 75 73 65 64 20  SQLite has used 
11e70 62 6f 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c  both the LockFil
11e80 65 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78  e and LockFileEx
11e90 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57   functions..** W
11ea0 68 65 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  hen the LockFile
11eb0 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73   function was us
11ec0 65 64 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79  ed, it was alway
11ed0 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 66 61  s expected to fa
11ee0 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  il.** immediatel
11ef0 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f  y if the lock co
11f00 75 6c 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  uld not be obtai
11f10 6e 65 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61  ned.  Also, it a
11f20 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74  lways expected t
11f30 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65  o.** obtain an e
11f40 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20  xclusive lock.  
11f50 54 68 65 73 65 20 66 6c 61 67 73 20 61 72 65 20  These flags are 
11f60 75 73 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f  used with the Lo
11f70 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
11f80 6e 0a 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74  n.** and reflect
11f90 20 74 68 6f 73 65 20 65 78 70 65 63 74 61 74 69   those expectati
11fa0 6f 6e 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ons; therefore, 
11fb0 74 68 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20  they should not 
11fc0 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23  be changed..*/.#
11fd0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  ifndef SQLITE_LO
11fe0 43 4b 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64  CKFILE_FLAGS.# d
11ff0 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43  efine SQLITE_LOC
12000 4b 46 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c  KFILE_FLAGS   (L
12010 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
12020 45 44 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20  EDIATELY | \.   
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
12050 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
12060 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a  E_LOCK).#endif..
12070 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c  /*.** Currently,
12080 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61   SQLite never ca
12090 6c 6c 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  lls the LockFile
120a0 45 78 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  Ex function with
120b0 6f 75 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a  out wanting the.
120c0 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20  ** call to fail 
120d0 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74  immediately if t
120e0 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
120f0 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23  e obtained..*/.#
12100 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  ifndef SQLITE_LO
12110 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23  CKFILEEX_FLAGS.#
12120 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c   define SQLITE_L
12130 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20  OCKFILEEX_FLAGS 
12140 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49  (LOCKFILE_FAIL_I
12150 4d 4d 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64  MMEDIATELY).#end
12160 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  if../*.** Acquir
12170 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e  e a reader lock.
12180 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50  .** Different AP
12190 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63  I routines are c
121a0 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20  alled depending 
121b0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
121c0 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e  t this.** is Win
121d0 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a  9x or WinNT..*/.
121e0 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65  static int getRe
121f0 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  adLock(winFile *
12200 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65  pFile){.  int re
12210 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  s;.  if( isNT() 
12220 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
12230 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20 20  _WINCE.    /*.  
12240 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f    ** NOTE: Windo
12250 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64  ws CE is handled
12260 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72   differently her
12270 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f  e due its lack o
12280 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 20 20  f the Win32.    
12290 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63  **       API Loc
122a0 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f 0a  kFileEx..    */.
122b0 20 20 20 20 72 65 73 20 3d 20 77 69 6e 63 65 4c      res = winceL
122c0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
122d0 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
122e0 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73 65   0, 1, 0);.#else
122f0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f  .    res = winLo
12300 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
12310 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
12320 45 45 58 5f 46 4c 41 47 53 2c 20 53 48 41 52 45  EEX_FLAGS, SHARE
12330 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20  D_FIRST, 0,.    
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12350 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30    SHARED_SIZE, 0
12360 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
12370 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
12380 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
12390 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20  e{.    int lk;. 
123a0 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
123b0 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29  mness(sizeof(lk)
123c0 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c  , &lk);.    pFil
123d0 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
123e0 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b 20  e = (short)((lk 
123f0 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28 53  & 0x7fffffff)%(S
12400 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 29  HARED_SIZE - 1))
12410 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  ;.    res = winL
12420 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
12430 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
12440 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20  LE_FLAGS,.      
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69  SHARED_FIRST+pFi
12470 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
12480 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  te, 0, 1, 0);.  
12490 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
124a0 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70  es == 0 ){.    p
124b0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
124c0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
124d0 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65  ();.    /* No ne
124e0 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c  ed to log a fail
124f0 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  ure to lock */. 
12500 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b   }.  return res;
12510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61  .}../*.** Undo a
12520 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61   readlock.*/.sta
12530 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 65  tic int unlockRe
12540 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  adLock(winFile *
12550 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65  pFile){.  int re
12560 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  s;.  DWORD lastE
12570 72 72 6e 6f 3b 0a 20 20 69 66 28 20 69 73 4e 54  rrno;.  if( isNT
12580 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  () ){.    res = 
12590 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
125a0 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
125b0 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44  FIRST, 0, SHARED
125c0 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23  _SIZE, 0);.  }.#
125d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
125e0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
125f0 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  se{.    res = wi
12600 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
12610 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
12620 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
12630 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
12640 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
12650 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20    if( res==0 && 
12660 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
12670 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
12680 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45  =ERROR_NOT_LOCKE
12690 44 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  D) ){.    pFile-
126a0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
126b0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c  tErrno;.    winL
126c0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
126d0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69  OERR_UNLOCK, pFi
126e0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
126f0 20 20 20 20 20 20 20 20 20 20 20 20 22 75 6e 6c              "unl
12700 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46  ockReadLock", pF
12710 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
12720 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
12730 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
12740 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
12750 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
12760 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74   parameter lockt
12770 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ype - one.** of 
12780 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
12790 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
127a0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
127b0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
127c0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
127d0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
127e0 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
127f0 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
12800 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
12810 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
12820 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
12830 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
12840 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
12850 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
12860 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
12870 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
12880 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
12890 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
128a0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
128b0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
128c0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
128d0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
128e0 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
128f0 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
12900 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
12910 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
12920 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
12930 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
12940 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
12950 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
12960 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
12970 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
12980 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
12990 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
129a0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
129b0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
129c0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
129d0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
129e0 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
129f0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
12a00 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
12a10 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b  .  The winUnlock
12a20 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72  () routine.** er
12a30 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61  ases all locks a
12a40 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72  t once and retur
12a50 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c  ns us immediatel
12a60 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  y to locking lev
12a70 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e  el 0..** It is n
12a80 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c  ot possible to l
12a90 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
12aa0 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20   level one step 
12ab0 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a  at a time.  You.
12ac0 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69  ** must go strai
12ad0 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c  ght to locking l
12ae0 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  evel 0..*/.stati
12af0 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71  c int winLock(sq
12b00 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12b10 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
12b20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12b30 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72  _OK;    /* Retur
12b40 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72  n code from subr
12b50 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74  outines */.  int
12b60 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
12b70 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
12b80 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20   a Windows lock 
12b90 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65  call */.  int ne
12ba0 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20  wLocktype;      
12bb0 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c   /* Set pFile->l
12bc0 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20  ocktype to this 
12bd0 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69  value before exi
12be0 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f  ting */.  int go
12bf0 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30  tPendingLock = 0
12c00 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 61  ;/* True if we a
12c10 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e  cquired a PENDIN
12c20 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65  G lock this time
12c30 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   */.  winFile *p
12c40 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
12c50 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  )id;.  DWORD las
12c60 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
12c70 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  R;..  assert( id
12c80 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  !=0 );.  OSTRACE
12c90 28 28 22 4c 4f 43 4b 20 25 64 20 25 64 20 77 61  (("LOCK %d %d wa
12ca0 73 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20  s %d(%d)\n",.   
12cb0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
12cc0 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  , locktype, pFil
12cd0 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  e->locktype, pFi
12ce0 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
12cf0 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  te));..  /* If t
12d00 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
12d10 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74  a lock of this t
12d20 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74  ype or more rest
12d30 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20  rictive on the. 
12d40 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e   ** OsFile, do n
12d50 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
12d60 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20  e the end_lock: 
12d70 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
12d80 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65  ** sqlite3OsEnte
12d90 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
12da0 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
12db0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
12dc0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63  e->locktype>=loc
12dd0 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74  ktype ){.    ret
12de0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
12df0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
12e00 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
12e10 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
12e20 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ct.  */.  assert
12e30 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
12e40 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  e!=NO_LOCK || lo
12e50 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
12e60 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
12e70 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49   locktype!=PENDI
12e80 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
12e90 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52  ert( locktype!=R
12ea0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
12eb0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
12ec0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
12ed0 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50  .  /* Lock the P
12ee0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65  ENDING_LOCK byte
12ef0 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61   if we need to a
12f00 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47  cquire a PENDING
12f10 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20   lock or.  ** a 
12f20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66  SHARED lock.  If
12f30 20 77 65 20 61 72 65 20 61 63 71 75 69 72 69 6e   we are acquirin
12f40 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  g a SHARED lock,
12f50 20 74 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   the acquisition
12f60 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e   of.  ** the PEN
12f70 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69  DING_LOCK byte i
12f80 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a  s temporary..  *
12f90 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20  /.  newLocktype 
12fa0 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  = pFile->locktyp
12fb0 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c  e;.  if(   (pFil
12fc0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  e->locktype==NO_
12fd0 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20  LOCK).     || ( 
12fe0 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43    (locktype==EXC
12ff0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20  LUSIVE_LOCK).   
13000 20 20 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d        && (pFile-
13010 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52  >locktype==RESER
13020 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a  VED_LOCK)).  ){.
13030 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b      int cnt = 3;
13040 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d  .    while( cnt-
13050 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 77 69  ->0 && (res = wi
13060 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
13070 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
13080 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20  FILE_FLAGS,.    
13090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130b0 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
130c0 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20  E, 0, 1, 0))==0 
130d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
130e0 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74  3 times to get t
130f0 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e  he pending lock.
13100 20 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64    This is needed
13110 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a   to work.      *
13120 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d  * around problem
13130 73 20 63 61 75 73 65 64 20 62 79 20 69 6e 64 65  s caused by inde
13140 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69  xing and/or anti
13150 2d 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 20  -virus software 
13160 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64  on.      ** Wind
13170 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20  ows systems..   
13180 20 20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65     ** If you are
13190 20 75 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65   using this code
131a0 20 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20   as a model for 
131b0 61 6c 74 65 72 6e 61 74 69 76 65 20 56 46 53 65  alternative VFSe
131c0 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20  s, do not.      
131d0 2a 2a 20 63 6f 70 79 20 74 68 69 73 20 72 65 74  ** copy this ret
131e0 72 79 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73  ry logic.  It is
131f0 20 61 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64   a hack intended
13200 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c   for Windows onl
13210 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
13220 20 20 4f 53 54 52 41 43 45 28 28 22 63 6f 75 6c    OSTRACE(("coul
13230 64 20 6e 6f 74 20 67 65 74 20 61 20 50 45 4e 44  d not get a PEND
13240 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64  ING lock. cnt=%d
13250 5c 6e 22 2c 20 63 6e 74 29 29 3b 0a 20 20 20 20  \n", cnt));.    
13260 20 20 69 66 28 20 63 6e 74 20 29 20 73 71 6c 69    if( cnt ) sqli
13270 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
13280 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  1);.    }.    go
13290 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72  tPendingLock = r
132a0 65 73 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73  es;.    if( !res
132b0 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72   ){.      lastEr
132c0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
132d0 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
132e0 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
132f0 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20  a shared lock.  
13300 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
13310 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
13320 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
13330 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
13340 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  type==NO_LOCK );
13350 0a 20 20 20 20 72 65 73 20 3d 20 67 65 74 52 65  .    res = getRe
13360 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
13370 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
13380 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
13390 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
133a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
133b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
133c0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
133d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
133e0 71 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44  quire a RESERVED
133f0 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
13400 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52   locktype==RESER
13410 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  VED_LOCK && res 
13420 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
13430 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
13440 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
13450 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b     res = winLock
13460 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
13470 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
13480 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45 44 5f  FLAGS, RESERVED_
13490 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
134a0 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
134b0 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65       newLocktype
134c0 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b   = RESERVED_LOCK
134d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
134e0 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
134f0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
13500 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13510 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   Acquire a PENDI
13520 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  NG lock.  */.  i
13530 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
13540 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
13550 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63  es ){.    newLoc
13560 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f  ktype = PENDING_
13570 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e  LOCK;.    gotPen
13580 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  dingLock = 0;.  
13590 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
135a0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
135b0 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
135c0 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
135d0 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
135e0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
135f0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41  e->locktype>=SHA
13600 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
13610 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64  res = unlockRead
13620 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
13630 20 4f 53 54 52 41 43 45 28 28 22 75 6e 72 65 61   OSTRACE(("unrea
13640 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72  dlock = %d\n", r
13650 65 73 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  es));.    res = 
13660 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
13670 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
13680 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48  CKFILE_FLAGS, SH
13690 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20  ARED_FIRST, 0,. 
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136b0 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
136c0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  , 0);.    if( re
136d0 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
136e0 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49  cktype = EXCLUSI
136f0 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  VE_LOCK;.    }el
13700 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
13710 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
13720 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53  rror();.      OS
13730 54 52 41 43 45 28 28 22 65 72 72 6f 72 2d 63 6f  TRACE(("error-co
13740 64 65 20 3d 20 25 64 5c 6e 22 2c 20 6c 61 73 74  de = %d\n", last
13750 45 72 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67  Errno));.      g
13760 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
13770 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
13780 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c  /* If we are hol
13790 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c  ding a PENDING l
137a0 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74  ock that ought t
137b0 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74  o be released, t
137c0 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65  hen.  ** release
137d0 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
137e0 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f  if( gotPendingLo
137f0 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  ck && locktype==
13800 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
13810 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
13820 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  (&pFile->h, PEND
13830 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
13840 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  0);.  }..  /* Up
13850 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20 6f  date the state o
13860 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68  f the lock has h
13870 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20  eld in the file 
13880 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a  descriptor then.
13890 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
138a0 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 75  appropriate resu
138b0 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  lt code..  */.  
138c0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72  if( res ){.    r
138d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
138e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53 54 52   }else{.    OSTR
138f0 41 43 45 28 28 22 4c 4f 43 4b 20 46 41 49 4c 45  ACE(("LOCK FAILE
13900 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f 72 20  D %d trying for 
13910 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c 6e 22  %d but got %d\n"
13920 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
13930 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 2c         locktype,
13940 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a   newLocktype));.
13950 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
13960 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
13970 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
13980 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46  E_BUSY;.  }.  pF
13990 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
139a0 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  (u8)newLocktype;
139b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
139c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
139d0 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
139e0 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
139f0 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
13a00 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
13a10 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
13a20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
13a30 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
13a40 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72  k is held, retur
13a50 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f  n.** non-zero, o
13a60 74 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a  therwise zero..*
13a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
13a80 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
13a90 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
13aa0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
13ab0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77  ){.  int rc;.  w
13ac0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
13ad0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  (winFile*)id;.. 
13ae0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
13af0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
13b00 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
13b10 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61  VEDLOCK; );..  a
13b20 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
13b30 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
13b40 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f  ktype>=RESERVED_
13b50 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  LOCK ){.    rc =
13b60 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   1;.    OSTRACE(
13b70 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
13b80 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c  d %d (local)\n",
13b90 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b   pFile->h, rc));
13ba0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
13bb0 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
13bc0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
13bd0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
13be0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
13bf0 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 1, 0);.    if
13c00 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 77 69  ( rc ){.      wi
13c10 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
13c20 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f  le->h, RESERVED_
13c30 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
13c40 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21      }.    rc = !
13c50 72 63 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  rc;.    OSTRACE(
13c60 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
13c70 64 20 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22  d %d (remote)\n"
13c80 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29  , pFile->h, rc))
13c90 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74  ;.  }.  *pResOut
13ca0 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20   = rc;.  return 
13cb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
13cc0 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
13cd0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
13ce0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
13cf0 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20  d to locktype.  
13d00 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74  locktype.** must
13d10 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
13d20 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
13d30 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
13d40 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
13d50 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
13d60 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
13d70 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
13d80 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
13d90 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
13da0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
13db0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  -op..**.** It is
13dc0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
13dd0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  r this routine t
13de0 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20 73 65  o fail if the se
13df0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a  cond argument.**
13e00 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66   is NO_LOCK.  If
13e10 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
13e20 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c  ment is SHARED_L
13e30 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f  OCK then this ro
13e40 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72  utine.** might r
13e50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
13e60 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  RR;.*/.static in
13e70 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69  t winUnlock(sqli
13e80 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
13e90 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
13ea0 6e 74 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69  nt type;.  winFi
13eb0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
13ec0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
13ed0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13ee0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21    assert( pFile!
13ef0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
13f00 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
13f10 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41  _LOCK );.  OSTRA
13f20 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 64 20 74  CE(("UNLOCK %d t
13f30 6f 20 25 64 20 77 61 73 20 25 64 28 25 64 29 5c  o %d was %d(%d)\
13f40 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  n", pFile->h, lo
13f50 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20  cktype,.        
13f60 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
13f70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  e, pFile->shared
13f80 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 20 20 74 79  LockByte));.  ty
13f90 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  pe = pFile->lock
13fa0 74 79 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65  type;.  if( type
13fb0 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  >=EXCLUSIVE_LOCK
13fc0 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63   ){.    winUnloc
13fd0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
13fe0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
13ff0 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
14000 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74  );.    if( lockt
14010 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
14020 20 26 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b   && !getReadLock
14030 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20  (pFile) ){.     
14040 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
14050 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57  never happen.  W
14060 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  e should always 
14070 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  be able to.     
14080 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68   ** reacquire th
14090 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  e read lock */. 
140a0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
140b0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
140c0 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74  RR_UNLOCK, osGet
140d0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
140e0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
140f0 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e  Unlock", pFile->
14100 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
14110 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45  }.  if( type>=RE
14120 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
14130 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
14140 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  (&pFile->h, RESE
14150 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
14160 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c   0);.  }.  if( l
14170 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
14180 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44   && type>=SHARED
14190 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c  _LOCK ){.    unl
141a0 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  ockReadLock(pFil
141b0 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79  e);.  }.  if( ty
141c0 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe>=PENDING_LOCK
141d0 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63   ){.    winUnloc
141e0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
141f0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
14200 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70  , 1, 0);.  }.  p
14210 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d  File->locktype =
14220 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20   (u8)locktype;. 
14230 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14240 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
14250 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67   inititially neg
14260 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20  ative then this 
14270 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74  is a query.  Set
14280 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f   *pArg to.** 1 o
14290 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 0 depending on
142a0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
142b0 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c  bit mask of pFil
142c0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20  e->ctrlFlags is 
142d0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  set..**.** If *p
142e0 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74  Arg is 0 or 1, t
142f0 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74  hen clear or set
14300 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66   the mask bit of
14310 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
14320 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
14330 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e  d winModeBit(win
14340 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73  File *pFile, uns
14350 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c  igned char mask,
14360 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69   int *pArg){.  i
14370 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20  f( *pArg<0 ){.  
14380 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65    *pArg = (pFile
14390 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61  ->ctrlFlags & ma
143a0 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20  sk)!=0;.  }else 
143b0 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29  if( (*pArg)==0 )
143c0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
143d0 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  lFlags &= ~mask;
143e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
143f0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
14400 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = mask;.  }.}../
14410 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
14420 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
14430 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28  int getTempname(
14440 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
14450 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f  zBuf);../*.** Co
14460 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20  ntrol and query 
14470 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
14480 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
14490 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f  ic int winFileCo
144a0 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
144b0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
144c0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77  void *pArg){.  w
144d0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
144e0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
144f0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
14500 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
14510 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b  NTL_LOCKSTATE: {
14520 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
14530 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  rg = pFile->lock
14540 74 79 70 65 3b 0a 20 20 20 20 20 20 72 65 74 75  type;.      retu
14550 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14560 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
14570 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20  ITE_LAST_ERRNO: 
14580 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
14590 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65  Arg = (int)pFile
145a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
145b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
145c0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
145d0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
145e0 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20  _CHUNK_SIZE: {. 
145f0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68       pFile->szCh
14600 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41  unk = *(int *)pA
14610 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rg;.      return
14620 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
14630 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
14640 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
14650 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  T: {.      if( p
14660 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
14670 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
14680 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a  e3_int64 oldSz;.
14690 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
146a0 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c   winFileSize(id,
146b0 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20   &oldSz);.      
146c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
146d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
146e0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
146f0 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33  ewSz = *(sqlite3
14700 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20  _int64*)pArg;.  
14710 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 53          if( newS
14720 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20  z>oldSz ){.     
14730 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
14740 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
14750 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
14760 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64  = winTruncate(id
14770 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20  , newSz);.      
14780 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
14790 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
147a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
147b0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
147c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
147d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
147e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
147f0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
14800 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
14810 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64  : {.      winMod
14820 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46  eBit(pFile, WINF
14830 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c  ILE_PERSIST_WAL,
14840 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
14850 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14860 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
14870 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
14880 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  L_POWERSAFE_OVER
14890 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77  WRITE: {.      w
148a0 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c  inModeBit(pFile,
148b0 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28   WINFILE_PSOW, (
148c0 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
148d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
148e0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
148f0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
14900 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20  VFSNAME: {.     
14910 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d   *(char**)pArg =
14920 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
14930 28 22 77 69 6e 33 32 22 29 3b 0a 20 20 20 20 20  ("win32");.     
14940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14950 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
14960 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57  e SQLITE_FCNTL_W
14970 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b  IN32_AV_RETRY: {
14980 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20  .      int *a = 
14990 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20  (int*)pArg;.    
149a0 20 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a    if( a[0]>0 ){.
149b0 20 20 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65          win32Ioe
149c0 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a  rrRetry = a[0];.
149d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
149e0 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 33       a[0] = win3
149f0 32 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20  2IoerrRetry;.   
14a00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
14a10 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  [1]>0 ){.       
14a20 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79   win32IoerrRetry
14a30 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20  Delay = a[1];.  
14a40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14a50 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e 33 32 49     a[1] = win32I
14a60 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a  oerrRetryDelay;.
14a70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
14a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14a90 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
14aa0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
14ab0 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  FILENAME: {.    
14ac0 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d    char *zTFile =
14ad0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
14ae0 72 6f 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d  ro( pFile->pVfs-
14af0 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20  >mxPathname );. 
14b00 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20       if( zTFile 
14b10 29 7b 0a 20 20 20 20 20 20 20 20 67 65 74 54 65  ){.        getTe
14b20 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56  mpname(pFile->pV
14b30 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
14b40 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  zTFile);.       
14b50 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d   *(char**)pArg =
14b60 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d   zTFile;.      }
14b70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
14b80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
14b90 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
14ba0 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a  TE_NOTFOUND;.}..
14bb0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
14bc0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
14bd0 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
14be0 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
14bf0 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
14c00 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
14c10 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
14c20 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
14c30 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
14c40 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
14c50 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
14c60 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
14c70 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
14c80 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
14c90 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
14ca0 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
14cb0 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
14cc0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
14cd0 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
14ce0 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
14cf0 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
14d00 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
14d10 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
14d20 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
14d30 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
14d40 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65  static int winSe
14d50 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
14d60 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76  _file *id){.  (v
14d70 6f 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e  oid)id;.  return
14d80 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14d90 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a  SECTOR_SIZE;.}..
14da0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76  /*.** Return a v
14db0 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20  ector of device 
14dc0 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e  characteristics.
14dd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
14de0 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65  inDeviceCharacte
14df0 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
14e00 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e  file *id){.  win
14e10 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69  File *p = (winFi
14e20 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e  le*)id;.  return
14e30 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e   SQLITE_IOCAP_UN
14e40 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f  DELETABLE_WHEN_O
14e50 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28  PEN |.         (
14e60 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  (p->ctrlFlags & 
14e70 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51  WINFILE_PSOW)?SQ
14e80 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
14e90 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30  SAFE_OVERWRITE:0
14ea0 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
14eb0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f  LITE_OMIT_WAL../
14ec0 2a 20 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69  * .** Windows wi
14ed0 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20  ll only let you 
14ee0 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65 77  create file view
14ef0 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20   mappings.** on 
14f00 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20  allocation size 
14f10 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e  granularity boun
14f20 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e  daries..** Durin
14f30 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69  g sqlite3_os_ini
14f40 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 74 53  t() we do a GetS
14f50 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74  ystemInfo().** t
14f60 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c  o get the granul
14f70 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53  arity size..*/.S
14f80 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79  YSTEM_INFO winSy
14f90 73 49 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65  sInfo;../*.** He
14fa0 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74  lper functions t
14fb0 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c  o obtain and rel
14fc0 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62  inquish the glob
14fd0 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a  al mutex. The.**
14fe0 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73   global mutex is
14ff0 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74   used to protect
15000 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f   the winLockInfo
15010 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79   objects used by
15020 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20   .** this file, 
15030 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79  all of which may
15040 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75   be shared by mu
15050 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
15060 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77  **.** Function w
15070 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
15080 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
15090 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
150a0 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
150b0 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
150c0 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
150d0 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
150e0 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
150f0 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
15100 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
15110 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
15120 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65  ex().**     asse
15130 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  rt( winShmMutexH
15140 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69  eld() );.**   wi
15150 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
15160 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15170 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
15180 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
15190 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
151a0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
151b0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
151c0 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
151d0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
151e0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  hmLeaveMutex(voi
151f0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
15200 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
15210 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
15220 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
15230 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64  MASTER));.}.#ifd
15240 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
15250 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
15260 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  mMutexHeld(void)
15270 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
15280 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
15290 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
152a0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
152b0 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
152c0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
152d0 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
152e0 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65  present a single
152f0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64   file opened and
15300 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76   mmapped to prov
15310 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65  ide.** shared me
15320 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74  mory.  When mult
15330 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
15340 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
15350 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ame.** log-summa
15360 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20  ry, each thread 
15370 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46  has its own winF
15380 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20  ile object, but 
15390 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e  they all.** poin
153a0 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
153b0 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f  stance of this o
153c0 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72  bject.  In other
153d0 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20   words, each.** 
153e0 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f  log-summary is o
153f0 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20  pened only once 
15400 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
15410 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
15420 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
15430 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
15440 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
15450 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
15460 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
15470 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
15480 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
15490 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
154a0 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a  *      pNext .**
154b0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
154c0 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
154d0 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
154e0 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
154f0 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
15500 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c  fid.**      zFil
15510 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68  ename.**.** Eith
15520 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75  er winShmNode.mu
15530 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
15540 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e   or winShmNode.n
15550 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69  Ref==0 and.** wi
15560 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
15570 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61  is true when rea
15580 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
15590 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a  any other field.
155a0 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ** in this struc
155b0 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75  ture..**.*/.stru
155c0 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a  ct winShmNode {.
155d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
155e0 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20  *mutex;      /* 
155f0 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20  Mutex to access 
15600 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  this object */. 
15610 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
15620 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
15630 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
15640 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69  */.  winFile hFi
15650 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
15660 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66  /* File handle f
15670 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a  rom winOpen */..
15680 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
15690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
156a0 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
156b0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
156c0 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20  .  int nRegion; 
156d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
156e0 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
156f0 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72  pRegion */.  str
15700 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a  uct ShmRegion {.
15710 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b      HANDLE hMap;
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15730 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d  File handle from
15740 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
15750 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a  ng */.    void *
15760 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69  pMap;.  } *aRegi
15770 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  on;.  DWORD last
15780 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
15790 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20   /* The Windows 
157a0 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c  errno from the l
157b0 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f  ast I/O error */
157c0 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  ..  int nRef;   
157d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
157e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53  * Number of winS
157f0 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
15800 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
15810 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b   winShm *pFirst;
15820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
15830 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74  ll winShm object
15840 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
15850 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  is */.  winShmNo
15860 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  de *pNext;      
15870 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69     /* Next in li
15880 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d  st of all winShm
15890 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a  Node objects */.
158a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
158b0 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d  BUG.  u8 nextShm
158c0 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
158d0 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62   /* Next availab
158e0 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c  le winShm.id val
158f0 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ue */.#endif.};.
15900 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ./*.** A global 
15910 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e  array of all win
15920 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e  ShmNode objects.
15930 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68  .**.** The winSh
15940 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  mMutexHeld() mus
15950 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20  t be true while 
15960 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
15970 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f  ng this list..*/
15980 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f  .static winShmNo
15990 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  de *winShmNodeLi
159a0 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53  st = 0;../*.** S
159b0 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
159c0 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
159d0 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
159e0 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
159f0 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
15a00 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
15a10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
15a20 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
15a30 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
15a40 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
15a50 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
15a60 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
15a70 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
15a80 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64    winShm.pShmNod
15a90 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69  e.**    winShm.i
15aa0 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65  d.**.** All othe
15ab0 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  r fields are rea
15ac0 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69  d/write.  The wi
15ad0 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nShm.pShmNode->m
15ae0 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
15af0 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73  d.** while acces
15b00 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
15b10 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
15b20 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20  truct winShm {. 
15b30 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
15b40 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54  mNode;      /* T
15b50 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69  he underlying wi
15b60 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  nShmNode object 
15b70 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65  */.  winShm *pNe
15b80 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
15b90 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77  /* Next winShm w
15ba0 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e  ith the same win
15bb0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ShmNode */.  u8 
15bc0 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
15bd0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15be0 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77  if holding the w
15bf0 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20  inShmNode mutex 
15c00 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d  */.  u16 sharedM
15c10 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
15c20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
15c30 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
15c40 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20    u16 exclMask; 
15c50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c60 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
15c70 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
15c80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
15c90 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20  BUG.  u8 id;    
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cb0 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
15cc0 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69  onnection with i
15cd0 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  ts winShmNode */
15ce0 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
15cf0 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64  * Constants used
15d00 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a   for locking.*/.
15d10 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f  #define WIN_SHM_
15d20 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49  BASE   ((22+SQLI
15d30 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29  TE_SHM_NLOCK)*4)
15d40 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74          /* first
15d50 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64   lock byte */.#d
15d60 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d  efine WIN_SHM_DM
15d70 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41  S    (WIN_SHM_BA
15d80 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  SE+SQLITE_SHM_NL
15d90 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e  OCK)  /* deadman
15da0 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a   switch */../*.*
15db0 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79  * Apply advisory
15dc0 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e   locks for all n
15dd0 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
15de0 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65   at ofst..*/.#de
15df0 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20  fine _SHM_UNLCK 
15e00 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f   1.#define _SHM_
15e10 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65  RDLCK  2.#define
15e20 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73   _SHM_WRLCK  3.s
15e30 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
15e40 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69  SystemLock(.  wi
15e50 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c  nShmNode *pFile,
15e60 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63      /* Apply loc
15e70 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20  ks to this open 
15e80 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
15e90 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c  gment */.  int l
15ea0 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20  ockType,        
15eb0 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20   /* _SHM_UNLCK, 
15ec0 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f  _SHM_RDLCK, or _
15ed0 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69  SHM_WRLCK */.  i
15ee0 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
15ef0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
15f00 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20  o first byte to 
15f10 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b  be locked/unlock
15f20 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
15f30 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
15f40 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
15f50 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
15f60 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ck */.){.  int r
15f70 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
15f80 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
15f90 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b  form Lock/Unlock
15fa0 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f  FileEx() */..  /
15fb0 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20  * Access to the 
15fc0 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
15fd0 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
15fe0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
15ff0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16000 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46  e3_mutex_held(pF
16010 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70  ile->mutex) || p
16020 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  File->nRef==0 );
16030 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41  ..  /* Release/A
16040 63 71 75 69 72 65 20 74 68 65 20 73 79 73 74 65  cquire the syste
16050 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a  m-level lock */.
16060 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
16070 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  _SHM_UNLCK ){.  
16080 20 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b    rc = winUnlock
16090 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69  File(&pFile->hFi
160a0 6c 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e  le.h, ofst, 0, n
160b0 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Byte, 0);.  }els
160c0 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  e{.    /* Initia
160d0 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  lize the locking
160e0 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
160f0 20 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73     DWORD dwFlags
16100 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c   = LOCKFILE_FAIL
16110 5f 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20  _IMMEDIATELY;.  
16120 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d    if( lockType =
16130 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64  = _SHM_WRLCK ) d
16140 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49  wFlags |= LOCKFI
16150 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
16160 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  K;.    rc = winL
16170 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
16180 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73  hFile.h, dwFlags
16190 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65  , ofst, 0, nByte
161a0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69  , 0);.  }.  .  i
161b0 66 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20  f( rc!= 0 ){.   
161c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
161d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
161e0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
161f0 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
16200 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ();.    rc = SQL
16210 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
16220 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
16230 4f 43 4b 20 25 64 20 25 73 20 25 73 20 30 78 25  OCK %d %s %s 0x%
16240 30 38 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 20 20  08lx\n", .      
16250 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c       pFile->hFil
16260 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  e.h,.           
16270 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
16280 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 2c  "ok" : "failed",
16290 0a 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b  .           lock
162a0 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b  Type==_SHM_UNLCK
162b0 20 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78   ? "UnlockFileEx
162c0 22 20 3a 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22  " : "LockFileEx"
162d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
162e0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 29 3b  le->lastErrno));
162f0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
16300 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
16310 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d  erences to VFS m
16320 65 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63  ethods */.static
16330 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c   int winOpen(sql
16340 69 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20  ite3_vfs*,const 
16350 63 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69  char*,sqlite3_fi
16360 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73  le*,int,int*);.s
16370 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c  tatic int winDel
16380 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ete(sqlite3_vfs 
16390 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  *,const char*,in
163a0 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65  t);../*.** Purge
163b0 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c   the winShmNodeL
163c0 69 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20  ist list of all 
163d0 65 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e  entries with win
163e0 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e  ShmNode.nRef==0.
163f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
16400 6f 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d  ot a VFS shared-
16410 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69  memory method; i
16420 74 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  t is a utility f
16430 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a  unction called.*
16440 2a 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d  * by VFS shared-
16450 6d 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a  memory methods..
16460 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
16470 69 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74  inShmPurge(sqlit
16480 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
16490 74 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20  t deleteFlag){. 
164a0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70   winShmNode **pp
164b0 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ;.  winShmNode *
164c0 70 3b 0a 20 20 42 4f 4f 4c 20 62 52 63 3b 0a 20  p;.  BOOL bRc;. 
164d0 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d   assert( winShmM
164e0 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
164f0 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65  pp = &winShmNode
16500 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28  List;.  while( (
16510 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20  p = *pp)!=0 ){. 
16520 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d     if( p->nRef==
16530 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
16540 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d  ;.      if( p->m
16550 75 74 65 78 20 29 20 73 71 6c 69 74 65 33 5f 6d  utex ) sqlite3_m
16560 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74  utex_free(p->mut
16570 65 78 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  ex);.      for(i
16580 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e  =0; i<p->nRegion
16590 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
165a0 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65  bRc = osUnmapVie
165b0 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 69  wOfFile(p->aRegi
165c0 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20  on[i].pMap);.   
165d0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
165e0 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64 20  HM-PURGE pid-%d 
165f0 75 6e 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64 20  unmap region=%d 
16600 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
16610 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47          (int)osG
16620 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
16630 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20 20  Id(), i,.       
16640 20 20 20 20 20 20 20 20 20 20 62 52 63 20 3f 20            bRc ? 
16650 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
16660 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d  );.        bRc =
16670 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
16680 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61  ->aRegion[i].hMa
16690 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  p);.        OSTR
166a0 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20  ACE(("SHM-PURGE 
166b0 70 69 64 2d 25 64 20 63 6c 6f 73 65 20 72 65 67  pid-%d close reg
166c0 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  ion=%d %s\n",.  
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
166e0 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74  int)osGetCurrent
166f0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 0a  ProcessId(), i,.
16700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16710 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66   bRc ? "ok" : "f
16720 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
16730 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68  }.      if( p->h
16740 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20  File.h!=NULL && 
16750 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41  p->hFile.h!=INVA
16760 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
16770 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
16780 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
16790 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69  n(1);.        wi
167a0 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f  nClose((sqlite3_
167b0 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65  file *)&p->hFile
167c0 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  );.        Simul
167d0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
167e0 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (0);.      }.   
167f0 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
16800 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d  g ){.        Sim
16810 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
16820 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73  gn(1);.        s
16830 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
16840 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
16850 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66     winDelete(pVf
16860 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  s, p->zFilename,
16870 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
16880 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
16890 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53  loc();.        S
168a0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
168b0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d  nign(0);.      }
168c0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e  .      *pp = p->
168d0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
168e0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65  ite3_free(p->aRe
168f0 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  gion);.      sql
16900 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
16910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
16920 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20  p = &p->pNext;. 
16930 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
16940 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65  * Open the share
16950 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
16960 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61  sociated with da
16970 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
16980 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70  d..**.** When op
16990 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72  ening a new shar
169a0 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
169b0 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74  if no other inst
169c0 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a  ances of that.**
169d0 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e   file are curren
169e0 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69  tly open, in thi
169f0 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20  s process or in 
16a00 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c  other processes,
16a10 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c   then.** the fil
16a20 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61  e must be trunca
16a30 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67  ted to zero leng
16a40 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68  th or have its h
16a50 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a  eader cleared..*
16a60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
16a70 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
16a80 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29  (winFile *pDbFd)
16a90 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  {.  struct winSh
16aa0 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
16ab0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
16ac0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
16ad0 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
16ae0 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53  t winShmNode *pS
16af0 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a  hmNode = 0;   /*
16b00 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
16b10 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
16b20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b40 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
16b50 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ode */.  struct 
16b60 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77  winShmNode *pNew
16b70 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
16b80 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77  ewly allocated w
16b90 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69  inShmNode */.  i
16ba0 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bc0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61    /* Size of zNa
16bd0 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  me in bytes */..
16be0 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
16bf0 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f  >pShm==0 );    /
16c00 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79  * Not previously
16c10 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a   opened */..  /*
16c20 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
16c30 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69  for the new sqli
16c40 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20  te3_shm object. 
16c50 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76   Also speculativ
16c60 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  ely.  ** allocat
16c70 65 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65  e space for a ne
16c80 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64  w winShmNode and
16c90 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   filename..  */.
16ca0 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c    p = sqlite3Mal
16cb0 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
16cc0 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d  *p) );.  if( p==
16cd0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
16ce0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
16cf0 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
16d00 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e  Strlen30(pDbFd->
16d10 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d  zPath);.  pNew =
16d20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
16d30 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  ro( sizeof(*pShm
16d40 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  Node) + nName + 
16d50 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  17 );.  if( pNew
16d60 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
16d70 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
16d80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
16d90 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
16da0 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
16db0 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
16dc0 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  1];.  sqlite3_sn
16dd0 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c  printf(nName+15,
16de0 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
16df0 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46  , "%s-shm", pDbF
16e00 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c  d->zPath);.  sql
16e10 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
16e20 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e  pDbFd->zPath, pN
16e30 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20  ew->zFilename); 
16e40 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73  ..  /* Look to s
16e50 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ee if there is a
16e60 6e 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68  n existing winSh
16e70 6d 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62  mNode that can b
16e80 65 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20  e used..  ** If 
16e90 6e 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53  no matching winS
16ea0 68 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79  hmNode currently
16eb0 20 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20   exists, create 
16ec0 61 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a  a new one..  */.
16ed0 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
16ee0 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d  ex();.  for(pShm
16ef0 4e 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Node = winShmNod
16f00 65 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b  eList; pShmNode;
16f10 20 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f   pShmNode=pShmNo
16f20 64 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  de->pNext){.    
16f30 2f 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63  /* TBD need to c
16f40 6f 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74  ome up with bett
16f50 65 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20  er match here.  
16f60 50 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75  Perhaps.    ** u
16f70 73 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f  se FILE_ID_BOTH_
16f80 44 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75  DIR_INFO Structu
16f90 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
16fa0 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
16fb0 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  p(pShmNode->zFil
16fc0 65 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69  ename, pNew->zFi
16fd0 6c 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  lename)==0 ) bre
16fe0 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  ak;.  }.  if( pS
16ff0 68 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71  hmNode ){.    sq
17000 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
17010 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
17020 53 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a  ShmNode = pNew;.
17030 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
17040 20 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70    ((winFile*)(&p
17050 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29  ShmNode->hFile))
17060 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
17070 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20  NDLE_VALUE;.    
17080 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20  pShmNode->pNext 
17090 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
170a0 3b 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65  ;.    winShmNode
170b0 4c 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  List = pShmNode;
170c0 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
170d0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
170e0 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
170f0 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
17100 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
17110 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
17120 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17130 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
17140 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
17150 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
17160 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44   rc = winOpen(pD
17170 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20  bFd->pVfs,.     
17180 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
17190 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
171b0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
171c0 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20   (UTF-8) */.    
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
171e0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68  lite3_file*)&pSh
171f0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f  mNode->hFile,  /
17200 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  * File handle he
17210 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  re */.          
17220 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
17230 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f  EN_WAL | SQLITE_
17240 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
17250 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
17260 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ATE,.           
17270 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
17280 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
17290 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  ){.      goto sh
172a0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
172b0 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
172c0 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65  to see if anothe
172d0 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
172e0 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61  ding the dead-ma
172f0 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a  n switch..    **
17300 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
17310 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
17320 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20  ro length. .    
17330 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68  */.    if( winSh
17340 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
17350 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b  Node, _SHM_WRLCK
17360 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
17370 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
17380 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
17390 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
173a0 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
173b0 2d 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20  ->hFile, 0);.   
173c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
173d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
173e0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
173f0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
17400 4d 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74  MOPEN, osGetLast
17410 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
17420 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4f 70            "winOp
17430 65 6e 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  enShm", pDbFd->z
17440 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
17450 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
17460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17470 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d      winShmSystem
17480 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
17490 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_UNLCK, WIN_S
174a0 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
174b0 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
174c0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
174d0 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49  , _SHM_RDLCK, WI
174e0 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  N_SHM_DMS, 1);. 
174f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
17500 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f  ) goto shm_open_
17510 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  err;.  }..  /* M
17520 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
17530 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
17540 66 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  f the winShmNode
17550 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
17560 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69  e = pShmNode;.#i
17570 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
17580 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d  G.  p->id = pShm
17590 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b  Node->nextShmId+
175a0 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d  +;.#endif.  pShm
175b0 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Node->nRef++;.  
175c0 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b  pDbFd->pShm = p;
175d0 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
175e0 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  tex();..  /* The
175f0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
17600 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73   on pShmNode has
17610 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
17620 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a  cremented under.
17630 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f    ** the cover o
17640 66 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65  f the winShmEnte
17650 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61  rMutex() mutex a
17660 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66  nd the pointer f
17670 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77  rom the.  ** new
17680 20 28 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29   (struct winShm)
17690 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70   object to the p
176a0 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e  ShmNode has been
176b0 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69   set. All that i
176c0 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64  s.  ** left to d
176d0 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  o is to link the
176e0 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f   new object into
176f0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
17700 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61   starting.  ** a
17710 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  t pShmNode->pFir
17720 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65  st. This must be
17730 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64   done while hold
17740 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65  ing the pShmNode
17750 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75  ->mutex .  ** mu
17760 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  tex..  */.  sqli
17770 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
17780 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
17790 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
177a0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
177b0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  .  pShmNode->pFi
177c0 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  rst = p;.  sqlit
177d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
177e0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
177f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
17800 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
17810 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f  here on any erro
17820 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72  r */.shm_open_er
17830 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65  r:.  winShmSyste
17840 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
17850 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f  _SHM_UNLCK, WIN_
17860 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77  SHM_DMS, 1);.  w
17870 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
17880 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20  ->pVfs, 0);     
17890 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
178a0 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
178b0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
178c0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
178d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
178e0 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  ew);.  winShmLea
178f0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
17900 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17910 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74   Close a connect
17920 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65  ion to shared-me
17930 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68  mory.  Delete th
17940 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a  e underlying .**
17950 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65   storage if dele
17960 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a  teFlag is true..
17970 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
17980 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  nShmUnmap(.  sql
17990 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
179a0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
179b0 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ase holding shar
179c0 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
179d0 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20  nt deleteFlag   
179e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
179f0 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e  ete after closin
17a00 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  g if true */.){.
17a10 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64    winFile *pDbFd
17a20 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
17a30 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ase holding shar
17a40 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77  ed-memory */.  w
17a50 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  inShm *p;       
17a60 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
17a70 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
17a80 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  sed */.  winShmN
17a90 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f  ode *pShmNode; /
17aa0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
17ab0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
17ac0 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ile */.  winShm 
17ad0 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f  **pp;          /
17ae0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
17af0 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  er sibling conne
17b00 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62  ctions */..  pDb
17b10 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
17b20 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  d;.  p = pDbFd->
17b30 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pShm;.  if( p==0
17b40 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
17b50 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  _OK;.  pShmNode 
17b60 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
17b70 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e    /* Remove conn
17b80 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68  ection p from th
17b90 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74  e set of connect
17ba0 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ions associated.
17bb0 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f    ** with pShmNo
17bc0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
17bd0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
17be0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
17bf0 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65  for(pp=&pShmNode
17c00 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21  ->pFirst; (*pp)!
17c10 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d  =p; pp = &(*pp)-
17c20 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20  >pNext){}.  *pp 
17c30 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f  = p->pNext;..  /
17c40 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65  * Free the conne
17c50 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c  ction p */.  sql
17c60 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
17c70 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b  pDbFd->pShm = 0;
17c80 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
17c90 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
17ca0 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49  >mutex);..  /* I
17cb0 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  f pShmNode->nRef
17cc0 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20   has reached 0, 
17cd0 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75  then close the u
17ce0 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73  nderlying.  ** s
17cf0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
17d00 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53  e, too */.  winS
17d10 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
17d20 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
17d30 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
17d40 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
17d50 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
17d60 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
17d70 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62   winShmPurge(pDb
17d80 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65  Fd->pVfs, delete
17d90 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e  Flag);.  }.  win
17da0 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
17db0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
17dc0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
17dd0 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73  hange the lock s
17de0 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65  tate for a share
17df0 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
17e00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17e10 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  winShmLock(.  sq
17e20 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
17e30 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
17e40 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
17e50 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
17e60 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ory */.  int ofs
17e70 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
17e80 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63      /* First loc
17e90 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  k to acquire or 
17ea0 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
17eb0 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   n,             
17ec0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17ed0 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63  r of locks to ac
17ee0 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
17ef0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
17f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f10 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77   /* What to do w
17f20 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  ith the lock */.
17f30 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
17f40 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
17f50 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  fd;        /* Co
17f60 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67  nnection holding
17f70 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
17f80 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20  /.  winShm *p = 
17f90 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
17fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
17fb0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
17fc0 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  eing locked */. 
17fd0 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20   winShm *pX;    
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
18000 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73  oping over all s
18010 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e  iblings */.  win
18020 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
18030 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
18040 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18050 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
18060 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
18070 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
18080 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
180b0 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
180c0 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
180d0 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20  ert( ofst>=0 && 
180e0 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53  ofst+n<=SQLITE_S
180f0 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  HM_NLOCK );.  as
18100 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20  sert( n>=1 );.  
18110 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28  assert( flags==(
18120 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
18130 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
18140 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
18150 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
18160 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
18170 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  SHM_EXCLUSIVE). 
18180 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
18190 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
181a0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
181b0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
181c0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
181d0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
181e0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
181f0 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VE) );.  assert(
18200 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20   n==1 || (flags 
18210 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  & SQLITE_SHM_EXC
18220 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20  LUSIVE)!=0 );.. 
18230 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31   mask = (u16)((1
18240 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  U<<(ofst+n)) - (
18250 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73  1U<<ofst));.  as
18260 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73  sert( n>1 || mas
18270 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a  k==(1<<ofst) );.
18280 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
18290 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
182a0 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c  mutex);.  if( fl
182b0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
182c0 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75  _UNLOCK ){.    u
182d0 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20  16 allMask = 0; 
182e0 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
182f0 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
18300 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65  s */..    /* See
18310 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73   if any siblings
18320 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20   hold this same 
18330 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28  lock */.    for(
18340 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
18350 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
18360 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
18370 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e  ( pX==p ) contin
18380 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ue;.      assert
18390 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
183a0 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70  & (p->exclMask|p
183b0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d  ->sharedMask))==
183c0 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61  0 );.      allMa
183d0 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  sk |= pX->shared
183e0 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
183f0 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73   /* Unlock the s
18400 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
18410 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61  s */.    if( (ma
18420 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30  sk & allMask)==0
18430 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
18440 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
18450 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
18460 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  NLCK, ofst+WIN_S
18470 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
18480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
18490 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
184a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f    }..    /* Undo
184b0 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73   the local locks
184c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
184d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
184e0 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26     p->exclMask &
184f0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  = ~mask;.      p
18500 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20  ->sharedMask &= 
18510 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20  ~mask;.    } .  
18520 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
18530 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  & SQLITE_SHM_SHA
18540 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61  RED ){.    u16 a
18550 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f  llShared = 0;  /
18560 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
18570 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
18580 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
18590 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  "p" */..    /* F
185a0 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68  ind out which sh
185b0 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61  ared locks are a
185c0 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73  lready held by s
185d0 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
185e0 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e  ns..    ** If an
185f0 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64  y sibling alread
18600 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  y holds an exclu
18610 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68  sive lock, go ah
18620 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ead and return. 
18630 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
18640 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  Y..    */.    fo
18650 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
18660 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
18670 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
18680 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
18690 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
186a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
186b0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
186c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
186d0 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64  .      allShared
186e0 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
186f0 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
18700 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63  * Get shared loc
18710 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
18720 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73   level, if neces
18730 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  sary */.    if( 
18740 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18750 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53  .      if( (allS
18760 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30  hared & mask)==0
18770 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
18780 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
18790 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
187a0 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e  _RDLCK, ofst+WIN
187b0 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
187c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
187d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
187e0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
187f0 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68  }..    /* Get th
18800 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c  e local shared l
18810 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
18820 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18830 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
18840 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
18850 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
18860 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f   /* Make sure no
18870 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
18880 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20  ions hold locks 
18890 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20  that will block 
188a0 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  this.    ** lock
188b0 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65  .  If any do, re
188c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
188d0 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
188e0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
188f0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
18900 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
18910 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
18920 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
18930 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73  sk)!=0 || (pX->s
18940 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
18950 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
18960 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
18970 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18990 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65   .    /* Get the
189a0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
189b0 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
189c0 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73  evel.  Then if s
189d0 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a  uccessful.    **
189e0 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c   also mark the l
189f0 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
18a00 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e  as being locked.
18a10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
18a20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18a30 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53  .      rc = winS
18a40 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
18a50 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43  mNode, _SHM_WRLC
18a60 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f  K, ofst+WIN_SHM_
18a70 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
18a80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18a90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
18aa0 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
18ab0 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
18ac0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
18ad0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
18ae0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18af0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
18b00 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
18b10 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
18b20 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
18b30 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
18b40 6f 74 20 25 30 33 78 2c 25 30 33 78 20 25 73 5c  ot %03x,%03x %s\
18b50 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
18b60 2d 3e 69 64 2c 20 28 69 6e 74 29 6f 73 47 65 74  ->id, (int)osGet
18b70 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
18b80 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73  (), p->sharedMas
18b90 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a  k, p->exclMask,.
18ba0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3f 20             rc ? 
18bb0 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29  "failed" : "ok")
18bc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
18bd0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
18be0 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72  nt a memory barr
18bf0 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65  ier or memory fe
18c00 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65  nce on shared me
18c10 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c  mory.  .**.** Al
18c20 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72  l loads and stor
18c30 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20  es begun before 
18c40 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74  the barrier must
18c50 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65   complete before
18c60 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20  .** any load or 
18c70 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65  store begun afte
18c80 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a  r the barrier..*
18c90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
18ca0 6e 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73  nShmBarrier(.  s
18cb0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
18cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
18cd0 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
18ce0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
18cf0 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  /.){.  UNUSED_PA
18d00 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f  RAMETER(fd);.  /
18d10 2a 20 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28  * MemoryBarrier(
18d20 29 3b 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77  ); // does not w
18d30 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e  ork -- do not kn
18d40 6f 77 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20  ow why not */.  
18d50 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
18d60 28 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76  ();.  winShmLeav
18d70 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a  eMutex();.}../*.
18d80 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
18d90 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
18da0 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
18db0 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e  o region iRegion
18dc0 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72   of the .** shar
18dd0 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed-memory associ
18de0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
18df0 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20  tabase file fd. 
18e00 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  Shared-memory re
18e10 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75  gions .** are nu
18e20 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
18e30 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
18e40 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
18e50 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
18e60 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69   .** bytes in si
18e70 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
18e80 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
18e90 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
18ea0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20  eturned and *pp 
18eb0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
18ec0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
18ed0 20 69 66 20 74 68 65 20 69 73 57 72 69 74 65 20   if the isWrite 
18ee0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
18ef0 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
18f00 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a   shared-memory.*
18f10 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  * region has not
18f20 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
18f30 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20  (by any client, 
18f40 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75  including one ru
18f50 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65  nning in a.** se
18f60 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c  parate process),
18f70 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74   then *pp is set
18f80 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
18f90 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
18fa0 20 49 66 20 0a 2a 2a 20 69 73 57 72 69 74 65 20   If .** isWrite 
18fb0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
18fc0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
18fd0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
18fe0 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a  on has not yet .
18ff0 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
19000 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
19010 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
19020 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
19030 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
19040 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  region has alrea
19050 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
19060 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  d or is allocate
19070 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c  d by.** this cal
19080 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  l as described a
19090 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  bove, then it is
190a0 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
190b0 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20  s processes .** 
190c0 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69  address space (i
190d0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
190e0 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74  ady), *pp is set
190f0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
19100 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f   mapped .** memo
19110 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
19120 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
19130 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d  atic int winShmM
19140 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
19150 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
19160 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
19170 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65  open on database
19180 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69   file */.  int i
19190 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
191a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
191b0 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65  gion to retrieve
191c0 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69   */.  int szRegi
191d0 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
191e0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
191f0 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
19200 74 20 69 73 57 72 69 74 65 2c 20 20 20 20 20 20  t isWrite,      
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19220 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20   True to extend 
19230 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72  file if necessar
19240 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61  y */.  void vola
19250 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20  tile **pp       
19260 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d         /* OUT: M
19270 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  apped memory */.
19280 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44  ){.  winFile *pD
19290 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
192a0 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20  fd;.  winShm *p 
192b0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
192c0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
192d0 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20  mNode;.  int rc 
192e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
192f0 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 63  if( !p ){.    rc
19300 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64   = winOpenShared
19310 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
19320 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
19330 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
19340 3b 0a 20 20 20 20 70 20 3d 20 70 44 62 46 64 2d  ;.    p = pDbFd-
19350 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68  >pShm;.  }.  pSh
19360 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
19370 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ode;..  sqlite3_
19380 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
19390 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
193a0 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e  assert( szRegion
193b0 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65  ==pShmNode->szRe
193c0 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  gion || pShmNode
193d0 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a  ->nRegion==0 );.
193e0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
193f0 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f  >nRegion<=iRegio
19400 6e 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  n ){.    struct 
19410 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77  ShmRegion *apNew
19420 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
19430 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72  ew aRegion[] arr
19440 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ay */.    int nB
19450 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31  yte = (iRegion+1
19460 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20  )*szRegion;  /* 
19470 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64  Minimum required
19480 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
19490 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
194a0 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sz;             
194b0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
194c0 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65  size of wal-inde
194d0 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70  x file */..    p
194e0 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
194f0 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20  n = szRegion;.. 
19500 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
19510 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f  ted region is no
19520 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  t mapped into th
19530 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
19540 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20  ress space..    
19550 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
19560 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61  if it has been a
19570 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69  llocated (i.e. i
19580 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  f the wal-index 
19590 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c  file is.    ** l
195a0 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63  arge enough to c
195b0 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65  ontain the reque
195c0 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20  sted region)..  
195d0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69    */.    rc = wi
195e0 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74  nFileSize((sqlit
195f0 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e  e3_file *)&pShmN
19600 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29  ode->hFile, &sz)
19610 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
19620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19630 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
19640 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
19650 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73  HMSIZE, osGetLas
19660 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
19670 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d           "winShm
19680 4d 61 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map1", pDbFd->zP
19690 61 74 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ath);.      goto
196a0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
196b0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c    }..    if( sz<
196c0 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f  nByte ){.      /
196d0 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
196e0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f  memory region do
196f0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66  es not exist. If
19700 20 69 73 57 72 69 74 65 20 69 73 20 73 65 74 20   isWrite is set 
19710 74 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  to.      ** zero
19720 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70  , exit early. *p
19730 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  p will be set to
19740 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
19750 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  _OK returned..  
19760 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
19770 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69  Alternatively, i
19780 66 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e  f isWrite is non
19790 2d 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e  -zero, use ftrun
197a0 63 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61  cate() to alloca
197b0 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
197c0 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
197d0 20 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a   region..      *
197e0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 57  /.      if( !isW
197f0 72 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70  rite ) goto shmp
19800 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72  age_out;.      r
19810 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
19820 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
19830 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
19840 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
19850 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19860 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
19870 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
19880 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
19890 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  ZE, osGetLastErr
198a0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
198b0 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
198c0 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p2", pDbFd->zPat
198d0 68 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  h);.        goto
198e0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
198f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
19900 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75   /* Map the requ
19910 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
19920 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ion into this pr
19930 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
19940 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70  space. */.    ap
19950 4e 65 77 20 3d 20 28 73 74 72 75 63 74 20 53 68  New = (struct Sh
19960 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65  mRegion *)sqlite
19970 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  3_realloc(.     
19980 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
19990 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31  gion, (iRegion+1
199a0 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30  )*sizeof(apNew[0
199b0 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ]).    );.    if
199c0 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
199d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
199e0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
199f0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
19a00 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68  t;.    }.    pSh
19a10 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d  mNode->aRegion =
19a20 20 61 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69   apNew;..    whi
19a30 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  le( pShmNode->nR
19a40 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29  egion<=iRegion )
19a50 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68  {.      HANDLE h
19a60 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20  Map = NULL;     
19a70 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70      /* file-mapp
19a80 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ing handle */.  
19a90 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d      void *pMap =
19aa0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
19ab0 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  /* Mapped memory
19ac0 20 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20   region */.     
19ad0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
19ae0 49 4e 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20  INRT.      hMap 
19af0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
19b00 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68  ppingFromApp(pSh
19b10 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  mNode->hFile.h,.
19b20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
19b30 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
19b40 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
19b50 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e    );.#elif defin
19b60 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
19b70 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 20 20  HAS_WIDE).      
19b80 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
19b90 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d  ileMappingW(pShm
19ba0 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a  Node->hFile.h, .
19bb0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
19bc0 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
19bd0 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  0, nByte, NULL. 
19be0 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65       );.#elif de
19bf0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
19c00 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20  32_HAS_ANSI).   
19c10 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
19c20 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70  teFileMappingA(p
19c30 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
19c40 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  , .          NUL
19c50 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
19c60 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  E, 0, nByte, NUL
19c70 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69  L.      );.#endi
19c80 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  f.      OSTRACE(
19c90 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64  ("SHM-MAP pid-%d
19ca0 20 63 72 65 61 74 65 20 72 65 67 69 6f 6e 3d 25   create region=%
19cb0 64 20 6e 62 79 74 65 3d 25 64 20 25 73 5c 6e 22  d nbyte=%d %s\n"
19cc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19cd0 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65   (int)osGetCurre
19ce0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
19cf0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
19d00 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20  , nByte,.       
19d10 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22          hMap ? "
19d20 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
19d30 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61 70  ;.      if( hMap
19d40 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
19d50 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f  iOffset = pShmNo
19d60 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65  de->nRegion*szRe
19d70 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e  gion;.        in
19d80 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d  t iOffsetShift =
19d90 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79   iOffset % winSy
19da0 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
19db0 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23  onGranularity;.#
19dc0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
19dd0 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20  RT.        pMap 
19de0 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
19df0 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46  eFromApp(hMap, F
19e00 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20  ILE_MAP_WRITE | 
19e10 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20  FILE_MAP_READ,. 
19e20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 73             iOffs
19e30 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66  et - iOffsetShif
19e40 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f  t, szRegion + iO
19e50 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20  ffsetShift.     
19e60 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
19e70 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70      pMap = osMap
19e80 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c  ViewOfFile(hMap,
19e90 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20   FILE_MAP_WRITE 
19ea0 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c  | FILE_MAP_READ,
19eb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20  .            0, 
19ec0 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65  iOffset - iOffse
19ed0 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e  tShift, szRegion
19ee0 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a   + iOffsetShift.
19ef0 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69          );.#endi
19f00 66 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  f.        OSTRAC
19f10 45 28 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d  E(("SHM-MAP pid-
19f20 25 64 20 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64  %d map region=%d
19f30 20 6f 66 66 73 65 74 3d 25 64 20 73 69 7a 65 3d   offset=%d size=
19f40 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
19f50 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
19f60 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
19f70 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64  essId(), pShmNod
19f80 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66  e->nRegion, iOff
19f90 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  set,.           
19fa0 20 20 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20        szRegion, 
19fb0 70 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66  pMap ? "ok" : "f
19fc0 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
19fd0 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 4d 61  }.      if( !pMa
19fe0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68  p ){.        pSh
19ff0 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  mNode->lastErrno
1a000 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1a010 72 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r();.        rc 
1a020 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1a030 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
1a040 50 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73  P, pShmNode->las
1a050 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
1a060 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d           "winShm
1a070 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map3", pDbFd->zP
1a080 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ath);.        if
1a090 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65  ( hMap ) osClose
1a0a0 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20  Handle(hMap);.  
1a0b0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1a0c0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
1a0d0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1a0e0 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  >aRegion[pShmNod
1a0f0 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70  e->nRegion].pMap
1a100 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70   = pMap;.      p
1a110 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
1a120 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
1a130 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b  on].hMap = hMap;
1a140 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1a150 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20  >nRegion++;.    
1a160 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f  }.  }..shmpage_o
1a170 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  ut:.  if( pShmNo
1a180 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67  de->nRegion>iReg
1a190 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ion ){.    int i
1a1a0 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e  Offset = iRegion
1a1b0 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69  *szRegion;.    i
1a1c0 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20  nt iOffsetShift 
1a1d0 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53  = iOffset % winS
1a1e0 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
1a1f0 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a  ionGranularity;.
1a200 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63      char *p = (c
1a210 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e  har *)pShmNode->
1a220 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d  aRegion[iRegion]
1a230 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d  .pMap;.    *pp =
1a240 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66   (void *)&p[iOff
1a250 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c  setShift];.  }el
1a260 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
1a270 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1a280 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1a290 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
1a2a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
1a2b0 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53  se.# define winS
1a2c0 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65  hmMap     0.# de
1a2d0 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20  fine winShmLock 
1a2e0 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69     0.# define wi
1a2f0 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  nShmBarrier 0.# 
1a300 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d  define winShmUnm
1a310 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a  ap   0.#endif /*
1a320 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
1a330 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
1a340 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65  ** Here ends the
1a350 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1a360 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  of all sqlite3_f
1a370 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a  ile methods..**.
1a380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a390 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74  ****** End sqlit
1a3a0 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20  e3_file Methods 
1a3b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a3c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1a3d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1a420 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74  ./*.** This vect
1a430 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74  or defines all t
1a440 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  he methods that 
1a450 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61  can operate on a
1a460 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c  n.** sqlite3_fil
1a470 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a  e for win32..*/.
1a480 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
1a490 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1a4a0 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a  winIoMethod = {.
1a4b0 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20    2,            
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4d0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
1a4e0 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20  .  winClose,    
1a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a500 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a     /* xClose */.
1a510 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20    winRead,      
1a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a530 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20    /* xRead */.  
1a540 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20  winWrite,       
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a560 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77  /* xWrite */.  w
1a570 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  inTruncate,     
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a590 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20  * xTruncate */. 
1a5a0 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20   winSync,       
1a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5c0 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77   /* xSync */.  w
1a5d0 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  inFileSize,     
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a5f0 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20  * xFileSize */. 
1a600 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20   winLock,       
1a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a620 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77   /* xLock */.  w
1a630 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  inUnlock,       
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a650 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77  * xUnlock */.  w
1a660 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  inCheckReservedL
1a670 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ock,           /
1a680 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
1a690 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  Lock */.  winFil
1a6a0 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
1a6b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
1a6c0 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77  leControl */.  w
1a6d0 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  inSectorSize,   
1a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a6f0 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
1a700 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61 72  .  winDeviceChar
1a710 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 20 20  acteristics,    
1a720 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61     /* xDeviceCha
1a730 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
1a740 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20    winShmMap,    
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a    /* xShmMap */.
1a770 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20    winShmLock,   
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a790 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f    /* xShmLock */
1a7a0 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  .  winShmBarrier
1a7b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a7c0 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65     /* xShmBarrie
1a7d0 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d  r */.  winShmUnm
1a7e0 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ap              
1a7f0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e         /* xShmUn
1a800 6d 61 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a  map */.};../****
1a810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a850 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
1a860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a870 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  ***** sqlite3_vf
1a880 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
1a890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8a0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  ******.**.** Thi
1a8b0 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
1a8c0 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ins the implemen
1a8d0 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64  tation of method
1a8e0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  s on the.** sqli
1a8f0 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
1a900 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  */../*.** Conver
1a910 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61  t a UTF-8 filena
1a920 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72  me into whatever
1a930 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c   form the underl
1a940 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e  ying.** operatin
1a950 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66  g system wants f
1a960 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70  ilenames in.  Sp
1a970 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
1a980 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74  result.** is obt
1a990 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
1a9a0 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  c and must be fr
1a9b0 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
1a9c0 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
1a9d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
1a9e0 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
1a9f0 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ame(const char *
1aa00 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f  zFilename){.  vo
1aa10 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
1aa20 20 30 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29   0;.  if( isNT()
1aa30 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74   ){.    zConvert
1aa40 65 64 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  ed = utf8ToUnico
1aa50 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
1aa60 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1aa70 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
1aa80 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e    else{.    zCon
1aa90 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  verted = sqlite3
1aaa0 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d  _win32_utf8_to_m
1aab0 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  bcs(zFilename);.
1aac0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20    }.#endif.  /* 
1aad0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64  caller will hand
1aae0 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  le out of memory
1aaf0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f   */.  return zCo
1ab00 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  nverted;.}../*.*
1ab10 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
1ab20 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
1ab30 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
1ab40 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
1ab50 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 70   to.** hold at p
1ab60 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
1ab70 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73  characters..*/.s
1ab80 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d  tatic int getTem
1ab90 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
1aba0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73  char *zBuf){.  s
1abb0 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
1abc0 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
1abd0 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
1abe0 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
1abf0 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
1ac00 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
1ac10 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65  3456789";.  size
1ac20 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  _t i, j;.  int n
1ac30 54 65 6d 70 50 61 74 68 3b 0a 20 20 63 68 61 72  TempPath;.  char
1ac40 20 7a 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f 50   zTempPath[MAX_P
1ac50 41 54 48 2b 32 5d 3b 0a 0a 20 20 2f 2a 20 49 74  ATH+2];..  /* It
1ac60 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
1ac70 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
1ac80 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
1ac90 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
1aca0 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
1acb0 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
1acc0 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
1acd0 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
1ace0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
1acf0 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a  on failing. .  *
1ad00 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
1ad10 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1ad20 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 6d  TE_IOERR );..  m
1ad30 65 6d 73 65 74 28 7a 54 65 6d 70 50 61 74 68 2c  emset(zTempPath,
1ad40 20 30 2c 20 4d 41 58 5f 50 41 54 48 2b 32 29 3b   0, MAX_PATH+2);
1ad50 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ..  if( sqlite3_
1ad60 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29  temp_directory )
1ad70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
1ad80 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d  printf(MAX_PATH-
1ad90 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22  30, zTempPath, "
1ada0 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d  %s", sqlite3_tem
1adb0 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  p_directory);.  
1adc0 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  }.#if !SQLITE_OS
1add0 5f 57 49 4e 52 54 0a 20 20 65 6c 73 65 20 69 66  _WINRT.  else if
1ade0 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
1adf0 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20  char *zMulti;.  
1ae00 20 20 57 43 48 41 52 20 7a 57 69 64 65 50 61 74    WCHAR zWidePat
1ae10 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20  h[MAX_PATH];.   
1ae20 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 28   osGetTempPathW(
1ae30 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 57 69  MAX_PATH-30, zWi
1ae40 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75  dePath);.    zMu
1ae50 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  lti = unicodeToU
1ae60 74 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a  tf8(zWidePath);.
1ae70 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29      if( zMulti )
1ae80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1ae90 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
1aea0 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c  H-30, zTempPath,
1aeb0 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a   "%s", zMulti);.
1aec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1aed0 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20  ee(zMulti);.    
1aee0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
1aef0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1af00 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
1af10 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1af20 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
1af30 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
1af40 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72  *zUtf8;.    char
1af50 20 7a 4d 62 63 73 50 61 74 68 5b 4d 41 58 5f 50   zMbcsPath[MAX_P
1af60 41 54 48 5d 3b 0a 20 20 20 20 6f 73 47 65 74 54  ATH];.    osGetT
1af70 65 6d 70 50 61 74 68 41 28 4d 41 58 5f 50 41 54  empPathA(MAX_PAT
1af80 48 2d 33 30 2c 20 7a 4d 62 63 73 50 61 74 68 29  H-30, zMbcsPath)
1af90 3b 0a 20 20 20 20 7a 55 74 66 38 20 3d 20 73 71  ;.    zUtf8 = sq
1afa0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
1afb0 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73 50 61  _to_utf8(zMbcsPa
1afc0 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74  th);.    if( zUt
1afd0 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  f8 ){.      sqli
1afe0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
1aff0 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50  _PATH-30, zTempP
1b000 61 74 68 2c 20 22 25 73 22 2c 20 7a 55 74 66 38  ath, "%s", zUtf8
1b010 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b020 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20  _free(zUtf8);.  
1b030 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1b040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1b050 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
1b060 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
1b070 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  f..  /* Check th
1b080 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
1b090 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e  ffer is large en
1b0a0 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d  ough for the tem
1b0b0 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a  porary file .  *
1b0c0 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73  * name. If it is
1b0d0 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c   not, return SQL
1b0e0 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a  ITE_ERROR..  */.
1b0f0 20 20 6e 54 65 6d 70 50 61 74 68 20 3d 20 73 71    nTempPath = sq
1b100 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
1b110 65 6d 70 50 61 74 68 29 3b 0a 0a 20 20 69 66 28  empPath);..  if(
1b120 20 28 6e 54 65 6d 70 50 61 74 68 20 2b 20 73 71   (nTempPath + sq
1b130 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51  lite3Strlen30(SQ
1b140 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
1b150 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d 20  REFIX) + 18) >= 
1b160 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75  nBuf ){.    retu
1b170 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
1b180 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 6e 54  .  }..  for(i=nT
1b190 65 6d 70 50 61 74 68 3b 20 69 3e 30 20 26 26 20  empPath; i>0 && 
1b1a0 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d  zTempPath[i-1]==
1b1b0 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a  '\\'; i--){}.  z
1b1c0 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b  TempPath[i] = 0;
1b1d0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
1b1e0 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42  intf(nBuf-18, zB
1b1f0 75 66 2c 20 28 6e 54 65 6d 70 50 61 74 68 20 3e  uf, (nTempPath >
1b200 20 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20   0) ?.          
1b210 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73               "%s
1b220 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  \\"SQLITE_TEMP_F
1b230 49 4c 45 5f 50 52 45 46 49 58 20 3a 20 53 51 4c  ILE_PREFIX : SQL
1b240 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
1b250 45 46 49 58 2c 0a 20 20 20 20 20 20 20 20 20 20  EFIX,.          
1b260 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 50 61           zTempPa
1b270 74 68 29 3b 0a 20 20 6a 20 3d 20 73 71 6c 69 74  th);.  j = sqlit
1b280 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29  e3Strlen30(zBuf)
1b290 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64  ;.  sqlite3_rand
1b2a0 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66  omness(15, &zBuf
1b2b0 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [j]);.  for(i=0;
1b2c0 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29   i<15; i++, j++)
1b2d0 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  {.    zBuf[j] = 
1b2e0 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28  (char)zChars[ ((
1b2f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42  unsigned char)zB
1b300 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a  uf[j])%(sizeof(z
1b310 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d  Chars)-1) ];.  }
1b320 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a  .  zBuf[j] = 0;.
1b330 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b    zBuf[j+1] = 0;
1b340 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ..  OSTRACE(("TE
1b350 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73 5c  MP FILENAME: %s\
1b360 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65  n", zBuf));.  re
1b370 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
1b380 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1b390 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d   TRUE if the nam
1b3a0 65 64 20 66 69 6c 65 20 69 73 20 72 65 61 6c 6c  ed file is reall
1b3b0 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20 20  y a directory.  
1b3c0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 0a  Return false if.
1b3d0 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 68 69  ** it is somethi
1b3e0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
1b3f0 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 69 66  directory, or if
1b400 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
1b410 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20  nd of memory.** 
1b420 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
1b430 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
1b440 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74  t winIsDir(const
1b450 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
1b460 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  d){.  DWORD attr
1b470 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
1b480 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
1b490 6f 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29  o;..  if( isNT()
1b4a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
1b4b0 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46  = 0;.    WIN32_F
1b4c0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41  ILE_ATTRIBUTE_DA
1b4d0 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20  TA sAttrData;.  
1b4e0 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44    memset(&sAttrD
1b4f0 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ata, 0, sizeof(s
1b500 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20  AttrData));.    
1b510 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73  while( !(rc = os
1b520 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
1b530 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43  sExW((LPCWSTR)zC
1b540 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
1b550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b560 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78         GetFileEx
1b570 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20  InfoStandard,.  
1b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b590 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74             &sAtt
1b5a0 72 44 61 74 61 29 29 20 26 26 20 72 65 74 72 79  rData)) && retry
1b5b0 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
1b5c0 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20  tErrno) ){}.    
1b5d0 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20  if( !rc ){.     
1b5e0 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49 6e   return 0; /* In
1b5f0 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20  valid name? */. 
1b600 20 20 20 7d 0a 20 20 20 20 61 74 74 72 20 3d 20     }.    attr = 
1b610 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65  sAttrData.dwFile
1b620 41 74 74 72 69 62 75 74 65 73 3b 0a 23 69 66 20  Attributes;.#if 
1b630 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d  SQLITE_OS_WINCE=
1b640 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  =0.  }else{.    
1b650 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
1b660 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61  AttributesA((cha
1b670 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
1b680 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74  #endif.  }.  ret
1b690 75 72 6e 20 28 61 74 74 72 21 3d 49 4e 56 41 4c  urn (attr!=INVAL
1b6a0 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
1b6b0 45 53 29 20 26 26 20 28 61 74 74 72 26 46 49 4c  ES) && (attr&FIL
1b6c0 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
1b6d0 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  CTORY);.}../*.**
1b6e0 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f   Open a file..*/
1b6f0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
1b700 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
1b710 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
1b720 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
1b730 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
1b740 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ame,        /* N
1b750 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
1b760 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c  (UTF-8) */.  sql
1b770 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20  ite3_file *id,  
1b780 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
1b790 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20  the SQLite file 
1b7a0 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
1b7b0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
1b7c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
1b7d0 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f  en mode flags */
1b7e0 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
1b7f0 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
1b800 53 74 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c  Status return fl
1b810 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44  ags */.){.  HAND
1b820 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61  LE h;.  DWORD la
1b830 73 74 45 72 72 6e 6f 3b 0a 20 20 44 57 4f 52 44  stErrno;.  DWORD
1b840 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
1b850 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61 72  ;.  DWORD dwShar
1b860 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64  eMode;.  DWORD d
1b870 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
1b880 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77  tion;.  DWORD dw
1b890 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
1b8a0 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49  es = 0;.#if SQLI
1b8b0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e  TE_OS_WINCE.  in
1b8c0 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65  t isTemp = 0;.#e
1b8d0 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ndif.  winFile *
1b8e0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
1b8f0 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  *)id;.  void *zC
1b900 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20 20  onverted;       
1b910 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61         /* Filena
1b920 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e  me in OS encodin
1b930 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  g */.  const cha
1b940 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a  r *zUtf8Name = z
1b950 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d  Name; /* Filenam
1b960 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64  e in UTF-8 encod
1b970 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ing */.  int cnt
1b980 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61   = 0;..  /* If a
1b990 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
1b9a0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
1b9b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1b9c0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
1b9d0 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
1b9e0 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
1b9f0 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
1ba00 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
1ba10 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
1ba20 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41   zTmpname[MAX_PA
1ba30 54 48 2b 32 5d 3b 20 20 20 20 20 2f 2a 20 42 75  TH+2];     /* Bu
1ba40 66 66 65 72 20 75 73 65 64 20 74 6f 20 63 72 65  ffer used to cre
1ba50 61 74 65 20 74 65 6d 70 20 66 69 6c 65 6e 61 6d  ate temp filenam
1ba60 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d  e */..  int rc =
1ba70 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
1ba80 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
1ba90 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  on Return Code *
1baa0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  /.#if !defined(N
1bab0 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45  DEBUG) || SQLITE
1bac0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20  _OS_WINCE.  int 
1bad0 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
1bae0 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FFFFFF00;  /* Ty
1baf0 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
1bb00 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20  en */.#endif..  
1bb10 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20  int isExclusive 
1bb20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
1bb30 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
1bb40 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65  E);.  int isDele
1bb50 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
1bb60 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
1bb70 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20  LETEONCLOSE);.  
1bb80 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20  int isCreate    
1bb90 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
1bba0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
1bbb0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1bbc0 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
1bbd0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
1bbe0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
1bbf0 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e  LY);.#endif.  in
1bc00 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
1bc10 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1bc20 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
1bc30 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
1bc40 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f  G.  int isOpenJo
1bc50 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74  urnal = (isCreat
1bc60 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65  e && (.        e
1bc70 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1bc80 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
1bc90 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d   .     || eType=
1bca0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
1bcb0 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  N_JOURNAL .     
1bcc0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
1bcd0 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a  _OPEN_WAL.  ));.
1bce0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65  #endif..  /* Che
1bcf0 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ck the following
1bd00 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
1bd10 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a  true: .  **.  **
1bd20 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f     (a) Exactly o
1bd30 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52  ne of the READWR
1bd40 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59  ITE and READONLY
1bd50 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73   flags must be s
1bd60 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20  et, and .  **   
1bd70 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73  (b) if CREATE is
1bd80 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57   set, then READW
1bd90 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  RITE must also b
1bda0 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
1bdb0 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49    (c) if EXCLUSI
1bdc0 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  VE is set, then 
1bdd0 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
1bde0 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20   be set..  **   
1bdf0 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43  (d) if DELETEONC
1be00 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65  LOSE is set, the
1be10 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
1be20 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  so be set..  */.
1be30 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64    assert((isRead
1be40 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61  only==0 || isRea
1be50 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69  dWrite==0) && (i
1be60 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73  sReadWrite || is
1be70 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73  Readonly));.  as
1be80 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30  sert(isCreate==0
1be90 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29   || isReadWrite)
1bea0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63  ;.  assert(isExc
1beb0 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43  lusive==0 || isC
1bec0 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  reate);.  assert
1bed0 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20  (isDelete==0 || 
1bee0 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a  isCreate);..  /*
1bef0 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61   The main DB, ma
1bf00 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20  in journal, WAL 
1bf10 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20  file and master 
1bf20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65  journal are neve
1bf30 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  r .  ** automati
1bf40 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e  cally deleted. N
1bf50 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72  or are they ever
1bf60 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
1bf70 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1bf80 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
1bf90 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
1bfa0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1bfb0 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
1bfc0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
1bfd0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
1bfe0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1bff0 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
1c000 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
1c010 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
1c020 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
1c030 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29  MASTER_JOURNAL )
1c040 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
1c050 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
1c060 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
1c070 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20  E_OPEN_WAL );.. 
1c080 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
1c090 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
1c0a0 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74  has set one of t
1c0b0 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66  he "file-type" f
1c0c0 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72  lags. */.  asser
1c0d0 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
1c0e0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20  _OPEN_MAIN_DB   
1c0f0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
1c100 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
1c110 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
1c120 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
1c130 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  AIN_JOURNAL || e
1c140 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1c150 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a  N_TEMP_JOURNAL .
1c160 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
1c170 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42  =SQLITE_OPEN_SUB
1c180 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79  JOURNAL   || eTy
1c190 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1c1a0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
1c1b0 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
1c1c0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41  =SQLITE_OPEN_TRA
1c1d0 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79  NSIENT_DB || eTy
1c1e0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1c1f0 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65  WAL.  );..  asse
1c200 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a  rt( pFile!=0 );.
1c210 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20    memset(pFile, 
1c220 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c  0, sizeof(winFil
1c230 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  e));.  pFile->h 
1c240 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
1c250 5f 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c  _VALUE;..#if SQL
1c260 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
1c270 66 28 20 21 73 71 6c 69 74 65 33 5f 74 65 6d 70  f( !sqlite3_temp
1c280 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  _directory ){.  
1c290 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
1c2a0 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20  LITE_ERROR,.    
1c2b0 20 20 20 20 22 73 71 6c 69 74 65 33 5f 74 65 6d      "sqlite3_tem
1c2c0 70 5f 64 69 72 65 63 74 6f 72 79 20 76 61 72 69  p_directory vari
1c2d0 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73  able should be s
1c2e0 65 74 20 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a  et for WinRT");.
1c2f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1c300 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
1c310 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
1c320 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c  function is NULL
1c330 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20 20  , generate a .  
1c340 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ** temporary fil
1c350 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a 20  e name to use . 
1c360 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38   */.  if( !zUtf8
1c370 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Name ){.    asse
1c380 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21  rt(isDelete && !
1c390 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  isOpenJournal);.
1c3a0 20 20 20 20 6d 65 6d 73 65 74 28 7a 54 6d 70 6e      memset(zTmpn
1c3b0 61 6d 65 2c 20 30 2c 20 4d 41 58 5f 50 41 54 48  ame, 0, MAX_PATH
1c3c0 2b 32 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65  +2);.    rc = ge
1c3d0 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41  tTempname(MAX_PA
1c3e0 54 48 2b 32 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b  TH+2, zTmpname);
1c3f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c400 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c410 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1c420 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d  .    zUtf8Name =
1c430 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a   zTmpname;.  }..
1c440 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
1c450 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62  lenames are doub
1c460 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  le-zero terminat
1c470 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e  ed if they are n
1c480 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20 77 69 74  ot.  ** URIs wit
1c490 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48  h parameters.  H
1c4a0 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61  ence, they can a
1c4b0 6c 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20  lways be passed 
1c4c0 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65  into.  ** sqlite
1c4d0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1c4e0 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  )..  */.  assert
1c4f0 28 20 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45  ( (eType!=SQLITE
1c500 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
1c510 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
1c520 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20  E_OPEN_URI) ||. 
1c530 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65         zUtf8Name
1c540 5b 73 74 72 6c 65 6e 28 7a 55 74 66 38 4e 61 6d  [strlen(zUtf8Nam
1c550 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f  e)+1]==0 );..  /
1c560 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69  * Convert the fi
1c570 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79  lename to the sy
1c580 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a  stem encoding. *
1c590 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  /.  zConverted =
1c5a0 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
1c5b0 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b  name(zUtf8Name);
1c5c0 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
1c5d0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
1c5e0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1c5f0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66  NOMEM;.  }..  if
1c600 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76  ( winIsDir(zConv
1c610 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73 71  erted) ){.    sq
1c620 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
1c630 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74 75  erted);.    retu
1c640 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
1c650 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20  EN_ISDIR;.  }.. 
1c660 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
1c670 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65   ){.    dwDesire
1c680 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
1c690 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43  C_READ | GENERIC
1c6a0 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  _WRITE;.  }else{
1c6b0 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63  .    dwDesiredAc
1c6c0 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52  cess = GENERIC_R
1c6d0 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  EAD;.  }..  /* S
1c6e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1c6f0 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f 20  SIVE is used to 
1c700 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  make sure that a
1c710 20 6e 65 77 20 66 69 6c 65 20 69 73 20 0a 20 20   new file is .  
1c720 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69  ** created. SQLi
1c730 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69  te doesn't use i
1c740 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65  t to indicate "e
1c750 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22  xclusive access"
1c760 20 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20   .  ** as it is 
1c770 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f  usually understo
1c780 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  od..  */.  if( i
1c790 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
1c7a0 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e    /* Creates a n
1c7b0 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66  ew file, only if
1c7c0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
1c7d0 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20  eady exist. */. 
1c7e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
1c7f0 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69  e exists, it fai
1c800 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ls. */.    dwCre
1c810 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
1c820 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20   = CREATE_NEW;. 
1c830 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 65   }else if( isCre
1c840 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  ate ){.    /* Op
1c850 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  en existing file
1c860 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 69  , or create if i
1c870 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20  t doesn't exist 
1c880 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
1c890 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
1c8a0 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65  PEN_ALWAYS;.  }e
1c8b0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  lse{.    /* Open
1c8c0 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69  s a file, only i
1c8d0 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a  f it exists. */.
1c8e0 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
1c8f0 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e  sposition = OPEN
1c900 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a  _EXISTING;.  }..
1c910 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20    dwShareMode = 
1c920 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20  FILE_SHARE_READ 
1c930 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  | FILE_SHARE_WRI
1c940 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c  TE;..  if( isDel
1c950 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ete ){.#if SQLIT
1c960 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64  E_OS_WINCE.    d
1c970 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
1c980 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
1c990 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20  BUTE_HIDDEN;.   
1c9a0 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c   isTemp = 1;.#el
1c9b0 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  se.    dwFlagsAn
1c9c0 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
1c9d0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d  LE_ATTRIBUTE_TEM
1c9e0 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20  PORARY.         
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca00 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54        | FILE_ATT
1ca10 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20  RIBUTE_HIDDEN.  
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
1ca40 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f  ILE_FLAG_DELETE_
1ca50 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66  ON_CLOSE;.#endif
1ca60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
1ca70 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
1ca80 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
1ca90 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  UTE_NORMAL;.  }.
1caa0 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f    /* Reports fro
1cab0 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61  m the internet a
1cac0 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61  re that performa
1cad0 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20  nce is always.  
1cae0 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c  ** better if FIL
1caf0 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
1cb00 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54  CESS is used.  T
1cb10 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a  icket #2699. */.
1cb20 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1cb30 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64  NCE.  dwFlagsAnd
1cb40 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49  Attributes |= FI
1cb50 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
1cb60 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20  CCESS;.#endif.. 
1cb70 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23   if( isNT() ){.#
1cb80 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1cb90 52 54 0a 20 20 20 20 43 52 45 41 54 45 46 49 4c  RT.    CREATEFIL
1cba0 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41  E2_EXTENDED_PARA
1cbb0 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65 64 50  METERS extendedP
1cbc0 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20 20 65  arameters;.    e
1cbd0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
1cbe0 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f  s.dwSize = sizeo
1cbf0 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58  f(CREATEFILE2_EX
1cc00 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52  TENDED_PARAMETER
1cc10 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  S);.    extended
1cc20 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c  Parameters.dwFil
1cc30 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a 20 20  eAttributes =.  
1cc40 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
1cc50 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26  sAndAttributes &
1cc60 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
1cc70 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64  MASK;.    extend
1cc80 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46  edParameters.dwF
1cc90 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46 6c 61  ileFlags = dwFla
1cca0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
1ccb0 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b  & FILE_FLAG_MASK
1ccc0 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
1ccd0 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63 75 72  rameters.dwSecur
1cce0 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20 53 45  ityQosFlags = SE
1ccf0 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53  CURITY_ANONYMOUS
1cd00 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
1cd10 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63 75 72  rameters.lpSecur
1cd20 69 74 79 41 74 74 72 69 62 75 74 65 73 20 3d 20  ityAttributes = 
1cd30 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64  NULL;.    extend
1cd40 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68 54 65  edParameters.hTe
1cd50 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c  mplateFile = NUL
1cd60 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68  L;.    while( (h
1cd70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32   = osCreateFile2
1cd80 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
1cd90 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdb0 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
1cdc0 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cde0 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a     dwShareMode,.
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1ce10 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
1ce20 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce40 20 20 20 26 65 78 74 65 6e 64 65 64 50 61 72 61     &extendedPara
1ce50 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49  meters))==INVALI
1ce60 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
1ce70 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce90 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
1cea0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cec0 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
1ced0 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28  #else.    while(
1cee0 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
1cef0 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  leW((LPCWSTR)zCo
1cf00 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
1cf30 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
1cf60 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
1cf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf80 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
1cf90 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
1cfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfb0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
1cfc0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
1cfd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cff0 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
1d000 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
1d030 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
1d040 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
1d050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d060 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65  Noop */.    }.#e
1d070 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20  ndif.  }.#ifdef 
1d080 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1d090 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
1d0a0 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73    while( (h = os
1d0b0 43 72 65 61 74 65 46 69 6c 65 41 28 28 4c 50 43  CreateFileA((LPC
1d0c0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
1d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1d0f0 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20  DesiredAccess,. 
1d100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d110 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 53               dwS
1d120 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a  hareMode, NULL,.
1d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1d150 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
1d160 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
1d170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d180 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
1d190 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20  ributes,.       
1d1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1b0 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49         NULL))==I
1d1c0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
1d1d0 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  LUE &&.         
1d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1f0 20 20 20 20 20 72 65 74 72 79 49 6f 65 72 72 28       retryIoerr(
1d200 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
1d210 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
1d220 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
1d230 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1d240 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b    logIoerr(cnt);
1d250 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
1d260 45 4e 20 25 64 20 25 73 20 30 78 25 6c 78 20 25  EN %d %s 0x%lx %
1d270 73 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  s\n", .         
1d280 20 20 68 2c 20 7a 4e 61 6d 65 2c 20 64 77 44 65    h, zName, dwDe
1d290 73 69 72 65 64 41 63 63 65 73 73 2c 20 0a 20 20  siredAccess, .  
1d2a0 20 20 20 20 20 20 20 20 20 68 3d 3d 49 4e 56 41           h==INVA
1d2b0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
1d2c0 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f   ? "failed" : "o
1d2d0 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d  k"));..  if( h==
1d2e0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
1d2f0 41 4c 55 45 20 29 7b 0a 20 20 20 20 70 46 69 6c  ALUE ){.    pFil
1d300 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
1d310 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
1d320 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1d330 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65  _CANTOPEN, pFile
1d340 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69  ->lastErrno, "wi
1d350 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d  nOpen", zUtf8Nam
1d360 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
1d370 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
1d380 3b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64  ;.    if( isRead
1d390 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63 6c  Write && !isExcl
1d3a0 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 72  usive ){.      r
1d3b0 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56  eturn winOpen(pV
1d3c0 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a  fs, zName, id, .
1d3d0 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
1d3e0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  |SQLITE_OPEN_REA
1d3f0 44 4f 4e 4c 59 29 20 26 0a 20 20 20 20 20 20 20  DONLY) &.       
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 28                ~(
1d410 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1d420 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  TE|SQLITE_OPEN_R
1d430 45 41 44 57 52 49 54 45 29 29 2c 0a 20 20 20 20  EADWRITE)),.    
1d440 20 20 20 20 20 70 4f 75 74 46 6c 61 67 73 29 3b       pOutFlags);
1d450 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d470 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
1d480 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1d490 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20  pOutFlags ){.   
1d4a0 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
1d4b0 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46   ){.      *pOutF
1d4c0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
1d4d0 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  EN_READWRITE;.  
1d4e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
1d4f0 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49  pOutFlags = SQLI
1d500 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1d510 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
1d520 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
1d530 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69  .  if( isReadWri
1d540 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c  te && eType==SQL
1d550 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1d560 0a 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d  .       && (rc =
1d570 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b   winceCreateLock
1d580 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29 21  (zName, pFile))!
1d590 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a  =SQLITE_OK.  ){.
1d5a0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
1d5b0 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  e(h);.    sqlite
1d5c0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
1d5d0 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  d);.    return r
1d5e0 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54  c;.  }.  if( isT
1d5f0 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  emp ){.    pFile
1d600 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
1d610 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20   = zConverted;. 
1d620 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
1d630 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1d640 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1d650 20 20 7d 0a 0a 20 20 70 46 69 6c 65 2d 3e 70 4d    }..  pFile->pM
1d660 65 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65  ethod = &winIoMe
1d670 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  thod;.  pFile->p
1d680 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46  Vfs = pVfs;.  pF
1d690 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66  ile->h = h;.  if
1d6a0 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ( sqlite3_uri_bo
1d6b0 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73  olean(zName, "ps
1d6c0 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45  ow", SQLITE_POWE
1d6d0 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
1d6e0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
1d6f0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46  trlFlags |= WINF
1d700 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20  ILE_PSOW;.  }.  
1d710 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1d720 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70   = NO_ERROR;.  p
1d730 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e  File->zPath = zN
1d740 61 6d 65 3b 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e  ame;..  OpenCoun
1d750 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72  ter(+1);.  retur
1d760 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
1d770 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20  elete the named 
1d780 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  file..**.** Note
1d790 20 74 68 61 74 20 57 69 6e 64 6f 77 73 20 64 6f   that Windows do
1d7a0 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66  es not allow a f
1d7b0 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65  ile to be delete
1d7c0 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a  d if some other.
1d7d0 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73 20 69  ** process has i
1d7e0 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d  t open.  Sometim
1d7f0 65 73 20 61 20 76 69 72 75 73 20 73 63 61 6e 6e  es a virus scann
1d800 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67 20 70  er or indexing p
1d810 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f  rogram.** will o
1d820 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  pen a journal fi
1d830 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74 65 72  le shortly after
1d840 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 69   it is created i
1d850 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a  n order to do.**
1d860 20 77 68 61 74 65 76 65 72 20 69 74 20 64 6f 65   whatever it doe
1d870 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73 20 6f  s.  While this o
1d880 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
1d890 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66  holding the.** f
1d8a0 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c  ile open, we wil
1d8b0 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 64  l be unable to d
1d8c0 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20 77 6f  elete it.  To wo
1d8d0 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a  rk around this.*
1d8e0 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65  * problem, we de
1d8f0 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73 65 63  lay 100 millisec
1d900 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74 6f 20  onds and try to 
1d910 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20 20 55  delete again.  U
1d920 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54  p.** to MX_DELET
1d930 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64 65 6c  ION_ATTEMPTs del
1d940 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 61  etion attempts a
1d950 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20 67 69  re run before gi
1d960 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72  ving.** up and r
1d970 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
1d980 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1d990 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20 73 71   winDelete(.  sq
1d9a0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
1d9b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74            /* Not
1d9c0 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a   used on win32 *
1d9d0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1d9e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  zFilename,      
1d9f0 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
1da00 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69  to delete */.  i
1da10 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20 20 20  nt syncDir      
1da20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
1da30 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
1da40 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20  */.){.  int cnt 
1da50 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
1da60 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 44   DWORD attr;.  D
1da70 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
1da80 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
1da90 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ed;.  UNUSED_PAR
1daa0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
1dab0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1dac0 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69  (syncDir);..  Si
1dad0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
1dae0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1daf0 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 7a 43 6f  R_DELETE);.  zCo
1db00 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
1db10 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  tUtf8Filename(zF
1db20 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
1db30 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
1db40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1db50 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1db60 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29    }.  if( isNT()
1db70 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66   ){.    do {.#if
1db80 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1db90 0a 20 20 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  .      WIN32_FIL
1dba0 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
1dbb0 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
1dbc0 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44    memset(&sAttrD
1dbd0 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ata, 0, sizeof(s
1dbe0 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20  AttrData));.    
1dbf0 20 20 69 66 20 28 20 6f 73 47 65 74 46 69 6c 65    if ( osGetFile
1dc00 41 74 74 72 69 62 75 74 65 73 45 78 57 28 7a 43  AttributesExW(zC
1dc10 6f 6e 76 65 72 74 65 64 2c 20 47 65 74 46 69 6c  onverted, GetFil
1dc20 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
1dc30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc50 20 20 20 26 73 41 74 74 72 44 61 74 61 29 20 29     &sAttrData) )
1dc60 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
1dc70 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
1dc80 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20  eAttributes;.   
1dc90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dca0 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
1dcb0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1dcc0 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
1dcd0 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
1dce0 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20  E_NOT_FOUND.    
1dcf0 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e       || lastErrn
1dd00 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o==ERROR_PATH_NO
1dd10 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
1dd20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1dd30 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
1dd40 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  ENT; /* Already 
1dd50 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
1dd60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1dd70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
1dd80 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
1dd90 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1dda0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
1ddb0 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
1ddc0 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 43  leAttributesW(zC
1ddd0 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
1dde0 66 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  f.      if ( att
1ddf0 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r==INVALID_FILE_
1de00 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20  ATTRIBUTES ){.  
1de10 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
1de20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
1de30 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
1de40 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
1de50 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a  _FILE_NOT_FOUND.
1de60 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74           || last
1de70 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54  Errno==ERROR_PAT
1de80 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
1de90 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1dea0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
1deb0 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65  E_NOENT; /* Alre
1dec0 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
1ded0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1dee0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1def0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
1df00 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
1df10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1df20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41  if ( attr&FILE_A
1df30 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
1df40 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  RY ){.        rc
1df50 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1df60 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20   /* Files only. 
1df70 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
1df80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1df90 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c  if ( osDeleteFil
1dfa0 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  eW(zConverted) )
1dfb0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1dfc0 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c  QLITE_OK; /* Del
1dfd0 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20  eted OK. */.    
1dfe0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1dff0 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 72   }.      if ( !r
1e000 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
1e010 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
1e020 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1e030 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20  TE_ERROR; /* No 
1e040 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f  more retries. */
1e050 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1e060 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68        }.    } wh
1e070 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64  ile(1);.  }.#ifd
1e080 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1e090 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
1e0a0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
1e0b0 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
1e0c0 41 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e  AttributesA(zCon
1e0d0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 69  verted);.      i
1e0e0 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49  f ( attr==INVALI
1e0f0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
1e100 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  S ){.        las
1e110 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
1e120 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
1e130 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
1e140 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  ==ERROR_FILE_NOT
1e150 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20  _FOUND.         
1e160 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  || lastErrno==ER
1e170 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
1e180 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ND ){.          
1e190 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
1e1a0 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20  R_DELETE_NOENT; 
1e1b0 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
1e1c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
1e1d0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
1e1e0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1e1f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e200 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1e210 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
1e220 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
1e230 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20  DIRECTORY ){.   
1e240 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e250 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73  _ERROR; /* Files
1e260 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20   only. */.      
1e270 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1e280 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65  .      if ( osDe
1e290 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65  leteFileA(zConve
1e2a0 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20  rted) ){.       
1e2b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1e2c0 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20   /* Deleted OK. 
1e2d0 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
1e2e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e2f0 69 66 20 28 20 21 72 65 74 72 79 49 6f 65 72 72  if ( !retryIoerr
1e300 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
1e310 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  o) ){.        rc
1e320 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1e330 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72   /* No more retr
1e340 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ies. */.        
1e350 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1e360 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20     } while(1);. 
1e370 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
1e380 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  rc && rc!=SQLITE
1e390 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
1e3a0 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ENT ){.    rc = 
1e3b0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1e3c0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
1e3d0 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
1e3e0 20 20 20 20 20 20 20 20 20 22 77 69 6e 44 65 6c           "winDel
1e3f0 65 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ete", zFilename)
1e400 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c  ;.  }else{.    l
1e410 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20  ogIoerr(cnt);.  
1e420 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1e430 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
1e440 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45  OSTRACE(("DELETE
1e450 20 5c 22 25 73 5c 22 20 25 73 5c 6e 22 2c 20 7a   \"%s\" %s\n", z
1e460 46 69 6c 65 6e 61 6d 65 2c 20 28 72 63 20 3f 20  Filename, (rc ? 
1e470 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 20  "failed" : "ok" 
1e480 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
1e490 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
1e4a0 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 61   the existance a
1e4b0 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61 20 66  nd status of a f
1e4c0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1e4d0 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20 20  nt winAccess(.  
1e4e0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1e4f0 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  s,         /* No
1e500 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32 20  t used on win32 
1e510 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1e520 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  *zFilename,     
1e530 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
1e540 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e  to check */.  in
1e550 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
1e560 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65           /* Type
1e570 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b 65   of test to make
1e580 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f   on this file */
1e590 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20  .  int *pResOut 
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e5b0 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f 0a   OUT: Result */.
1e5c0 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b  ){.  DWORD attr;
1e5d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
1e5e0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
1e5f0 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
1e600 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rted;.  UNUSED_P
1e610 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
1e620 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1e630 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1e640 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20  E_IOERR_ACCESS; 
1e650 29 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  );.  zConverted 
1e660 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
1e670 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
1e680 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
1e690 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
1e6a0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1e6b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
1e6c0 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
1e6d0 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
1e6e0 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52   WIN32_FILE_ATTR
1e6f0 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72  IBUTE_DATA sAttr
1e700 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Data;.    memset
1e710 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20  (&sAttrData, 0, 
1e720 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61  sizeof(sAttrData
1e730 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21  ));.    while( !
1e740 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  (rc = osGetFileA
1e750 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50  ttributesExW((LP
1e760 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
1e770 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47                 G
1e790 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e  etFileExInfoStan
1e7a0 64 61 72 64 2c 20 0a 20 20 20 20 20 20 20 20 20  dard, .         
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7c0 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29 29      &sAttrData))
1e7d0 20 26 26 20 72 65 74 72 79 49 6f 65 72 72 28 26   && retryIoerr(&
1e7e0 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
1e7f0 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20   ){}.    if( rc 
1e800 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
1e810 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  an SQLITE_ACCESS
1e820 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20 74  _EXISTS query, t
1e830 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  reat a zero-leng
1e840 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  th file.      **
1e850 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e   as if it does n
1e860 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20  ot exist..      
1e870 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20 20  */.      if(    
1e880 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
1e890 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20  CESS_EXISTS.    
1e8a0 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61        && sAttrDa
1e8b0 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68  ta.nFileSizeHigh
1e8c0 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26  ==0 .          &
1e8d0 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
1e8e0 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20  eSizeLow==0 ){. 
1e8f0 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e         attr = IN
1e900 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
1e910 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c  BUTES;.      }el
1e920 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72  se{.        attr
1e930 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46   = sAttrData.dwF
1e940 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20  ileAttributes;. 
1e950 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1e960 7b 0a 20 20 20 20 20 20 6c 6f 67 49 6f 65 72 72  {.      logIoerr
1e970 28 63 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (cnt);.      if(
1e980 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f   lastErrno!=ERRO
1e990 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
1e9a0 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45   && lastErrno!=E
1e9b0 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
1e9c0 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 77  UND ){.        w
1e9d0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1e9e0 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20  E_IOERR_ACCESS, 
1e9f0 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41  lastErrno, "winA
1ea00 63 63 65 73 73 22 2c 20 7a 46 69 6c 65 6e 61 6d  ccess", zFilenam
1ea10 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
1ea20 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
1ea30 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ted);.        re
1ea40 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1ea50 52 5f 41 43 43 45 53 53 3b 0a 20 20 20 20 20 20  R_ACCESS;.      
1ea60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
1ea70 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ttr = INVALID_FI
1ea80 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
1ea90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1eaa0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
1eab0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
1eac0 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d  else{.    attr =
1ead0 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
1eae0 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f  utesA((char*)zCo
1eaf0 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65  nverted);.  }.#e
1eb00 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66  ndif.  sqlite3_f
1eb10 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
1eb20 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61 67 73  .  switch( flags
1eb30 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
1eb40 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a  ITE_ACCESS_READ:
1eb50 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1eb60 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a  _ACCESS_EXISTS:.
1eb70 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21        rc = attr!
1eb80 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
1eb90 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20  TRIBUTES;.      
1eba0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1ebb0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
1ebc0 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72  ADWRITE:.      r
1ebd0 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49  c = attr!=INVALI
1ebe0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
1ebf0 53 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  S &&.           
1ec00 20 20 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41    (attr & FILE_A
1ec10 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c  TTRIBUTE_READONL
1ec20 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65  Y)==0;.      bre
1ec30 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
1ec40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 21 22  .      assert(!"
1ec50 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72  Invalid flags ar
1ec60 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20  gument");.  }.  
1ec70 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20  *pResOut = rc;. 
1ec80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ec90 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  K;.}.../*.** Ret
1eca0 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  urns non-zero if
1ecb0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
1ecc0 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20  ath name should 
1ecd0 62 65 20 75 73 65 64 20 76 65 72 62 61 74 69 6d  be used verbatim
1ece0 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  .  If.** non-zer
1ecf0 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 66 72  o is returned fr
1ed00 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
1ed10 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
1ed20 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70  nction must simp
1ed30 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70 72  ly.** use the pr
1ed40 6f 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d 65  ovided path name
1ed50 20 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72   verbatim -OR- r
1ed60 65 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20 61  esolve it into a
1ed70 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a   full path name.
1ed80 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65 74  ** using the Get
1ed90 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e  FullPathName Win
1eda0 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  32 API function 
1edb0 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a  (if available)..
1edc0 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
1edd0 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68  inIsVerbatimPath
1ede0 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  name(.  const ch
1edf0 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b  ar *zPathname.){
1ee00 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
1ee10 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72  e path name star
1ee20 74 73 20 77 69 74 68 20 61 20 66 6f 72 77 61 72  ts with a forwar
1ee30 64 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61 63  d slash or a bac
1ee40 6b 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65 69  kslash, it is ei
1ee50 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61  ther.  ** a lega
1ee60 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f  l UNC name, a vo
1ee70 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70 61  lume relative pa
1ee80 74 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75  th, or an absolu
1ee90 74 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e 20  te path name in 
1eea0 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20  the.  ** "Unix" 
1eeb0 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77  format on Window
1eec0 73 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  s.  There is no 
1eed0 65 61 73 79 20 77 61 79 20 74 6f 20 64 69 66 66  easy way to diff
1eee0 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65 65  erentiate betwee
1eef0 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c  n.  ** the final
1ef00 20 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65 72   two cases; ther
1ef10 65 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72 6e  efore, we return
1ef20 20 74 68 65 20 73 61 66 65 72 20 72 65 74 75 72   the safer retur
1ef30 6e 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45 0a  n value of TRUE.
1ef40 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61 6c    ** so that cal
1ef50 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e  lers of this fun
1ef60 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c  ction will simpl
1ef70 79 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  y use it verbati
1ef80 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 7a  m..  */.  if ( z
1ef90 50 61 74 68 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  Pathname[0]=='/'
1efa0 20 7c 7c 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d   || zPathname[0]
1efb0 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 72 65  =='\\' ){.    re
1efc0 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a  turn TRUE;.  }..
1efd0 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    /*.  ** If the
1efe0 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74   path name start
1eff0 73 20 77 69 74 68 20 61 20 6c 65 74 74 65 72 20  s with a letter 
1f000 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69  and a colon it i
1f010 73 20 65 69 74 68 65 72 20 61 20 76 6f 6c 75 6d  s either a volum
1f020 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20  e.  ** relative 
1f030 70 61 74 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c  path or an absol
1f040 75 74 65 20 70 61 74 68 2e 20 20 43 61 6c 6c 65  ute path.  Calle
1f050 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  rs of this funct
1f060 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a  ion must not.  *
1f070 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 74 72 65  * attempt to tre
1f080 61 74 20 69 74 20 61 73 20 61 20 72 65 6c 61 74  at it as a relat
1f090 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 28 69  ive path name (i
1f0a0 2e 65 2e 20 74 68 65 79 20 73 68 6f 75 6c 64 20  .e. they should 
1f0b0 73 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20  simply use.  ** 
1f0c0 69 74 20 76 65 72 62 61 74 69 6d 29 2e 0a 20 20  it verbatim)..  
1f0d0 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65  */.  if ( sqlite
1f0e0 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68 6e 61  3Isalpha(zPathna
1f0f0 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74 68 6e  me[0]) && zPathn
1f100 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 7b 0a 20  ame[1]==':' ){. 
1f110 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a     return TRUE;.
1f120 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
1f130 66 20 77 65 20 67 65 74 20 74 6f 20 74 68 69 73  f we get to this
1f140 20 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74 68   point, the path
1f150 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d   name should alm
1f160 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62 65  ost certainly be
1f170 20 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72   a purely.  ** r
1f180 65 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e 65  elative one (i.e
1f190 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65  . not a UNC name
1f1a0 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20  , not absolute, 
1f1b0 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72  and not volume r
1f1c0 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20  elative)..  */. 
1f1d0 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d   return FALSE;.}
1f1e0 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
1f1f0 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
1f200 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
1f210 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68  hname.  Write th
1f220 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61  e full.** pathna
1f230 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20  me into zOut[]. 
1f240 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20   zOut[] will be 
1f250 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d  at least pVfs->m
1f260 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74  xPathname.** byt
1f270 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
1f280 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c  tatic int winFul
1f290 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c  lPathname(.  sql
1f2a0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
1f2b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1f2c0 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a  inter to vfs obj
1f2d0 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
1f2e0 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20  har *zRelative, 
1f2f0 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62         /* Possib
1f300 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75  ly relative inpu
1f310 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20  t path */.  int 
1f320 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nFull,          
1f330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1f340 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66  e of output buff
1f350 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
1f360 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20   char *zFull    
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f380 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20  * Output buffer 
1f390 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66 20 64 65 66  */.){.  .#if def
1f3a0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
1f3b0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1f3c0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1f3d0 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 55 4e 55  E_ERROR );.  UNU
1f3e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46  SED_PARAMETER(nF
1f3f0 75 6c 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ull);.  assert( 
1f400 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1f410 3e 3d 4d 41 58 5f 50 41 54 48 20 29 3b 0a 20 20  >=MAX_PATH );.  
1f420 61 73 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70  assert( nFull>=p
1f430 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
1f440 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65  );.  if ( sqlite
1f450 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
1f460 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74   && !winIsVerbat
1f470 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61  imPathname(zRela
1f480 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a  tive) ){.    /*.
1f490 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20      ** NOTE: We 
1f4a0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
1f4b0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
1f4c0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
1f4d0 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ta.    **       
1f4e0 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
1f4f0 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f  en set.  Therefo
1f500 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68  re, use it as th
1f510 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20  e basis.    **  
1f520 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74       for convert
1f530 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65  ing the relative
1f540 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e   path name to an
1f550 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a   absolute.    **
1f560 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72         one by pr
1f570 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74  epending the dat
1f580 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  a directory and 
1f590 61 20 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a  a slash..    */.
1f5a0 20 20 20 20 63 68 61 72 20 7a 4f 75 74 5b 4d 41      char zOut[MA
1f5b0 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 20 20 6d  X_PATH+1];.    m
1f5c0 65 6d 73 65 74 28 7a 4f 75 74 2c 20 30 2c 20 4d  emset(zOut, 0, M
1f5d0 41 58 5f 50 41 54 48 2b 31 29 3b 0a 20 20 20 20  AX_PATH+1);.    
1f5e0 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68  cygwin_conv_path
1f5f0 28 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49  (CCP_POSIX_TO_WI
1f600 4e 5f 41 7c 43 43 50 5f 52 45 4c 41 54 49 56 45  N_A|CCP_RELATIVE
1f610 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75  , zRelative, zOu
1f620 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1f630 20 20 20 20 20 20 20 20 4d 41 58 5f 50 41 54 48          MAX_PATH
1f640 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  +1);.    sqlite3
1f650 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46  _snprintf(MIN(nF
1f660 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ull, pVfs->mxPat
1f670 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22  hname), zFull, "
1f680 25 73 5c 5c 25 73 22 2c 0a 20 20 20 20 20 20 20  %s\\%s",.       
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1f6a0 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
1f6b0 74 6f 72 79 2c 20 7a 4f 75 74 29 3b 0a 20 20 7d  tory, zOut);.  }
1f6c0 65 6c 73 65 7b 0a 20 20 20 20 63 79 67 77 69 6e  else{.    cygwin
1f6d0 5f 63 6f 6e 76 5f 70 61 74 68 28 43 43 50 5f 50  _conv_path(CCP_P
1f6e0 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a  OSIX_TO_WIN_A, z
1f6f0 52 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c 2c  Relative, zFull,
1f700 20 6e 46 75 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72   nFull);.  }.  r
1f710 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f720 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51  .#endif..#if (SQ
1f730 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
1f740 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1f750 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  ) && !defined(__
1f760 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75  CYGWIN__).  Simu
1f770 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
1f780 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1f790 20 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68   );.  /* WinCE h
1f7a0 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66  as no concept of
1f7b0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
1f7c0 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d  name, or so I am
1f7d0 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57   told. */.  /* W
1f7e0 69 6e 52 54 20 68 61 73 20 6e 6f 20 77 61 79 20  inRT has no way 
1f7f0 74 6f 20 63 6f 6e 76 65 72 74 20 61 20 72 65 6c  to convert a rel
1f800 61 74 69 76 65 20 70 61 74 68 20 74 6f 20 61 6e  ative path to an
1f810 20 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a   absolute one. *
1f820 2f 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  /.  if ( sqlite3
1f830 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
1f840 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69  && !winIsVerbati
1f850 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74  mPathname(zRelat
1f860 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  ive) ){.    /*. 
1f870 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61     ** NOTE: We a
1f880 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
1f890 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
1f8a0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
1f8b0 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64  a.    **       d
1f8c0 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
1f8d0 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72  n set.  Therefor
1f8e0 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65  e, use it as the
1f8f0 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20   basis.    **   
1f900 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69      for converti
1f910 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ng the relative 
1f920 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20  path name to an 
1f930 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20  absolute.    ** 
1f940 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65        one by pre
1f950 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61  pending the data
1f960 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61   directory and a
1f970 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20   backslash..    
1f980 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
1f990 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
1f9a0 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
1f9b0 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
1f9c0 5c 5c 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  \\%s",.         
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1f9e0 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
1f9f0 72 79 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  ry, zRelative);.
1fa00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1fa10 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
1fa20 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
1fa30 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
1fa40 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69  l, "%s", zRelati
1fa50 76 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ve);.  }.  retur
1fa60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
1fa70 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
1fa80 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
1fa90 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
1faa0 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57   !defined(__CYGW
1fab0 49 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42  IN__).  DWORD nB
1fac0 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  yte;.  void *zCo
1fad0 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20  nverted;.  char 
1fae0 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20  *zOut;..  /* If 
1faf0 74 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62  this path name b
1fb00 65 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22  egins with "/X:"
1fb10 2c 20 77 68 65 72 65 20 22 58 22 20 69 73 20 61  , where "X" is a
1fb20 6e 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20  ny alphabetic.  
1fb30 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64 69  ** character, di
1fb40 73 63 61 72 64 20 74 68 65 20 69 6e 69 74 69 61  scard the initia
1fb50 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70  l "/" from the p
1fb60 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  athname..  */.  
1fb70 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d  if( zRelative[0]
1fb80 3d 3d 27 2f 27 20 26 26 20 73 71 6c 69 74 65 33  =='/' && sqlite3
1fb90 49 73 61 6c 70 68 61 28 7a 52 65 6c 61 74 69 76  Isalpha(zRelativ
1fba0 65 5b 31 5d 29 20 26 26 20 7a 52 65 6c 61 74 69  e[1]) && zRelati
1fbb0 76 65 5b 32 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20  ve[2]==':' ){.  
1fbc0 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20    zRelative++;. 
1fbd0 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64   }..  /* It's od
1fbe0 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
1fbf0 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
1fc00 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
1fc10 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
1fc20 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
1fc30 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
1fc40 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
1fc50 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
1fc60 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
1fc70 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e 63  iling. This func
1fc80 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c 20  tion could fail 
1fc90 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  if, for example,
1fca0 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
1fcb0 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
1fcc0 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e 6c  ory has been unl
1fcd0 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53 69  inked..  */.  Si
1fce0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1fcf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
1fd00 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c  OR );.  if ( sql
1fd10 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
1fd20 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72  ory && !winIsVer
1fd30 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52  batimPathname(zR
1fd40 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20  elative) ){.    
1fd50 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
1fd60 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  We are dealing w
1fd70 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70  ith a relative p
1fd80 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ath name and the
1fd90 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20   data.    **    
1fda0 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73     directory has
1fdb0 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72   been set.  Ther
1fdc0 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73  efore, use it as
1fdd0 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a   the basis.    *
1fde0 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76  *       for conv
1fdf0 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74  erting the relat
1fe00 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f  ive path name to
1fe10 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20   an absolute.   
1fe20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79   **       one by
1fe30 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20   prepending the 
1fe40 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61  data directory a
1fe50 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a  nd a backslash..
1fe60 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1fe70 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
1fe80 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
1fe90 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
1fea0 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20 20 20   "%s\\%s",.     
1feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fec0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
1fed0 65 63 74 6f 72 79 2c 20 7a 52 65 6c 61 74 69 76  ectory, zRelativ
1fee0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
1fef0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1ff00 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
1ff10 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
1ff20 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69  (zRelative);.  i
1ff30 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
1ff40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1ff50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1ff60 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e  M;.  }.  if( isN
1ff70 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57 53 54  T() ){.    LPWST
1ff80 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79  R zTemp;.    nBy
1ff90 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
1ffa0 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52  thNameW((LPCWSTR
1ffb0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20  )zConverted, 0, 
1ffc0 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  0, 0);.    if( n
1ffd0 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
1ffe0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1fff0 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65 74  ITE_ERROR, osGet
20000 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
20010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
20020 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
20030 31 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b  1", zConverted);
20040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
20050 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
20060 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
20070 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
20080 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20  LLPATH;.    }.  
20090 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20    nByte += 3;.  
200a0 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65    zTemp = sqlite
200b0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
200c0 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b  te*sizeof(zTemp[
200d0 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  0]) );.    if( z
200e0 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Temp==0 ){.     
200f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
20100 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
20110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
20120 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
20130 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  }.    nByte = os
20140 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
20150 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
20160 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65  rted, nByte, zTe
20170 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mp, 0);.    if( 
20180 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
20190 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
201a0 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65  LITE_ERROR, osGe
201b0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
201c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201d0 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
201e0 57 32 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29  W2", zConverted)
201f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
20200 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
20210 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
20220 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  free(zTemp);.   
20230 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20240 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
20250 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  TH;.    }.    sq
20260 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
20270 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74  erted);.    zOut
20280 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38   = unicodeToUtf8
20290 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c  (zTemp);.    sql
202a0 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
202b0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
202c0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
202d0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63  SI.  else{.    c
202e0 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20  har *zTemp;.    
202f0 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
20300 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
20310 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  *)zConverted, 0,
20320 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
20330 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
20340 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
20350 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65  LITE_ERROR, osGe
20360 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
20370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20380 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
20390 41 31 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29  A1", zConverted)
203a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
203b0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
203c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
203d0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
203e0 55 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20  ULLPATH;.    }. 
203f0 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20     nByte += 3;. 
20400 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74     zTemp = sqlit
20410 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
20420 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70  yte*sizeof(zTemp
20430 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20  [0]) );.    if( 
20440 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20  zTemp==0 ){.    
20450 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
20460 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
20470 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20480 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
20490 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f   }.    nByte = o
204a0 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
204b0 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
204c0 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d  ted, nByte, zTem
204d0 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  p, 0);.    if( n
204e0 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Byte==0 ){.     
204f0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
20500 49 54 45 5f 45 52 52 4f 52 2c 20 6f 73 47 65 74  ITE_ERROR, osGet
20510 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
20520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
20530 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
20540 32 22 2c 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b  2", zConverted);
20550 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
20560 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
20570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
20580 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  ree(zTemp);.    
20590 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
205a0 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
205b0 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  H;.    }.    sql
205c0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
205d0 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
205e0 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
205f0 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65  mbcs_to_utf8(zTe
20600 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mp);.    sqlite3
20610 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
20620 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a  }.#endif.  if( z
20630 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
20640 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
20650 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
20660 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
20670 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20   "%s", zOut);.  
20680 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
20690 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
206a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
206b0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
206c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
206d0 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  EM;.  }.#endif.}
206e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
206f0 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
20700 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
20710 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
20720 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
20730 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
20740 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
20750 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
20760 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
20770 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
20780 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  brary..*/./*.** 
20790 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
207a0 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
207b0 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
207c0 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
207d0 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
207e0 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
207f0 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
20800 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73  ed library..*/.s
20810 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44  tatic void *winD
20820 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
20830 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63  s *pVfs, const c
20840 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
20850 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 76  .  HANDLE h;.  v
20860 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
20870 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c  = convertUtf8Fil
20880 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
20890 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
208a0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69 66  ETER(pVfs);.  if
208b0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
208c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
208d0 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
208e0 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
208f0 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68 20 3d  OS_WINRT.    h =
20900 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c   osLoadPackagedL
20910 69 62 72 61 72 79 28 28 4c 50 43 57 53 54 52 29  ibrary((LPCWSTR)
20920 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b 0a  zConverted, 0);.
20930 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f 73  #else.    h = os
20940 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c 50  LoadLibraryW((LP
20950 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
20960 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69  );.#endif.  }.#i
20970 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
20980 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
20990 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61  e{.    h = osLoa
209a0 64 4c 69 62 72 61 72 79 41 28 28 63 68 61 72 2a  dLibraryA((char*
209b0 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  )zConverted);.  
209c0 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
209d0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
209e0 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  ed);.  return (v
209f0 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74 69 63  oid*)h;.}.static
20a00 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72 6f 72   void winDlError
20a10 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
20a20 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
20a30 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20  ar *zBufOut){.  
20a40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
20a50 28 70 56 66 73 29 3b 0a 20 20 67 65 74 4c 61 73  (pVfs);.  getLas
20a60 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c  tErrorMsg(osGetL
20a70 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66  astError(), nBuf
20a80 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74  , zBufOut);.}.st
20a90 61 74 69 63 20 76 6f 69 64 20 28 2a 77 69 6e 44  atic void (*winD
20aa0 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
20ab0 20 2a 70 56 66 73 2c 76 6f 69 64 20 2a 70 48 2c   *pVfs,void *pH,
20ac0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d  const char *zSym
20ad0 29 29 28 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53  ))(void){.  UNUS
20ae0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
20af0 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  s);.  return (vo
20b00 69 64 28 2a 29 28 76 6f 69 64 29 29 6f 73 47 65  id(*)(void))osGe
20b10 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 28 48  tProcAddressA((H
20b20 41 4e 44 4c 45 29 70 48 2c 20 7a 53 79 6d 29 3b  ANDLE)pH, zSym);
20b30 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
20b40 69 6e 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65  inDlClose(sqlite
20b50 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69  3_vfs *pVfs, voi
20b60 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55  d *pHandle){.  U
20b70 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
20b80 70 56 66 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c  pVfs);.  osFreeL
20b90 69 62 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70  ibrary((HANDLE)p
20ba0 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65  Handle);.}.#else
20bb0 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d   /* if SQLITE_OM
20bc0 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
20bd0 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f  N is defined: */
20be0 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
20bf0 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e  Open  0.  #defin
20c00 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20  e winDlError 0. 
20c10 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79   #define winDlSy
20c20 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
20c30 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e  winDlClose 0.#en
20c40 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  dif.../*.** Writ
20c50 65 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74  e up to nBuf byt
20c60 65 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73  es of randomness
20c70 20 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73   into zBuf..*/.s
20c80 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e  tatic int winRan
20c90 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f  domness(sqlite3_
20ca0 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
20cb0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
20cc0 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  {.  int n = 0;. 
20cd0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
20ce0 52 28 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66  R(pVfs);.#if def
20cf0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
20d00 29 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20 20  ).  n = nBuf;.  
20d10 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
20d20 6e 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69  nBuf);.#else.  i
20d30 66 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d  f( sizeof(SYSTEM
20d40 54 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b  TIME)<=nBuf-n ){
20d50 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20  .    SYSTEMTIME 
20d60 78 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74  x;.    osGetSyst
20d70 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20  emTime(&x);.    
20d80 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
20d90 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b   &x, sizeof(x));
20da0 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66  .    n += sizeof
20db0 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  (x);.  }.  if( s
20dc0 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42  izeof(DWORD)<=nB
20dd0 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52  uf-n ){.    DWOR
20de0 44 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72  D pid = osGetCur
20df0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b  rentProcessId();
20e00 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
20e10 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65  f[n], &pid, size
20e20 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e 20  of(pid));.    n 
20e30 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b 0a  += sizeof(pid);.
20e40 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f    }.#if SQLITE_O
20e50 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73 69  S_WINRT.  if( si
20e60 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c  zeof(ULONGLONG)<
20e70 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 55  =nBuf-n ){.    U
20e80 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f  LONGLONG cnt = o
20e90 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 28  sGetTickCount64(
20ea0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
20eb0 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69  Buf[n], &cnt, si
20ec0 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20  zeof(cnt));.    
20ed0 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29  n += sizeof(cnt)
20ee0 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66  ;.  }.#else.  if
20ef0 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c  ( sizeof(DWORD)<
20f00 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44  =nBuf-n ){.    D
20f10 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47 65 74  WORD cnt = osGet
20f20 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20  TickCount();.   
20f30 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
20f40 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63  , &cnt, sizeof(c
20f50 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  nt));.    n += s
20f60 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a  izeof(cnt);.  }.
20f70 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 69 7a  #endif.  if( siz
20f80 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45  eof(LARGE_INTEGE
20f90 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20  R)<=nBuf-n ){.  
20fa0 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20    LARGE_INTEGER 
20fb0 69 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65  i;.    osQueryPe
20fc0 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
20fd0 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  (&i);.    memcpy
20fe0 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20 73  (&zBuf[n], &i, s
20ff0 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20 6e  izeof(i));.    n
21000 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a 20   += sizeof(i);. 
21010 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
21020 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn n;.}.../*.** 
21030 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
21040 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
21050 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
21060 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73  time slept..*/.s
21070 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65  tatic int winSle
21080 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ep(sqlite3_vfs *
21090 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73  pVfs, int micros
210a0 65 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77  ec){.  sqlite3_w
210b0 69 6e 33 32 5f 73 6c 65 65 70 28 28 6d 69 63 72  in32_sleep((micr
210c0 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b  osec+999)/1000);
210d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
210e0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
210f0 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39  urn ((microsec+9
21100 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a  99)/1000)*1000;.
21110 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
21120 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c  lowing variable,
21130 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e   if set to a non
21140 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20  -zero value, is 
21150 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a  interpreted as.*
21160 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
21170 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
21180 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74  70 and is used t
21190 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  o set the result
211a0 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73   of.** sqlite3Os
211b0 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75  CurrentTime() du
211c0 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f  ring testing..*/
211d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
211e0 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
211f0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
21200 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65  ;  /* Fake syste
21210 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64  m time in second
21220 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f  s since 1970. */
21230 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
21240 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
21250 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
21260 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
21270 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74  ime).  Write int
21280 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20  o *piNow.** the 
21290 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
212a0 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
212b0 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d  n Day number tim
212c0 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20  es 86_400_000.  
212d0 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64  In.** other word
212e0 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70  s, write into *p
212f0 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20  iNow the number 
21300 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
21310 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e  since the Julian
21320 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f  .** epoch of noo
21330 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f  n in Greenwich o
21340 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34  n November 24, 4
21350 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e  714 B.C accordin
21360 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c  g to the.** prol
21370 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20  eptic Gregorian 
21380 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20  calendar..**.** 
21390 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75  On success, retu
213a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52  rn SQLITE_OK.  R
213b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
213c0 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20 61  OR if the time a
213d0 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e 6e  nd date .** cann
213e0 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
213f0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75  static int winCu
21400 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73  rrentTimeInt64(s
21410 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
21420 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
21430 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49  *piNow){.  /* FI
21440 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 72 65  LETIME structure
21450 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c   is a 64-bit val
21460 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ue representing 
21470 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20  the number of . 
21480 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f      100-nanoseco
21490 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e  nd intervals sin
214a0 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36  ce January 1, 16
214b0 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33  01 (= JD 2305813
214c0 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 46 49 4c  .5). .  */.  FIL
214d0 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61 74  ETIME ft;.  stat
214e0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
214f0 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74 69  _int64 winFileti
21500 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38 31  meEpoch = 230581
21510 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  35*(sqlite3_int6
21520 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64 65  4)8640000;.#ifde
21530 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
21540 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
21550 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45  ite3_int64 unixE
21560 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a  poch = 24405875*
21570 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
21580 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20  640000;.#endif. 
21590 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61 76   /* 2^32 - to av
215a0 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e  oid use of LL an
215b0 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67 63  d warnings in gc
215c0 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  c */.  static co
215d0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
215e0 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65 20  4 max32BitValue 
215f0 3d 20 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65  = .      (sqlite
21600 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30  3_int64)20000000
21610 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e  00 + (sqlite3_in
21620 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b  t64)2000000000 +
21630 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  .      (sqlite3_
21640 69 6e 74 36 34 29 32 39 34 39 36 37 32 39 36 3b  int64)294967296;
21650 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
21660 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49  WINCE.  SYSTEMTI
21670 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74  ME time;.  osGet
21680 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65  SystemTime(&time
21690 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65  );.  /* if Syste
216a0 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28  mTimeToFileTime(
216b0 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75  ) fails, it retu
216c0 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69  rns zero. */.  i
216d0 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69 6d 65  f (!osSystemTime
216e0 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65  ToFileTime(&time
216f0 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75  ,&ft)){.    retu
21700 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
21710 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47  .  }.#else.  osG
21720 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
21730 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23  leTime( &ft );.#
21740 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20  endif..  *piNow 
21750 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f  = winFiletimeEpo
21760 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  ch +.           
21770 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74   ((((sqlite3_int
21780 36 34 29 66 74 2e 64 77 48 69 67 68 44 61 74 65  64)ft.dwHighDate
21790 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61  Time)*max32BitVa
217a0 6c 75 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20  lue) + .        
217b0 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
217c0 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61  int64)ft.dwLowDa
217d0 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33  teTime)/(sqlite3
217e0 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23  _int64)10000;..#
217f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
21800 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
21810 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
21820 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30      *piNow = 100
21830 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
21840 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  )sqlite3_current
21850 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63  _time + unixEpoc
21860 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  h;.  }.#endif.  
21870 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
21880 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
21890 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
218a0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
218b0 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
218c0 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
218d0 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
218e0 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
218f0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
21900 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
21910 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
21920 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
21930 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
21940 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
21950 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
21960 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
21970 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
21980 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
21990 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  fs, double *prNo
219a0 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  w){.  int rc;.  
219b0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b  sqlite3_int64 i;
219c0 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65  .  rc = winCurre
219d0 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73  ntTimeInt64(pVfs
219e0 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63  , &i);.  if( !rc
219f0 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
21a00 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20   i/86400000.0;. 
21a10 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
21a20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65  }../*.** The ide
21a30 61 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  a is that this f
21a40 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69  unction works li
21a50 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ke a combination
21a60 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72   of.** GetLastEr
21a70 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74  ror() and Format
21a80 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e  Message() on Win
21a90 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61  dows (or errno a
21aa0 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  nd.** strerror_r
21ab0 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74  () on Unix). Aft
21ac0 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  er an error is r
21ad0 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53  eturned by an OS
21ae0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51  .** function, SQ
21af0 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20  Lite calls this 
21b00 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42  function with zB
21b10 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a  uf pointing to.*
21b20 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42  * a buffer of nB
21b30 75 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53  uf bytes. The OS
21b40 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f   layer should po
21b50 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75  pulate the.** bu
21b60 66 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d  ffer with a nul-
21b70 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38  terminated UTF-8
21b80 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d   encoded error m
21b90 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69  essage.** descri
21ba0 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f  bing the last IO
21bb0 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f   error to have o
21bc0 63 63 75 72 72 65 64 20 77 69 74 68 69 6e 20 74  ccurred within t
21bd0 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  he calling.** th
21be0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  read..**.** If t
21bf0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
21c00 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f   is too large fo
21c10 72 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  r the supplied b
21c20 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f  uffer,.** it sho
21c30 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65 64  uld be truncated
21c40 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  . The return val
21c50 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72  ue of xGetLastEr
21c60 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69  ror.** is zero i
21c70 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
21c80 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65 20  age fits in the 
21c90 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a  buffer, or non-z
21ca0 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65  ero.** otherwise
21cb0 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67 65   (if the message
21cc0 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e   was truncated).
21cd0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20   If non-zero is 
21ce0 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65  returned,.** the
21cf0 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  n it is not nece
21d00 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65  ssary to include
21d10 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61   the nul-termina
21d20 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  tor character.**
21d30 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62   in the output b
21d40 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  uffer..**.** Not
21d50 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72   supplying an er
21d60 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c  ror message will
21d70 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65   have no adverse
21d80 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51   effect.** on SQ
21d90 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65  Lite. It is fine
21da0 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c   to have an impl
21db0 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20  ementation that 
21dc0 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73  never.** returns
21dd0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
21de0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78  e:.**.**   int x
21df0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c  GetLastError(sql
21e00 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
21e10 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
21e20 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73  zBuf){.**     as
21e30 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c  sert(zBuf[0]=='\
21e40 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75  0');.**     retu
21e50 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  rn 0;.**   }.**.
21e60 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e  ** However if an
21e70 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
21e80 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77  s supplied, it w
21e90 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61  ill be incorpora
21ea0 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65  ted.** by sqlite
21eb0 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20   into the error 
21ec0 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c  message availabl
21ed0 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 75 73  e to the user us
21ee0 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65  ing.** sqlite3_e
21ef0 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c  rrmsg(), possibl
21f00 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f  y making IO erro
21f10 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65 62  rs easier to deb
21f20 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ug..*/.static in
21f30 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f  t winGetLastErro
21f40 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
21f50 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
21f60 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e  har *zBuf){.  UN
21f70 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
21f80 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  Vfs);.  return g
21f90 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f  etLastErrorMsg(o
21fa0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
21fb0 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a   nBuf, zBuf);.}.
21fc0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
21fd0 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69  e and deinitiali
21fe0 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67  ze the operating
21ff0 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63   system interfac
22000 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
22010 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b  3_os_init(void){
22020 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
22030 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b  3_vfs winVfs = {
22040 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20  .    3,         
22050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
22060 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a  rsion */.    siz
22070 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20  eof(winFile),   
22080 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f    /* szOsFile */
22090 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 20 20  .    MAX_PATH,  
220a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 78 50            /* mxP
220b0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
220c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
220d0 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
220e0 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20      "win32",    
220f0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d           /* zNam
22100 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
22110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22120 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
22130 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
22140 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
22150 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c  /.    winDelete,
22160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
22170 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e  elete */.    win
22180 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
22190 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
221a0 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
221b0 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c  ame,     /* xFul
221c0 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
221d0 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
221e0 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
221f0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72   */.    winDlErr
22200 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
22210 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
22220 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
22230 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
22240 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65  /.    winDlClose
22250 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
22260 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
22270 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
22280 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
22290 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65  s */.    winSlee
222a0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
222b0 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
222c0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  inCurrentTime,  
222d0 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
222e0 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
222f0 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
22300 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
22310 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
22320 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20  ntTimeInt64, /* 
22330 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
22340 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53  4 */.    winSetS
22350 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
22360 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
22370 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73  */.    winGetSys
22380 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
22390 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  GetSystemCall */
223a0 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74  .    winNextSyst
223b0 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65  emCall,   /* xNe
223c0 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  xtSystemCall */.
223d0 20 20 7d 3b 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c    };..  /* Doubl
223e0 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  e-check that the
223f0 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61   aSyscall[] arra
22400 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74  y has been const
22410 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72  ructed.  ** corr
22420 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b  ectly.  See tick
22430 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63 38  et [bb3a86e890c8
22440 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65  e96ab] */.  asse
22450 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61 53  rt( ArraySize(aS
22460 79 73 63 61 6c 6c 29 3d 3d 37 34 20 29 3b 0a 0a  yscall)==74 );..
22470 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22480 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 20 67 65 74  MIT_WAL.  /* get
22490 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f   memory map allo
224a0 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69  cation granulari
224b0 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ty */.  memset(&
224c0 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73  winSysInfo, 0, s
224d0 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46  izeof(SYSTEM_INF
224e0 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  O));.#if SQLITE_
224f0 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65 74  OS_WINRT.  osGet
22500 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
22510 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23  (&winSysInfo);.#
22520 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74  else.  osGetSyst
22530 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e  emInfo(&winSysIn
22540 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  fo);.#endif.  as
22550 73 65 72 74 28 77 69 6e 53 79 73 49 6e 66 6f 2e  sert(winSysInfo.
22560 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
22570 75 6c 61 72 69 74 79 20 3e 20 30 29 3b 0a 23 65  ularity > 0);.#e
22580 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f  ndif..  sqlite3_
22590 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69  vfs_register(&wi
225a0 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72 65 74 75  nVfs, 1);.  retu
225b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
225c0 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  ..int sqlite3_os
225d0 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69 66  _end(void){ .#if
225e0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
225f0 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 21  .  if( sleepObj!
22600 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43  =NULL ){.    osC
22610 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70  loseHandle(sleep
22620 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f  Obj);.    sleepO
22630 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23  bj = NULL;.  }.#
22640 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
22650 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
22660 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
22670 5f 57 49 4e 20 2a 2f 0a                          _WIN */.