/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact c96990935e7fd799b43a7f0ee74798f45f06e21a:


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 73 74 65 6d 20 63   of the system c
25a0: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
25b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75  _syscall_ptr pCu
25c0: 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e  rrent; /* Curren
25d0: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  t value of the s
25e0: 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20  ystem call */.  
25f0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2600: 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a  ptr pDefault; /*
2610: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   Default value *
2620: 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d  /.} aSyscall[] =
2630: 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f   {.#if !SQLITE_O
2640: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
2650: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
2660: 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  "AreFileApisANSI
2670: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
2680: 41 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73 41  ALL)AreFileApisA
2690: 4e 53 49 2c 20 20 20 20 20 20 20 20 20 30 20 7d  NSI,         0 }
26a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72 65  ,.#else.  { "Are
26b0: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
26c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
26d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
26e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
26f0: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73  ndif..#ifndef os
2700: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 0a  AreFileApisANSI.
2710: 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c  #define osAreFil
2720: 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c  eApisANSI ((BOOL
2730: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
2740: 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72  aSyscall[0].pCur
2750: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
2760: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
2770: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
2780: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
2790: 44 45 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77  DE).  { "CharLow
27a0: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
27b0: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72     (SYSCALL)Char
27c0: 4c 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20 20  LowerW,         
27d0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
27e0: 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22    { "CharLowerW"
27f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
2800: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
2830: 65 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65  efine osCharLowe
2840: 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41  rW ((LPWSTR(WINA
2850: 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79  PI*)(LPWSTR))aSy
2860: 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e  scall[1].pCurren
2870: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
2880: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
2890: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
28a0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
28b0: 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20  harUpperW",     
28c0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
28d0: 4c 29 43 68 61 72 55 70 70 65 72 57 2c 20 20 20  L)CharUpperW,   
28e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
28f0: 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 55  #else.  { "CharU
2900: 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  pperW",         
2910: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (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 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
2940: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68  if..#define osCh
2950: 61 72 55 70 70 65 72 57 20 28 28 4c 50 57 53 54  arUpperW ((LPWST
2960: 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54  R(WINAPI*)(LPWST
2970: 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70  R))aSyscall[2].p
2980: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43  Current)..  { "C
2990: 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20 20 20  loseHandle",    
29a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
29b0: 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20  L)CloseHandle,  
29c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
29d0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65  .#define osClose
29e0: 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49  Handle ((BOOL(WI
29f0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
2a00: 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72  Syscall[3].pCurr
2a10: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
2a20: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
2a30: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43 72  AS_ANSI).  { "Cr
2a40: 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  eateFileA",     
2a50: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
2a60: 29 43 72 65 61 74 65 46 69 6c 65 41 2c 20 20 20  )CreateFileA,   
2a70: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
2a80: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
2a90: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
2aa0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 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 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
2ad0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
2ae0: 61 74 65 46 69 6c 65 41 20 28 28 48 41 4e 44 4c  ateFileA ((HANDL
2af0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  E(WINAPI*)(LPCST
2b00: 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  R,DWORD,DWORD, \
2b10: 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52  .        LPSECUR
2b20: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44  ITY_ATTRIBUTES,D
2b30: 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c  WORD,DWORD,HANDL
2b40: 45 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70  E))aSyscall[4].p
2b50: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
2b60: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
2b70: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
2b80: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
2b90: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
2ba0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
2bb0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
2bc0: 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20  ileW,           
2bd0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
2be0: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
2c00: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
2c20: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
2c30: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57  ne osCreateFileW
2c40: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
2c50: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
2c60: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
2c70: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
2c80: 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57  RIBUTES,DWORD,DW
2c90: 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73  ORD,HANDLE))aSys
2ca0: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
2cb0: 29 0a 0a 23 69 66 20 28 21 53 51 4c 49 54 45 5f  )..#if (!SQLITE_
2cc0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
2cd0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2ce0: 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a  _HAS_ANSI) && \.
2cf0: 20 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64          !defined
2d00: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
2d10: 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  )).  { "CreateFi
2d20: 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20  leMappingA",    
2d30: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
2d40: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20 20  eFileMappingA,  
2d50: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
2d60: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
2d70: 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53  ppingA",      (S
2d80: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
2db0: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
2dc0: 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41 4e 44  eMappingA ((HAND
2dd0: 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  LE(WINAPI*)(HAND
2de0: 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54  LE,LPSECURITY_AT
2df0: 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20  TRIBUTES, \.    
2e00: 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c      DWORD,DWORD,
2e10: 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29 61 53  DWORD,LPCSTR))aS
2e20: 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65  yscall[6].pCurre
2e30: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
2e40: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51  OS_WINCE || (!SQ
2e50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
2e60: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2e70: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20  WIN32_HAS_WIDE) 
2e80: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65  && \.        !de
2e90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2ea0: 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65  T_WAL)).  { "Cre
2eb0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22  ateFileMappingW"
2ec0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
2ed0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
2ee0: 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gW,      0 },.#e
2ef0: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
2f00: 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20  ileMappingW",   
2f10: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 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 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2f40: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
2f50: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28  teFileMappingW (
2f60: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
2f70: 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49  (HANDLE,LPSECURI
2f80: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
2f90: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44  .        DWORD,D
2fa0: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53  WORD,DWORD,LPCWS
2fb0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e  TR))aSyscall[7].
2fc0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
2fd0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
2fe0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
2ff0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
3000: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74  ).  { "CreateMut
3010: 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  exW",           
3020: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
3030: 4d 75 74 65 78 57 2c 20 20 20 20 20 20 20 20 20  MutexW,         
3040: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3050: 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57 22  { "CreateMutexW"
3060: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
3070: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3090: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
30a0: 69 6e 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65  ine osCreateMute
30b0: 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  xW ((HANDLE(WINA
30c0: 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f  PI*)(LPSECURITY_
30d0: 41 54 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c  ATTRIBUTES,BOOL,
30e0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53   \.        LPCWS
30f0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e  TR))aSyscall[8].
3100: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3110: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3120: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
3130: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c  { "DeleteFileA",
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3150: 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65  SCALL)DeleteFile
3160: 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  A,             0
3170: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44   },.#else.  { "D
3180: 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20  eleteFileA",    
3190: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
31a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
31b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
31c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
31d0: 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28  osDeleteFileA ((
31e0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
31f0: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 39  CSTR))aSyscall[9
3200: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3210: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3220: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
3230: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57    { "DeleteFileW
3240: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3250: 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69  SYSCALL)DeleteFi
3260: 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  leW,            
3270: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3280: 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20  "DeleteFileW",  
3290: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
32a0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
32c0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
32d0: 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20  e osDeleteFileW 
32e0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
32f0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
3300: 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[10].pCurrent).
3310: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
3320: 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69  INCE.  { "FileTi
3330: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
3340: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 6c  e", (SYSCALL)Fil
3350: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
3360: 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  Time, 0 },.#else
3370: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
3380: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20  LocalFileTime", 
3390: 28 53 59 53 43 41 4c 4c 29 30 2c 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 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
33c0: 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d  define osFileTim
33d0: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
33e0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
33f0: 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a  (CONST FILETIME*
3400: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  , \.        LPFI
3410: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
3420: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
3430: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
3440: 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  NCE.  { "FileTim
3450: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  eToSystemTime", 
3460: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65     (SYSCALL)File
3470: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
3480: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
3490: 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53    { "FileTimeToS
34a0: 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28  ystemTime",    (
34b0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
34e0: 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65  efine osFileTime
34f0: 54 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42  ToSystemTime ((B
3500: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e  OOL(WINAPI*)(CON
3510: 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a  ST FILETIME*, \.
3520: 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d          LPSYSTEM
3530: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  TIME))aSyscall[1
3540: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
3550: 7b 20 22 46 6c 75 73 68 46 69 6c 65 42 75 66 66  { "FlushFileBuff
3560: 65 72 73 22 2c 20 20 20 20 20 20 20 20 28 53 59  ers",        (SY
3570: 53 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42  SCALL)FlushFileB
3580: 75 66 66 65 72 73 2c 20 20 20 20 20 20 20 20 30  uffers,        0
3590: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46   },..#define osF
35a0: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 20  lushFileBuffers 
35b0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
35c0: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
35d0: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
35e0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
35f0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
3600: 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  I).  { "FormatMe
3610: 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20  ssageA",        
3620: 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61    (SYSCALL)Forma
3630: 74 4d 65 73 73 61 67 65 41 2c 20 20 20 20 20 20  tMessageA,      
3640: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3650: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
3660: 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eA",          (S
3670: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3690: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
36a0: 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73  fine osFormatMes
36b0: 73 61 67 65 41 20 28 28 44 57 4f 52 44 28 57 49  sageA ((DWORD(WI
36c0: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43  NAPI*)(DWORD,LPC
36d0: 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  VOID,DWORD,DWORD
36e0: 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  ,LPSTR, \.      
36f0: 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a    DWORD,va_list*
3700: 29 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70  ))aSyscall[14].p
3710: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3720: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3730: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3740: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57   "FormatMessageW
3750: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
3760: 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61  CALL)FormatMessa
3770: 67 65 57 2c 20 20 20 20 20 20 20 20 20 20 30 20  geW,          0 
3780: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f  },.#else.  { "Fo
3790: 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20  rmatMessageW",  
37a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
37b0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
37c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
37d0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
37e0: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 20  sFormatMessageW 
37f0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
3800: 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44  (DWORD,LPCVOID,D
3810: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54  WORD,DWORD,LPWST
3820: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
3830: 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79  RD,va_list*))aSy
3840: 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65  scall[15].pCurre
3850: 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  nt)..#if !define
3860: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
3870: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
3880: 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c  { "FreeLibrary",
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
38a0: 53 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72  SCALL)FreeLibrar
38b0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  y,             0
38c0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
38d0: 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20  reeLibrary",    
38e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
38f0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3900: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3910: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
3920: 6f 73 46 72 65 65 4c 69 62 72 61 72 79 20 28 28  osFreeLibrary ((
3930: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d  BOOL(WINAPI*)(HM
3940: 4f 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ODULE))aSyscall[
3950: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
3960: 20 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50 72   { "GetCurrentPr
3970: 6f 63 65 73 73 49 64 22 2c 20 20 20 20 20 28 53  ocessId",     (S
3980: 59 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e  YSCALL)GetCurren
3990: 74 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20  tProcessId,     
39a0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
39b0: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
39c0: 73 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e 41  sId ((DWORD(WINA
39d0: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
39e0: 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74  all[17].pCurrent
39f0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
3a00: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
3a10: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3a20: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47  HAS_ANSI).  { "G
3a30: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
3a40: 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ",       (SYSCAL
3a50: 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61  L)GetDiskFreeSpa
3a60: 63 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  ceA,       0 },.
3a70: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69  #else.  { "GetDi
3a80: 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 20  skFreeSpaceA",  
3a90: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (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 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3ac0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
3ad0: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 20  tDiskFreeSpaceA 
3ae0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
3af0: 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c  LPCSTR,LPDWORD,L
3b00: 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  PDWORD,LPDWORD, 
3b10: 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52  \.        LPDWOR
3b20: 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e  D))aSyscall[18].
3b30: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3b40: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
3b50: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
3b60: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
3b70: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3b80: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44 69  WIDE).  { "GetDi
3b90: 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20  skFreeSpaceW",  
3ba0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
3bb0: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 2c  tDiskFreeSpaceW,
3bc0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
3bd0: 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72  e.  { "GetDiskFr
3be0: 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20 20  eeSpaceW",      
3bf0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 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 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3c20: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73  #define osGetDis
3c30: 6b 46 72 65 65 53 70 61 63 65 57 20 28 28 42 4f  kFreeSpaceW ((BO
3c40: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  OL(WINAPI*)(LPCW
3c50: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
3c60: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
3c70: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
3c80: 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75  aSyscall[19].pCu
3c90: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3ca0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3cb0: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
3cc0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
3cd0: 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sA",      (SYSCA
3ce0: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
3cf0: 75 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d 2c  utesA,      0 },
3d00: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
3d10: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22 2c  ileAttributesA",
3d20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3d30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3d40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3d50: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
3d60: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3d70: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
3d80: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
3d90: 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74  all[20].pCurrent
3da0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
3db0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
3dc0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3dd0: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
3de0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3df0: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
3e00: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
3e10: 74 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tesW,      0 },.
3e20: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
3e30: 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c 20  leAttributesW", 
3e40: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (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 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3e70: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
3e80: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
3e90: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
3ea0: 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63  )(LPCWSTR))aSysc
3eb0: 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74  all[21].pCurrent
3ec0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
3ed0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
3ee0: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69  WIDE).  { "GetFi
3ef0: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22  leAttributesExW"
3f00: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65  ,    (SYSCALL)Ge
3f10: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
3f20: 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  xW,    0 },.#els
3f30: 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74  e.  { "GetFileAt
3f40: 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 20  tributesExW",   
3f50: 20 28 53 59 53 43 41 4c 4c 29 30 2c 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 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3f80: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c  #define osGetFil
3f90: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 20 28  eAttributesExW (
3fa0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
3fb0: 50 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45  PCWSTR,GET_FILEE
3fc0: 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c  X_INFO_LEVELS, \
3fd0: 0a 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29  .        LPVOID)
3fe0: 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43  )aSyscall[22].pC
3ff0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4000: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
4010: 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c  { "GetFileSize",
4020: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4030: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a  SCALL)GetFileSiz
4040: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
4050: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4060: 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20  etFileSize",    
4070: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4080: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4090: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
40a0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
40b0: 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28 28  osGetFileSize ((
40c0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48  DWORD(WINAPI*)(H
40d0: 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61  ANDLE,LPDWORD))a
40e0: 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72  Syscall[23].pCur
40f0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4100: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
4110: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4120: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
4130: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
4140: 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59  meA",        (SY
4150: 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74  SCALL)GetFullPat
4160: 68 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20 30  hNameA,        0
4170: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4180: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22  etFullPathNameA"
4190: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
41a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
41b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
41c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
41d0: 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
41e0: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
41f0: 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44  I*)(LPCSTR,DWORD
4200: 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  ,LPSTR, \.      
4210: 20 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63 61    LPSTR*))aSysca
4220: 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[24].pCurrent)
4230: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
4240: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
4250: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
4260: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4270: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
4280: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
4290: 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eW",        (SYS
42a0: 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68  CALL)GetFullPath
42b0: 4e 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20  NameW,        0 
42c0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
42d0: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c  tFullPathNameW",
42e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
42f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4300: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4310: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4320: 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
4330: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
4340: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
4350: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
4360: 20 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73     LPWSTR*))aSys
4370: 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e  call[25].pCurren
4380: 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74  t)..  { "GetLast
4390: 45 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20  Error",         
43a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c     (SYSCALL)GetL
43b0: 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20  astError,       
43c0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
43d0: 6e 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  ne osGetLastErro
43e0: 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  r ((DWORD(WINAPI
43f0: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
4400: 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[26].pCurrent).
4410: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
4420: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
4430: 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51  XTENSION).#if SQ
4440: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
4450: 2f 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41 64  /* The GetProcAd
4460: 64 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65  dressA() routine
4470: 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
4480: 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45  le on Windows CE
4490: 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f  . */.  { "GetPro
44a0: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
44b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
44c0: 50 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20  ProcAddressA,   
44d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
44e0: 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20  .  /* All other 
44f0: 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d  Windows platform
4500: 73 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63  s expect GetProc
4510: 41 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b  Address() to tak
4520: 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73  e.  ** an ANSI s
4530: 74 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73  tring regardless
4540: 20 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45   of the _UNICODE
4550: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20   setting */.  { 
4560: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  "GetProcAddressA
4570: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
4580: 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65  ALL)GetProcAddre
4590: 73 73 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  ss,          0 }
45a0: 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20  ,.#endif.#else. 
45b0: 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65   { "GetProcAddre
45c0: 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53  ssA",         (S
45d0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45f0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4600: 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64  fine osGetProcAd
4610: 64 72 65 73 73 41 20 28 28 46 41 52 50 52 4f 43  dressA ((FARPROC
4620: 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c  (WINAPI*)(HMODUL
4630: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  E, \.        LPC
4640: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 37  STR))aSyscall[27
4650: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4660: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
4670: 54 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  T.  { "GetSystem
4680: 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20  Info",          
4690: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73   (SYSCALL)GetSys
46a0: 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  temInfo,        
46b0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
46c0: 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f  { "GetSystemInfo
46d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
46e0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4700: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4710: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49  ine osGetSystemI
4720: 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50  nfo ((VOID(WINAP
4730: 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46  I*)(LPSYSTEM_INF
4740: 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e  O))aSyscall[28].
4750: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
4760: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20  GetSystemTime", 
4770: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4780: 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65  LL)GetSystemTime
4790: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
47a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
47b0: 79 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44  ystemTime ((VOID
47c0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54  (WINAPI*)(LPSYST
47d0: 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  EMTIME))aSyscall
47e0: 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [29].pCurrent)..
47f0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
4800: 49 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73  INCE.  { "GetSys
4810: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
4820: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74  e", (SYSCALL)Get
4830: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
4840: 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65  Time, 0 },.#else
4850: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
4860: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20  imeAsFileTime", 
4870: 28 53 59 53 43 41 4c 4c 29 30 2c 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 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
48a0: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
48b0: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
48c0: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
48d0: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  ( \.        LPFI
48e0: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
48f0: 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [30].pCurrent)..
4900: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4910: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
4920: 49 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  I).  { "GetTempP
4930: 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20  athA",          
4940: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65    (SYSCALL)GetTe
4950: 6d 70 50 61 74 68 41 2c 20 20 20 20 20 20 20 20  mpPathA,        
4960: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4970: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41   { "GetTempPathA
4980: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4990: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
49c0: 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61  fine osGetTempPa
49d0: 74 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  thA ((DWORD(WINA
49e0: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52  PI*)(DWORD,LPSTR
49f0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70  ))aSyscall[31].p
4a00: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4a10: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
4a20: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
4a30: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
4a40: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
4a50: 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hW",            
4a60: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
4a70: 50 61 74 68 57 2c 20 20 20 20 20 20 20 20 20 20  PathW,          
4a80: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4a90: 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c   "GetTempPathW",
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4ab0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4ad0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4ae0: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
4af0: 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  W ((DWORD(WINAPI
4b00: 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29  *)(DWORD,LPWSTR)
4b10: 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43  )aSyscall[32].pC
4b20: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4b30: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
4b40: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22  { "GetTickCount"
4b50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
4b60: 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75  SCALL)GetTickCou
4b70: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  nt,            0
4b80: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
4b90: 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20  etTickCount",   
4ba0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4bb0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4bc0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4bd0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4be0: 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28  osGetTickCount (
4bf0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
4c00: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33  VOID))aSyscall[3
4c10: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
4c20: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4c30: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
4c40: 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e  .  { "GetVersion
4c50: 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ExA",           
4c60: 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73  (SYSCALL)GetVers
4c70: 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20  ionExA,         
4c80: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4c90: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22   "GetVersionExA"
4ca0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
4cb0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4cd0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4ce0: 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45  ne osGetVersionE
4cf0: 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xA ((BOOL(WINAPI
4d00: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
4d10: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29  OSVERSIONINFOA))
4d20: 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75  aSyscall[34].pCu
4d30: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
4d40: 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20  pAlloc",        
4d50: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4d60: 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20  HeapAlloc,      
4d70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
4d80: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c  define osHeapAll
4d90: 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  oc ((LPVOID(WINA
4da0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
4db0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
4dc0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 35  E_T))aSyscall[35
4dd0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4de0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
4df0: 54 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74  T.  { "HeapCreat
4e00: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
4e10: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72   (SYSCALL)HeapCr
4e20: 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  eate,           
4e30: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4e40: 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20  { "HeapCreate", 
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4e60: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4e80: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4e90: 69 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65  ine osHeapCreate
4ea0: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
4eb0: 2a 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c  *)(DWORD,SIZE_T,
4ec0: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
4ed0: 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e  T))aSyscall[36].
4ee0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4ef0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
4f00: 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79    { "HeapDestroy
4f10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4f20: 53 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74  SYSCALL)HeapDest
4f30: 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  roy,            
4f40: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4f50: 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20  "HeapDestroy",  
4f60: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4f70: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4f90: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4fa0: 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20  e osHeapDestroy 
4fb0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4fc0: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
4fd0: 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [37].pCurrent)..
4fe0: 20 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20    { "HeapFree", 
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5000: 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65  SYSCALL)HeapFree
5010: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5020: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
5030: 73 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c  sHeapFree ((BOOL
5040: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5050: 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61  ,DWORD,LPVOID))a
5060: 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72  Syscall[38].pCur
5070: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
5080: 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20  ReAlloc",       
5090: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
50a0: 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20  eapReAlloc,     
50b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
50c0: 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c  efine osHeapReAl
50d0: 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  loc ((LPVOID(WIN
50e0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
50f0: 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20  RD,LPVOID, \.   
5100: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
5110: 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65  scall[39].pCurre
5120: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69  nt)..  { "HeapSi
5130: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
5140: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
5150: 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  pSize,          
5160: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
5170: 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28  ine osHeapSize (
5180: 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29  (SIZE_T(WINAPI*)
5190: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
51a0: 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44  .        LPCVOID
51b0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70  ))aSyscall[40].p
51c0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
51d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
51e0: 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65   { "HeapValidate
51f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5200: 59 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64  YSCALL)HeapValid
5210: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
5220: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5230: 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20  HeapValidate",  
5240: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5250: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5260: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5270: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5280: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20   osHeapValidate 
5290: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
52a0: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
52b0: 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29          LPCVOID)
52c0: 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43  )aSyscall[41].pC
52d0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
52e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
52f0: 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21  2_HAS_ANSI) && !
5300: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
5310: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
5320: 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  ON).  { "LoadLib
5330: 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20  raryA",         
5340: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64     (SYSCALL)Load
5350: 4c 69 62 72 61 72 79 41 2c 20 20 20 20 20 20 20  LibraryA,       
5360: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5370: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
5380: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
5390: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
53c0: 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72  efine osLoadLibr
53d0: 61 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57  aryA ((HMODULE(W
53e0: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29  INAPI*)(LPCSTR))
53f0: 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75  aSyscall[42].pCu
5400: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5410: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
5420: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
5430: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26  IN32_HAS_WIDE) &
5440: 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66  & \.        !def
5450: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
5460: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
5470: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
5480: 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yW",            
5490: 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62  (SYSCALL)LoadLib
54a0: 72 61 72 79 57 2c 20 20 20 20 20 20 20 20 20 20  raryW,          
54b0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
54c0: 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c   "LoadLibraryW",
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
54e0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5500: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5510: 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79  ne osLoadLibrary
5520: 57 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  W ((HMODULE(WINA
5530: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
5540: 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72  yscall[43].pCurr
5550: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5560: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
5570: 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20  LocalFree",     
5580: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5590: 4c 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20  LL)LocalFree,   
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
55b0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61  .#else.  { "Loca
55c0: 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  lFree",         
55d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
55e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
55f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5600: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
5610: 6f 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41  ocalFree ((HLOCA
5620: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41  L(WINAPI*)(HLOCA
5630: 4c 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e  L))aSyscall[44].
5640: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5650: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
5660: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
5670: 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  NRT.  { "LockFil
5680: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5690: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b     (SYSCALL)Lock
56a0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
56b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
56c0: 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20    { "LockFile", 
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
56e0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69   0 },.#endif..#i
5710: 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65  fndef osLockFile
5720: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46  .#define osLockF
5730: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
5740: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
5750: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
5760: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
5770: 53 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72  Syscall[45].pCur
5780: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
5790: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
57a0: 43 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  CE.  { "LockFile
57b0: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
57c0: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46    (SYSCALL)LockF
57d0: 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20  ileEx,          
57e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
57f0: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c   { "LockFileEx",
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
5810: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5830: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0 },.#endif..#if
5840: 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  ndef osLockFileE
5850: 78 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b  x.#define osLock
5860: 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49  FileEx ((BOOL(WI
5870: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
5880: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
5890: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
58a0: 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61   LPOVERLAPPED))a
58b0: 53 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72  Syscall[46].pCur
58c0: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
58d0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
58e0: 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53  E || (!SQLITE_OS
58f0: 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
5900: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
5910: 41 4c 29 29 0a 20 20 7b 20 22 4d 61 70 56 69 65  AL)).  { "MapVie
5920: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
5930: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70      (SYSCALL)Map
5940: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20  ViewOfFile,     
5950: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5960: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46  .  { "MapViewOfF
5970: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
5980: 28 53 59 53 43 41 4c 4c 29 30 2c 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 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
59b0: 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77  define osMapView
59c0: 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28  OfFile ((LPVOID(
59d0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
59e0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
59f0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
5a00: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 37  E_T))aSyscall[47
5a10: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5a20: 20 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64   "MultiByteToWid
5a30: 65 43 68 61 72 22 2c 20 20 20 20 20 28 53 59 53  eChar",     (SYS
5a40: 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f  CALL)MultiByteTo
5a50: 57 69 64 65 43 68 61 72 2c 20 20 20 20 20 30 20  WideChar,     0 
5a60: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75  },..#define osMu
5a70: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
5a80: 72 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  r ((int(WINAPI*)
5a90: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53  (UINT,DWORD,LPCS
5aa0: 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c  TR,int,LPWSTR, \
5ab0: 0a 20 20 20 20 20 20 20 20 69 6e 74 29 29 61 53  .        int))aS
5ac0: 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72  yscall[48].pCurr
5ad0: 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79  ent)..  { "Query
5ae0: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
5af0: 65 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75  er", (SYSCALL)Qu
5b00: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
5b10: 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65  unter, 0 },..#de
5b20: 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66  fine osQueryPerf
5b30: 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28  ormanceCounter (
5b40: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20  (BOOL(WINAPI*)( 
5b50: 5c 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f  \.        LARGE_
5b60: 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63 61  INTEGER*))aSysca
5b70: 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[49].pCurrent)
5b80: 0a 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22  ..  { "ReadFile"
5b90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5ba0: 20 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69   (SYSCALL)ReadFi
5bb0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
5bc0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5bd0: 20 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f   osReadFile ((BO
5be0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
5bf0: 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c  LE,LPVOID,DWORD,
5c00: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
5c10: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
5c20: 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43  )aSyscall[50].pC
5c30: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65  urrent)..  { "Se
5c40: 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20  tEndOfFile",    
5c50: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5c60: 29 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20  )SetEndOfFile,  
5c70: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
5c80: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64  #define osSetEnd
5c90: 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  OfFile ((BOOL(WI
5ca0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
5cb0: 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72  Syscall[51].pCur
5cc0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5cd0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
5ce0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22  "SetFilePointer"
5cf0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
5d00: 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74  ALL)SetFilePoint
5d10: 65 72 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  er,          0 }
5d20: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74  ,.#else.  { "Set
5d30: 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20  FilePointer",   
5d40: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5d50: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5d60: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5d70: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5d80: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 20 28  SetFilePointer (
5d90: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5da0: 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e  HANDLE,LONG,PLON
5db0: 47 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  G, \.        DWO
5dc0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d  RD))aSyscall[52]
5dd0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5de0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5df0: 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20  .  { "Sleep",   
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e10: 28 53 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20  (SYSCALL)Sleep, 
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e30: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5e40: 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20   "Sleep",       
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5e60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5e80: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5e90: 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f 49  ne osSleep ((VOI
5ea0: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
5eb0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70  ))aSyscall[53].p
5ec0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53  Current)..  { "S
5ed0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
5ee0: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
5ef0: 4c 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  L)SystemTimeToFi
5f00: 6c 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a  leTime,    0 },.
5f10: 0a 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74 65  .#define osSyste
5f20: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20  mTimeToFileTime 
5f30: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
5f40: 43 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d 45  CONST SYSTEMTIME
5f50: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  *, \.        LPF
5f60: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
5f70: 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[54].pCurrent).
5f80: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5f90: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
5fa0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55  _OS_WINRT.  { "U
5fb0: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  nlockFile",     
5fc0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5fd0: 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20  L)UnlockFile,   
5fe0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5ff0: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63  #else.  { "Unloc
6000: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
6010: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (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 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6040: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e  if..#ifndef osUn
6050: 6c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65  lockFile.#define
6060: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28   osUnlockFile ((
6070: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6080: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
6090: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
60a0: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
60b0: 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[55].pCurrent).
60c0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c  #endif..#if !SQL
60d0: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
60e0: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c   "UnlockFileEx",
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6100: 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45  CALL)UnlockFileE
6110: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  x,            0 
6120: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e  },.#else.  { "Un
6130: 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  lockFileEx",    
6140: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6150: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6160: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6170: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6180: 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28  sUnlockFileEx ((
6190: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
61a0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
61b0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
61c0: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
61d0: 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75  aSyscall[56].pCu
61e0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
61f0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21  TE_OS_WINCE || !
6200: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6210: 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 55 6e  MIT_WAL).  { "Un
6220: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  mapViewOfFile", 
6230: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6240: 29 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  )UnmapViewOfFile
6250: 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  ,         0 },.#
6260: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56  else.  { "UnmapV
6270: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  iewOfFile",     
6280: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 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 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
62b0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d  f..#define osUnm
62c0: 61 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42  apViewOfFile ((B
62d0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
62e0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  VOID))aSyscall[5
62f0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
6300: 7b 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c  { "WideCharToMul
6310: 74 69 42 79 74 65 22 2c 20 20 20 20 20 28 53 59  tiByte",     (SY
6320: 53 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f  SCALL)WideCharTo
6330: 4d 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30  MultiByte,     0
6340: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57   },..#define osW
6350: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
6360: 74 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a  te ((int(WINAPI*
6370: 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43  )(UINT,DWORD,LPC
6380: 57 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69  WSTR,int,LPSTR,i
6390: 6e 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  nt, \.        LP
63a0: 43 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79  CSTR,LPBOOL))aSy
63b0: 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65  scall[58].pCurre
63c0: 6e 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46  nt)..  { "WriteF
63d0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
63e0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69      (SYSCALL)Wri
63f0: 74 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  teFile,         
6400: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
6410: 69 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20  ine osWriteFile 
6420: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6430: 48 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44  HANDLE,LPCVOID,D
6440: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
6450: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
6460: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  PPED))aSyscall[5
6470: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
6480: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
6490: 54 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65  T.  { "CreateEve
64a0: 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20  ntExW",         
64b0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
64c0: 45 76 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20  EventExW,       
64d0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
64e0: 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78  { "CreateEventEx
64f0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  W",          (SY
6500: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6520: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6530: 69 6e 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e  ine osCreateEven
6540: 74 45 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49  tExW ((HANDLE(WI
6550: 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54  NAPI*)(LPSECURIT
6560: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43  Y_ATTRIBUTES,LPC
6570: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
6580: 44 57 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79  DWORD,DWORD))aSy
6590: 73 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65  scall[60].pCurre
65a0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
65b0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57  _OS_WINRT.  { "W
65c0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
65d0: 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ct",     (SYSCAL
65e0: 4c 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  L)WaitForSingleO
65f0: 62 6a 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a  bject,     0 },.
6600: 23 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46  #else.  { "WaitF
6610: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c  orSingleObject",
6620: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (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 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6650: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61  if..#define osWa
6660: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
6670: 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  t ((DWORD(WINAPI
6680: 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20  *)(HANDLE, \.   
6690: 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73       DWORD))aSys
66a0: 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e  call[61].pCurren
66b0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
66c0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69  S_WINRT.  { "Wai
66d0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
66e0: 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29  Ex",   (SYSCALL)
66f0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
6700: 65 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65  ectEx,   0 },.#e
6710: 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  lse.  { "WaitFor
6720: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c  SingleObjectEx",
6730: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 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 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6760: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74  ..#define osWait
6770: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
6780: 78 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  x ((DWORD(WINAPI
6790: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
67a0: 20 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29   \.        BOOL)
67b0: 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43  )aSyscall[62].pC
67c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
67d0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
67e0: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
67f0: 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  Ex",        (SYS
6800: 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e  CALL)SetFilePoin
6810: 74 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20  terEx,        0 
6820: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65  },.#else.  { "Se
6830: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c  tFilePointerEx",
6840: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6850: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6860: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6870: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6880: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  sSetFilePointerE
6890: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
68a0: 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49  )(HANDLE,LARGE_I
68b0: 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20  NTEGER, \.      
68c0: 20 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52    PLARGE_INTEGER
68d0: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
68e0: 5b 36 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [63].pCurrent)..
68f0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
6900: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
6910: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
6920: 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c  dleEx", (SYSCALL
6930: 29 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  )GetFileInformat
6940: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30  ionByHandleEx, 0
6950: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
6960: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
6970: 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53  nByHandleEx", (S
6980: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6990: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
69a0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
69b0: 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  osGetFileInforma
69c0: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28  tionByHandleEx (
69d0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
69e0: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
69f0: 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41   FILE_INFO_BY_HA
6a00: 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49  NDLE_CLASS,LPVOI
6a10: 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  D,DWORD))aSyscal
6a20: 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[64].pCurrent).
6a30: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
6a40: 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64  INRT && !defined
6a50: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
6a60: 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  ).  { "MapViewOf
6a70: 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20  FileFromApp",   
6a80: 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65   (SYSCALL)MapVie
6a90: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 2c 20  wOfFileFromApp, 
6aa0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6ab0: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
6ac0: 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59  FromApp",    (SY
6ad0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6af0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6b00: 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  ine osMapViewOfF
6b10: 69 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c 50 56  ileFromApp ((LPV
6b20: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
6b30: 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36  DLE,ULONG,ULONG6
6b40: 34 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  4, \.        SIZ
6b50: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 36 35  E_T))aSyscall[65
6b60: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6b70: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
6b80: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
6b90: 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
6ba0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
6bb0: 69 6c 65 32 2c 20 20 20 20 20 20 20 20 20 20 20  ile2,           
6bc0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6bd0: 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20   "CreateFile2", 
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6bf0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6c10: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6c20: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32  ne osCreateFile2
6c30: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
6c40: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
6c50: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6c60: 20 20 20 20 20 20 20 20 4c 50 43 52 45 41 54 45          LPCREATE
6c70: 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
6c80: 41 52 41 4d 45 54 45 52 53 29 29 61 53 79 73 63  ARAMETERS))aSysc
6c90: 61 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74  all[66].pCurrent
6ca0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
6cb0: 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
6cc0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
6cd0: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
6ce0: 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64   { "LoadPackaged
6cf0: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53  Library",     (S
6d00: 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61  YSCALL)LoadPacka
6d10: 67 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20 20  gedLibrary,     
6d20: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6d30: 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
6d40: 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41  ary",     (SYSCA
6d50: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6d70: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6d80: 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c   osLoadPackagedL
6d90: 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c 45  ibrary ((HMODULE
6da0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
6db0: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  R, \.        DWO
6dc0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d  RD))aSyscall[67]
6dd0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6de0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6df0: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
6e00: 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28  t64",          (
6e10: 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43  SYSCALL)GetTickC
6e20: 6f 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20 20  ount64,         
6e30: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6e40: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22  "GetTickCount64"
6e50: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
6e60: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6e80: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6e90: 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  e osGetTickCount
6ea0: 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57  64 ((ULONGLONG(W
6eb0: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
6ec0: 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72  yscall[68].pCurr
6ed0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
6ee0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47  _OS_WINRT.  { "G
6ef0: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
6f00: 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  fo",     (SYSCAL
6f10: 4c 29 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  L)GetNativeSyste
6f20: 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a  mInfo,     0 },.
6f30: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e 61  #else.  { "GetNa
6f40: 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c  tiveSystemInfo",
6f50: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (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 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6f80: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
6f90: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
6fa0: 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  o ((VOID(WINAPI*
6fb0: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  )( \.        LPS
6fc0: 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73  YSTEM_INFO))aSys
6fd0: 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e  call[69].pCurren
6fe0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
6ff0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
7000: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74 70  _ANSI).  { "Outp
7010: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c  utDebugStringA",
7020: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f        (SYSCALL)O
7030: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
7040: 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  A,      0 },.#el
7050: 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  se.  { "OutputDe
7060: 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20  bugStringA",    
7070: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 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 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
70a0: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75  .#define osOutpu
70b0: 74 44 65 62 75 67 53 74 72 69 6e 67 41 20 28 28  tDebugStringA ((
70c0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50  VOID(WINAPI*)(LP
70d0: 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37  CSTR))aSyscall[7
70e0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
70f0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
7100: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
7110: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75  .  { "OutputDebu
7120: 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20  gStringW",      
7130: 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44  (SYSCALL)OutputD
7140: 65 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20 20  ebugStringW,    
7150: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7160: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
7170: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
7180: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
71a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
71b0: 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67  ne osOutputDebug
71c0: 53 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28 57  StringW ((VOID(W
71d0: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
71e0: 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43  )aSyscall[71].pC
71f0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
7200: 74 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20 20  tProcessHeap",  
7210: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7220: 29 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 2c  )GetProcessHeap,
7230: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
7240: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f  #define osGetPro
7250: 63 65 73 73 48 65 61 70 20 28 28 48 41 4e 44 4c  cessHeap ((HANDL
7260: 45 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  E(WINAPI*)(VOID)
7270: 29 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43  )aSyscall[72].pC
7280: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
7290: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
72a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
72b0: 4f 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43  OMIT_WAL).  { "C
72c0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
72d0: 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41  FromApp", (SYSCA
72e0: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
72f0: 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d  pingFromApp, 0 }
7300: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
7310: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
7320: 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c  omApp", (SYSCALL
7330: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7340: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7350: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
7360: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
7370: 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c  gFromApp ((HANDL
7380: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  E(WINAPI*)(HANDL
7390: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  E, \.        LPS
73a0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
73b0: 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34  ES,ULONG,ULONG64
73c0: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
73d0: 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[73].pCurrent)
73e0: 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74  ..}; /* End of t
73f0: 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  he overrideable 
7400: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a  system calls */.
7410: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  ./*.** This is t
7420: 68 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  he xSetSystemCal
7430: 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71  l() method of sq
7440: 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c  lite3_vfs for al
7450: 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e  l of the.** "win
7460: 33 32 22 20 56 46 53 65 73 2e 20 20 52 65 74 75  32" VFSes.  Retu
7470: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f  rn SQLITE_OK opo
7480: 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75  n successfully u
7490: 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73  pdating the.** s
74a0: 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74  ystem call point
74b0: 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  er, or SQLITE_NO
74c0: 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20  TFOUND if there 
74d0: 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62  is no configurab
74e0: 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  le.** system cal
74f0: 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a  l named zName..*
7500: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
7510: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  SetSystemCall(. 
7520: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
7530: 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f  otUsed,        /
7540: 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65  * The VFS pointe
7550: 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a  r.  Not used */.
7560: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
7570: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
7580: 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65  /* Name of syste
7590: 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69  m call to overri
75a0: 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
75b0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77  syscall_ptr pNew
75c0: 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72  Func  /* Pointer
75d0: 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63   to new system c
75e0: 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a  all value */.){.
75f0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
7600: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
7610: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20  ITE_NOTFOUND;.. 
7620: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
7630: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69  R(pNotUsed);.  i
7640: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
7650: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d     /* If no zNam
7660: 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74  e is given, rest
7670: 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63  ore all system c
7680: 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65  alls to their de
7690: 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74  fault.    ** set
76a0: 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e  tings and return
76b0: 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20   NULL.    */.   
76c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
76d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
76e0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
76f0: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
7700: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
7710: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
7720: 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20  ].pDefault ){.  
7730: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
7740: 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79  ].pCurrent = aSy
7750: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
7760: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
7770: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
7780: 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65   If zName is spe
7790: 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20  cified, operate 
77a0: 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20  on only the one 
77b0: 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20  system call.    
77c0: 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20  ** specified..  
77d0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
77e0: 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63  ; i<sizeof(aSysc
77f0: 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73  all)/sizeof(aSys
7800: 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  call[0]); i++){.
7810: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
7820: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
7830: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  [i].zName)==0 ){
7840: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79  .        if( aSy
7850: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
7860: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
7870: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44    aSyscall[i].pD
7880: 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c  efault = aSyscal
7890: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20  l[i].pCurrent;. 
78a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
78b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
78c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
78d0: 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46  wFunc==0 ) pNewF
78e0: 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  unc = aSyscall[i
78f0: 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20  ].pDefault;.    
7900: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
7910: 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46  pCurrent = pNewF
7920: 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65  unc;.        bre
7930: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
7940: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
7950: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
7960: 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
7970: 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20  a system call.  
7980: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a  Return NULL if z
7990: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  Name is not a.**
79a0: 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74   recognized syst
79b0: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e  em call name.  N
79c0: 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75  ULL is also retu
79d0: 72 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74  rned if the syst
79e0: 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75  em call.** is cu
79f0: 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65  rrently undefine
7a00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  d..*/.static sql
7a10: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
7a20: 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c   winGetSystemCal
7a30: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
7a40: 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f   *pNotUsed,.  co
7a50: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a  nst char *zName.
7a60: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
7a70: 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  t i;..  UNUSED_P
7a80: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
7a90: 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  d);.  for(i=0; i
7aa0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
7ab0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
7ac0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
7ad0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
7ae0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
7af0: 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
7b00: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  n aSyscall[i].pC
7b10: 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65  urrent;.  }.  re
7b20: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
7b30: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
7b40: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
7b50: 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20  stem call after 
7b60: 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65  zName.  If zName
7b70: 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72  ==NULL.** then r
7b80: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
7b90: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
7ba0: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e  em call.  Return
7bb0: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a   NULL if zName.*
7bc0: 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79  * is the last sy
7bd0: 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20  stem call or if 
7be0: 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65  zName is not the
7bf0: 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64   name of a valid
7c00: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  .** system call.
7c10: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
7c20: 20 63 68 61 72 20 2a 77 69 6e 4e 65 78 74 53 79   char *winNextSy
7c30: 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33  stemCall(sqlite3
7c40: 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63  _vfs *p, const c
7c50: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
7c60: 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e  nt i = -1;..  UN
7c70: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
7c80: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
7c90: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
7ca0: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
7cb0: 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  all)-1; i++){.  
7cc0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
7cd0: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
7ce0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
7cf0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
7d00: 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61   for(i++; i<Arra
7d10: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b  ySize(aSyscall);
7d20: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
7d30: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
7d40: 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ent!=0 ) return 
7d50: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
7d60: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
7d70: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
7d80: 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74   function output
7d90: 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
7da0: 28 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74 6f  (ANSI) string to
7db0: 20 74 68 65 20 57 69 6e 33 32 20 64 65 62 75 67   the Win32 debug
7dc0: 67 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c  ger.** (if avail
7dd0: 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20  able)..*/..void 
7de0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72  sqlite3_win32_wr
7df0: 69 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74 20  ite_debug(const 
7e00: 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20  char *zBuf, int 
7e10: 6e 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a 44  nBuf){.  char zD
7e20: 62 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49 4e  bgBuf[SQLITE_WIN
7e30: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 5d  32_DBG_BUF_SIZE]
7e40: 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d  ;.  int nMin = M
7e50: 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54 45  IN(nBuf, (SQLITE
7e60: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
7e70: 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d 61  IZE - 1)); /* ma
7e80: 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20 2a  y be negative. *
7e90: 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31 20  /.  if( nMin<-1 
7ea0: 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20  ) nMin = -1; /* 
7eb0: 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61 6c  all negative val
7ec0: 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20 2a  ues become -1. *
7ed0: 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69 6e  /.  assert( nMin
7ee0: 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20  ==-1 || nMin==0 
7ef0: 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f 57  || nMin<SQLITE_W
7f00: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
7f10: 45 20 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  E );.#if defined
7f20: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
7f30: 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20 6e 4d  S_ANSI).  if( nM
7f40: 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  in>0 ){.    mems
7f50: 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53  et(zDbgBuf, 0, S
7f60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
7f70: 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d  BUF_SIZE);.    m
7f80: 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a  emcpy(zDbgBuf, z
7f90: 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  Buf, nMin);.    
7fa0: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
7fb0: 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b 0a 20  ingA(zDbgBuf);. 
7fc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f 75   }else{.    osOu
7fd0: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
7fe0: 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69  (zBuf);.  }.#eli
7ff0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
8000: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
8010: 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75  .  memset(zDbgBu
8020: 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e  f, 0, SQLITE_WIN
8030: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29  32_DBG_BUF_SIZE)
8040: 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c 74 69  ;.  if ( osMulti
8050: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 0a  ByteToWideChar(.
8060: 20 20 20 20 20 20 20 20 20 20 6f 73 41 72 65 46            osAreF
8070: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20  ileApisANSI() ? 
8080: 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43  CP_ACP : CP_OEMC
8090: 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20  P, 0, zBuf,.    
80a0: 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50 57        nMin, (LPW
80b0: 53 54 52 29 7a 44 62 67 42 75 66 2c 20 53 51 4c  STR)zDbgBuf, SQL
80c0: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
80d0: 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57 43  F_SIZE/sizeof(WC
80e0: 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20 20  HAR))<=0 ){.    
80f0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73  return;.  }.  os
8100: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8110: 67 57 28 28 4c 50 43 57 53 54 52 29 7a 44 62 67  gW((LPCWSTR)zDbg
8120: 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  Buf);.#else.  if
8130: 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20  ( nMin>0 ){.    
8140: 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20  memset(zDbgBuf, 
8150: 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  0, SQLITE_WIN32_
8160: 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20  DBG_BUF_SIZE);. 
8170: 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75     memcpy(zDbgBu
8180: 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a  f, zBuf, nMin);.
8190: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
81a0: 72 72 2c 20 22 25 73 22 2c 20 7a 44 62 67 42 75  rr, "%s", zDbgBu
81b0: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
81c0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
81d0: 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20   "%s", zBuf);.  
81e0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
81f0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
8200: 72 6f 75 74 69 6e 65 20 73 75 73 70 65 6e 64 73  routine suspends
8210: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
8220: 65 61 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74  ead for at least
8230: 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f   ms.** milliseco
8240: 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20 65 71  nds.  This is eq
8250: 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20  uivalent to the 
8260: 57 69 6e 33 32 20 53 6c 65 65 70 28 29 20 69 6e  Win32 Sleep() in
8270: 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20  terface..*/.#if 
8280: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
8290: 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20 73 6c  static HANDLE sl
82a0: 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23  eepObj = NULL;.#
82b0: 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c 69  endif..void sqli
82c0: 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
82d0: 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f 6e  DWORD millisecon
82e0: 64 73 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ds){.#if SQLITE_
82f0: 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 20 28 20  OS_WINRT.  if ( 
8300: 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29  sleepObj==NULL )
8310: 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d  {.    sleepObj =
8320: 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45 78   osCreateEventEx
8330: 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52  W(NULL, NULL, CR
8340: 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55 41  EATE_EVENT_MANUA
8350: 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20 20 20 20  L_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 20 53 59 4e 43 48 52 4f           SYNCHRO
8380: 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73 73  NIZE);.  }.  ass
8390: 65 72 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e  ert( sleepObj!=N
83a0: 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74 46  ULL );.  osWaitF
83b0: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
83c0: 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69  (sleepObj, milli
83d0: 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29 3b  seconds, FALSE);
83e0: 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65 70  .#else.  osSleep
83f0: 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b 0a  (milliseconds);.
8400: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
8410: 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e  Return true (non
8420: 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65  -zero) if we are
8430: 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57   running under W
8440: 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e  inNT, Win2K, Win
8450: 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e  XP,.** or WinCE.
8460: 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28    Return false (
8470: 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c  zero) for Win95,
8480: 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45   Win98, or WinME
8490: 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20  ..**.** Here is 
84a0: 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f  an interesting o
84b0: 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e  bservation:  Win
84c0: 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57  95, Win98, and W
84d0: 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65  inME lack.** the
84e0: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50   LockFileEx() AP
84f0: 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73  I.  But we can s
8500: 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20  till statically 
8510: 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61  link against tha
8520: 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67  t.** API as long
8530: 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c   as we don't cal
8540: 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e  l it when runnin
8550: 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20  g Win95/98/ME.  
8560: 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69  A call to.** thi
8570: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
8580: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
8590: 66 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69  f the host is Wi
85a0: 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20  n95/98/ME or.** 
85b0: 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74  WinNT/2K/XP so t
85c0: 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  hat we will know
85d0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
85e0: 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61  we can safely ca
85f0: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69  ll.** the LockFi
8600: 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23  leEx() API..*/.#
8610: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
8620: 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
8630: 57 49 4e 52 54 0a 23 20 64 65 66 69 6e 65 20 69  WINRT.# define i
8640: 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66  sNT()  (1).#elif
8650: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8660: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
8670: 0a 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29  .# define isNT()
8680: 20 20 28 30 29 0a 23 65 6c 73 65 0a 20 20 73 74    (0).#else.  st
8690: 61 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76 6f  atic int isNT(vo
86a0: 69 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  id){.    if( sql
86b0: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20  ite3_os_type==0 
86c0: 29 7b 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49  ){.      OSVERSI
86d0: 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20  ONINFOA sInfo;. 
86e0: 20 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56       sInfo.dwOSV
86f0: 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d  ersionInfoSize =
8700: 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a   sizeof(sInfo);.
8710: 20 20 20 20 20 20 6f 73 47 65 74 56 65 72 73 69        osGetVersi
8720: 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a 20  onExA(&sInfo);. 
8730: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f       sqlite3_os_
8740: 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50  type = sInfo.dwP
8750: 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50  latformId==VER_P
8760: 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54  LATFORM_WIN32_NT
8770: 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a   ? 2 : 1;.    }.
8780: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
8790: 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20  e3_os_type==2;. 
87a0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
87b0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
87c0: 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ALLOC./*.** Allo
87d0: 63 61 74 65 20 6e 42 79 74 65 73 20 6f 66 20 6d  cate nBytes of m
87e0: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
87f0: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c   void *winMemMal
8800: 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 7b  loc(int nBytes){
8810: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
8820: 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77  .  void *p;..  w
8830: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
8840: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
8850: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
8860: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
8870: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
8880: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
8890: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
88a0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
88b0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
88c0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
88d0: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
88e0: 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c  sert ( osHeapVal
88f0: 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c  idate(hHeap, SQL
8900: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
8910: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
8920: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
8930: 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70  nBytes>=0 );.  p
8940: 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68   = osHeapAlloc(h
8950: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
8960: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28  32_HEAP_FLAGS, (
8970: 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a  SIZE_T)nBytes);.
8980: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
8990: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
89a0: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
89b0: 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25  d to HeapAlloc %
89c0: 75 20 62 79 74 65 73 20 28 25 64 29 2c 20 68 65  u bytes (%d), he
89d0: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
89e0: 20 20 20 20 20 20 20 20 6e 42 79 74 65 73 2c 20          nBytes, 
89f0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
8a00: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
8a10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
8a20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d  .}../*.** Free m
8a30: 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
8a40: 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65   void winMemFree
8a50: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a  (void *pPrior){.
8a60: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
8a70: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
8a80: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
8a90: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
8aa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
8ab0: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
8ac0: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
8ad0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
8ae0: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
8af0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
8b00: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
8b10: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
8b20: 20 20 61 73 73 65 72 74 20 28 20 6f 73 48 65 61    assert ( osHea
8b30: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
8b40: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
8b50: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
8b60: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ) );.#endif.  if
8b70: 28 20 21 70 50 72 69 6f 72 20 29 20 72 65 74 75  ( !pPrior ) retu
8b80: 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20 4e  rn; /* Passing N
8b90: 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65 65 20  ULL to HeapFree 
8ba0: 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a 2f  is undefined. */
8bb0: 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70 46 72  .  if( !osHeapFr
8bc0: 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ee(hHeap, SQLITE
8bd0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
8be0: 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a 20 20  S, pPrior) ){.  
8bf0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
8c00: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
8c10: 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65 65 20  led to HeapFree 
8c20: 62 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c 20 68  block %p (%d), h
8c30: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
8c40: 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2c           pPrior,
8c50: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
8c60: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29  ), (void*)hHeap)
8c70: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
8c80: 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f  hange the size o
8c90: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65  f an existing me
8ca0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
8cb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
8cc0: 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f  winMemRealloc(vo
8cd0: 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20  id *pPrior, int 
8ce0: 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c  nBytes){.  HANDL
8cf0: 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20  E hHeap;.  void 
8d00: 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73  *p;..  winMemAss
8d10: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
8d20: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
8d30: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
8d40: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
8d50: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
8d60: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
8d70: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
8d80: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
8d90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
8da0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
8db0: 54 45 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f  TE).  assert ( o
8dc0: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48  sHeapValidate(hH
8dd0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
8de0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
8df0: 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a  rior) );.#endif.
8e00: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73    assert( nBytes
8e10: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50  >=0 );.  if( !pP
8e20: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d 20  rior ){.    p = 
8e30: 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61  osHeapAlloc(hHea
8e40: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
8e50: 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a  HEAP_FLAGS, (SIZ
8e60: 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d  E_T)nBytes);.  }
8e70: 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73  else{.    p = os
8e80: 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 61  HeapReAlloc(hHea
8e90: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
8ea0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
8eb0: 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74  or, (SIZE_T)nByt
8ec0: 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  es);.  }.  if( !
8ed0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
8ee0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
8ef0: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 25 73  M, "failed to %s
8f00: 20 25 75 20 62 79 74 65 73 20 28 25 64 29 2c 20   %u bytes (%d), 
8f10: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
8f20: 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72            pPrior
8f30: 20 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22   ? "HeapReAlloc"
8f40: 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20   : "HeapAlloc", 
8f50: 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73  nBytes, osGetLas
8f60: 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
8f70: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a            (void*
8f80: 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72  )hHeap);.  }.  r
8f90: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
8fa0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
8fb0: 65 20 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64  e of an outstand
8fc0: 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20  ing allocation, 
8fd0: 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  in bytes..*/.sta
8fe0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69  tic int winMemSi
8ff0: 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48  ze(void *p){.  H
9000: 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53  ANDLE hHeap;.  S
9010: 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d  IZE_T n;..  winM
9020: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
9030: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
9040: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
9050: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
9060: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
9070: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
9080: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
9090: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
90a0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
90b0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
90c0: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
90d0: 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  t ( osHeapValida
90e0: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
90f0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
9100: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
9110: 69 66 0a 20 20 69 66 28 20 21 70 20 29 20 72 65  if.  if( !p ) re
9120: 74 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73  turn 0;.  n = os
9130: 48 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20  HeapSize(hHeap, 
9140: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9150: 50 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69  P_FLAGS, p);.  i
9160: 66 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31  f( n==(SIZE_T)-1
9170: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9180: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
9190: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
91a0: 70 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28  pSize block %p (
91b0: 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  %d), heap=%p",. 
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
91d0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
91e0: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
91f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
9200: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
9210: 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nt)n;.}../*.** R
9220: 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73  ound up a reques
9230: 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65  t size to the ne
9240: 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74  xt valid allocat
9250: 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  ion size..*/.sta
9260: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f  tic int winMemRo
9270: 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20  undup(int n){.  
9280: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
9290: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
92a0: 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74  is module..*/.st
92b0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49  atic int winMemI
92c0: 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61  nit(void *pAppDa
92d0: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
92e0: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
92f0: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
9300: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
9310: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
9320: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
9330: 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57  OR;.  assert( pW
9340: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
9350: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29  ==WINMEM_MAGIC )
9360: 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  ;..#if !SQLITE_O
9370: 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54  S_WINRT && SQLIT
9380: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45  E_WIN32_HEAP_CRE
9390: 41 54 45 0a 20 20 69 66 28 20 21 70 57 69 6e 4d  ATE.  if( !pWinM
93a0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
93b0: 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61  .    pWinMemData
93c0: 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48 65 61 70  ->hHeap = osHeap
93d0: 43 72 65 61 74 65 28 53 51 4c 49 54 45 5f 57 49  Create(SQLITE_WI
93e0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a  N32_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 20 53 51 4c 49 54 45 5f 57 49 4e        SQLITE_WIN
9420: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
9430: 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
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 20 53 51 4c 49 54 45 5f           SQLITE_
9460: 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53  WIN32_HEAP_MAX_S
9470: 49 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 21 70  IZE);.    if( !p
9480: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
9490: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
94a0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
94b0: 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20 20 22  MEM,.          "
94c0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 72  failed to HeapCr
94d0: 65 61 74 65 20 28 25 64 29 2c 20 66 6c 61 67 73  eate (%d), flags
94e0: 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25 75  =%u, initSize=%u
94f0: 2c 20 6d 61 78 53 69 7a 65 3d 25 75 22 2c 0a 20  , maxSize=%u",. 
9500: 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
9510: 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49 54  stError(), SQLIT
9520: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
9530: 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 53 51  GS,.          SQ
9540: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
9550: 49 4e 49 54 5f 53 49 5a 45 2c 20 53 51 4c 49 54  INIT_SIZE, SQLIT
9560: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58  E_WIN32_HEAP_MAX
9570: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 65  _SIZE);.      re
9580: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
9590: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69  M;.    }.    pWi
95a0: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
95b0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 61 73 73   = TRUE;.    ass
95c0: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
95d0: 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a  ->bOwned );.  }.
95e0: 23 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44  #else.  pWinMemD
95f0: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47  ata->hHeap = osG
9600: 65 74 50 72 6f 63 65 73 73 48 65 61 70 28 29 3b  etProcessHeap();
9610: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
9620: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
9630: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
9640: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20  LITE_NOMEM,.    
9650: 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 47      "failed to G
9660: 65 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 25  etProcessHeap (%
9670: 64 29 22 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  d)", osGetLastEr
9680: 72 6f 72 28 29 29 3b 0a 20 20 20 20 72 65 74 75  ror());.    retu
9690: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
96a0: 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61  .  }.  pWinMemDa
96b0: 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c  ta->bOwned = FAL
96c0: 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  SE;.  assert( !p
96d0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
96e0: 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ed );.#endif.  a
96f0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
9700: 74 61 2d 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a  ta->hHeap!=0 );.
9710: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
9720: 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e  mData->hHeap!=IN
9730: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
9740: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
9750: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
9760: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
9770: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
9780: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
9790: 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69  HeapValidate(pWi
97a0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c  nMemData->hHeap,
97b0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
97c0: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
97d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
97e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
97f0: 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c  ./*.** Deinitial
9800: 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e  ize this module.
9810: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9820: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76  winMemShutdown(v
9830: 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a  oid *pAppData){.
9840: 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57    winMemData *pW
9850: 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e  inMemData = (win
9860: 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61  MemData *)pAppDa
9870: 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e  ta;..  if( !pWin
9880: 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e  MemData ) return
9890: 3b 0a 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44  ;.  if( pWinMemD
98a0: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
98b0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
98c0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e  mData->hHeap!=IN
98d0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
98e0: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
98f0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
9900: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
9910: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
9920: 54 45 29 0a 20 20 20 20 61 73 73 65 72 74 28 20  TE).    assert( 
9930: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70  osHeapValidate(p
9940: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
9950: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
9960: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
9970: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ) );.#endif.    
9980: 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  if( pWinMemData-
9990: 3e 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20  >bOwned ){.     
99a0: 20 69 66 28 20 21 6f 73 48 65 61 70 44 65 73 74   if( !osHeapDest
99b0: 72 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d  roy(pWinMemData-
99c0: 3e 68 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20  >hHeap) ){.     
99d0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
99e0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
99f0: 69 6c 65 64 20 74 6f 20 48 65 61 70 44 65 73 74  iled to HeapDest
9a00: 72 6f 79 20 28 25 64 29 2c 20 68 65 61 70 3d 25  roy (%d), heap=%
9a10: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
9a20: 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
9a30: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
9a40: 29 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  )pWinMemData->hH
9a50: 65 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eap);.      }.  
9a60: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
9a70: 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b  >bOwned = FALSE;
9a80: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d  .    }.    pWinM
9a90: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20  emData->hHeap = 
9aa0: 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  NULL;.  }.}../*.
9ab0: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
9ac0: 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79  low-level memory
9ad0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63   allocation func
9ae0: 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e  tion pointers in
9af0: 0a 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  .** sqlite3Globa
9b00: 6c 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70  lConfig.m with p
9b10: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72  ointers to the r
9b20: 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20  outines in this 
9b30: 66 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67  file. The.** arg
9b40: 75 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20 74  uments specify t
9b50: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f  he block of memo
9b60: 72 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a  ry to manage..**
9b70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9b80: 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
9b90: 62 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  by sqlite3_confi
9ba0: 67 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f  g(), and therefo
9bb0: 72 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71  re.** is not req
9bc0: 75 69 72 65 64 20 74 6f 20 62 65 20 74 68 72 65  uired to be thre
9bd0: 61 64 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f  adsafe (it is no
9be0: 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c  t)..*/.const sql
9bf0: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
9c00: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57   *sqlite3MemGetW
9c10: 69 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74  in32(void){.  st
9c20: 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
9c30: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77  e3_mem_methods w
9c40: 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b  inMemMethods = {
9c50: 0a 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  .    winMemMallo
9c60: 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65  c,.    winMemFre
9c70: 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61  e,.    winMemRea
9c80: 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  lloc,.    winMem
9c90: 53 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d  Size,.    winMem
9ca0: 52 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e  Roundup,.    win
9cb0: 4d 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e  MemInit,.    win
9cc0: 4d 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20  MemShutdown,.   
9cd0: 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20   &win_mem_data. 
9ce0: 20 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69   };.  return &wi
9cf0: 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a  nMemMethods;.}..
9d00: 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53  void sqlite3MemS
9d10: 65 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b  etDefault(void){
9d20: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
9d30: 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
9d40: 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d  MALLOC, sqlite3M
9d50: 65 6d 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d  emGetWin32());.}
9d60: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
9d70: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a  E_WIN32_MALLOC *
9d80: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  /../*.** Convert
9d90: 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20   a UTF-8 string 
9da0: 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  to Microsoft Uni
9db0: 63 6f 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20  code (UTF-16?). 
9dc0: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
9dd0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
9de0: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
9df0: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
9e00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53  ..*/.static LPWS
9e10: 54 52 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65  TR utf8ToUnicode
9e20: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
9e30: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
9e40: 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Char;.  LPWSTR z
9e50: 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20  WideFilename;.. 
9e60: 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69   nChar = osMulti
9e70: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
9e80: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65  P_UTF8, 0, zFile
9e90: 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20  name, -1, NULL, 
9ea0: 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d  0);.  if( nChar=
9eb0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
9ec0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46   0;.  }.  zWideF
9ed0: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
9ee0: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68  3MallocZero( nCh
9ef0: 61 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46  ar*sizeof(zWideF
9f00: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
9f10: 20 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61   if( zWideFilena
9f20: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
9f30: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68  urn 0;.  }.  nCh
9f40: 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  ar = osMultiByte
9f50: 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54  ToWideChar(CP_UT
9f60: 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  F8, 0, zFilename
9f70: 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e  , -1, zWideFilen
9f80: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69       nChar);.  i
9fb0: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
9fc0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
9fd0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a  zWideFilename);.
9fe0: 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d      zWideFilenam
9ff0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
a000: 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  urn zWideFilenam
a010: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  e;.}../*.** Conv
a020: 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e  ert Microsoft Un
a030: 69 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20  icode to UTF-8. 
a040: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
a050: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
a060: 6e 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  ng is.** obtaine
a070: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
a080: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
a090: 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65  ic char *unicode
a0a0: 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52 20 7a  ToUtf8(LPCWSTR z
a0b0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  WideFilename){. 
a0c0: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68   int nByte;.  ch
a0d0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a  ar *zFilename;..
a0e0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
a0f0: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
a100: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64  CP_UTF8, 0, zWid
a110: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30  eFilename, -1, 0
a120: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
a130: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
a140: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a150: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  }.  zFilename = 
a160: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
a170: 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  o( nByte );.  if
a180: 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ( zFilename==0 )
a190: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a1a0: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
a1b0: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
a1c0: 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  yte(CP_UTF8, 0, 
a1d0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
a1e0: 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42  1, zFilename, nB
a1f0: 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  yte,.           
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a210: 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66       0, 0);.  if
a220: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
a230: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a240: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
a250: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
a260: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69    }.  return zFi
a270: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
a280: 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53 49   Convert an ANSI
a290: 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f   string to Micro
a2a0: 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20 62 61  soft Unicode, ba
a2b0: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75  sed on the.** cu
a2c0: 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20 73  rrent codepage s
a2d0: 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c 65  ettings for file
a2e0: 20 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70   apis..** .** Sp
a2f0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
a300: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
a310: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
a320: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
a330: 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50  oc..*/.static LP
a340: 57 53 54 52 20 6d 62 63 73 54 6f 55 6e 69 63 6f  WSTR mbcsToUnico
a350: 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  de(const char *z
a360: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
a370: 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52   nByte;.  LPWSTR
a380: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a   zMbcsFilename;.
a390: 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d    int codepage =
a3a0: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
a3b0: 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20  SI() ? CP_ACP : 
a3c0: 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79  CP_OEMCP;..  nBy
a3d0: 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  te = osMultiByte
a3e0: 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70  ToWideChar(codep
a3f0: 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  age, 0, zFilenam
a400: 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20  e, -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 20 30 29 2a               0)*
a430: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20  sizeof(WCHAR);. 
a440: 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
a450: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a460: 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61   }.  zMbcsFilena
a470: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
a480: 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69  ocZero( nByte*si
a490: 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61  zeof(zMbcsFilena
a4a0: 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  me[0]) );.  if( 
a4b0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30  zMbcsFilename==0
a4c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
a4d0: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
a4e0: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
a4f0: 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20  eChar(codepage, 
a500: 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  0, zFilename, -1
a510: 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c  , zMbcsFilename,
a520: 0a 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: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e   nByte);.  if( n
a550: 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Byte==0 ){.    s
a560: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63  qlite3_free(zMbc
a570: 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  sFilename);.    
a580: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20  zMbcsFilename = 
a590: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
a5a0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d  zMbcsFilename;.}
a5b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
a5c0: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
a5d0: 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20  e to multi-byte 
a5e0: 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67  character string
a5f0: 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a  , based on the.*
a600: 2a 20 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f  * user's ANSI co
a610: 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70  depage..**.** Sp
a620: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
a630: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
a640: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
a650: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  .** sqlite3_mall
a660: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
a670: 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d  char *unicodeToM
a680: 62 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64  bcs(LPCWSTR zWid
a690: 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e  eFilename){.  in
a6a0: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
a6b0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e  *zFilename;.  in
a6c0: 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41  t codepage = osA
a6d0: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
a6e0: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
a6f0: 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  EMCP;..  nByte =
a700: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
a710: 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c  tiByte(codepage,
a720: 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d   0, zWideFilenam
a730: 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  e, -1, 0, 0, 0, 
a740: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
a750: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75  == 0 ){.    retu
a760: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
a770: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  ename = sqlite3M
a780: 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
a790: 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   );.  if( zFilen
a7a0: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ame==0 ){.    re
a7b0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
a7c0: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
a7d0: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
a7e0: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
a7f0: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c  lename, -1, zFil
a800: 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
a810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a820: 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30 2c         nByte, 0,
a830: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
a840: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c   == 0 ){.    sql
a850: 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e  ite3_free(zFilen
a860: 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  ame);.    zFilen
a870: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
a880: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b  eturn zFilename;
a890: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
a8a0: 74 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72  t multibyte char
a8b0: 61 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20  acter string to 
a8c0: 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f  UTF-8.  Space to
a8d0: 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74   hold the.** ret
a8e0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
a8f0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
a900: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
a910: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
a920: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
a930: 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tf8(const char *
a940: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68  zFilename){.  ch
a950: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66  ar *zFilenameUtf
a960: 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70  8;.  LPWSTR zTmp
a970: 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64  Wide;..  zTmpWid
a980: 65 20 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64  e = mbcsToUnicod
a990: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
a9a0: 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20  if( zTmpWide==0 
a9b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
a9c0: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
a9d0: 55 74 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f  Utf8 = unicodeTo
a9e0: 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a  Utf8(zTmpWide);.
a9f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
aa00: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75  TmpWide);.  retu
aa10: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  rn zFilenameUtf8
aa20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
aa30: 72 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74  rt UTF-8 to mult
aa40: 69 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20  ibyte character 
aa50: 73 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74  string.  Space t
aa60: 6f 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72  o hold the .** r
aa70: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
aa80: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
aa90: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
aaa0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
aab0: 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
aac0: 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72  _mbcs(const char
aad0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
aae0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d  char *zFilenameM
aaf0: 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54  bcs;.  LPWSTR zT
ab00: 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57  mpWide;..  zTmpW
ab10: 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63  ide = utf8ToUnic
ab20: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
ab30: 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d    if( zTmpWide==
ab40: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
ab50: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
ab60: 6d 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64 65  meMbcs = unicode
ab70: 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29  ToMbcs(zTmpWide)
ab80: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
ab90: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65  (zTmpWide);.  re
aba0: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62  turn zFilenameMb
abb0: 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  cs;.}../*.** Thi
abc0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
abd0: 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
abe0: 72 79 20 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  ry or the tempor
abf0: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 62 61  ary directory ba
ac00: 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 72  sed on.** the pr
ac10: 6f 76 69 64 65 64 20 61 72 67 75 6d 65 6e 74 73  ovided arguments
ac20: 2e 20 20 54 68 65 20 74 79 70 65 20 61 72 67 75  .  The type argu
ac30: 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 31 20 69  ment must be 1 i
ac40: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74  n order to set t
ac50: 68 65 0a 2a 2a 20 64 61 74 61 20 64 69 72 65 63  he.** data direc
ac60: 74 6f 72 79 20 6f 72 20 32 20 69 6e 20 6f 72 64  tory or 2 in ord
ac70: 65 72 20 74 6f 20 73 65 74 20 74 68 65 20 74 65  er to set the te
ac80: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
ac90: 79 2e 20 20 54 68 65 20 7a 56 61 6c 75 65 0a 2a  y.  The zValue.*
aca0: 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  * argument is th
acb0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69  e name of the di
acc0: 72 65 63 74 6f 72 79 20 74 6f 20 75 73 65 2e 20  rectory to use. 
acd0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
ace0: 65 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c  e will be.** SQL
acf0: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
ad00: 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sful..*/.int sql
ad10: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
ad20: 69 72 65 63 74 6f 72 79 28 44 57 4f 52 44 20 74  irectory(DWORD t
ad30: 79 70 65 2c 20 4c 50 43 57 53 54 52 20 7a 56 61  ype, LPCWSTR zVa
ad40: 6c 75 65 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70  lue){.  char **p
ad50: 70 44 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  pDirectory = 0;.
ad60: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ad70: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69  MIT_AUTOINIT.  i
ad80: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
ad90: 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
ada0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
adb0: 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  rc;.#endif.  if(
adc0: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
add0: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
ade0: 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70  RY_TYPE ){.    p
adf0: 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71  pDirectory = &sq
ae00: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
ae10: 74 6f 72 79 3b 0a 20 20 7d 65 6c 73 65 20 69 66  tory;.  }else if
ae20: 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  ( type==SQLITE_W
ae30: 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54  IN32_TEMP_DIRECT
ae40: 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20  ORY_TYPE ){.    
ae50: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73  ppDirectory = &s
ae60: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
ae70: 63 74 6f 72 79 3b 0a 20 20 7d 0a 20 20 61 73 73  ctory;.  }.  ass
ae80: 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72  ert( !ppDirector
ae90: 79 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54  y || type==SQLIT
aea0: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
aeb0: 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 20 20  ECTORY_TYPE.    
aec0: 20 20 20 20 20 20 7c 7c 20 74 79 70 65 3d 3d 53        || type==S
aed0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50  QLITE_WIN32_TEMP
aee0: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a  _DIRECTORY_TYPE.
aef0: 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21    );.  assert( !
af00: 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 73  ppDirectory || s
af10: 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61  qlite3MemdebugHa
af20: 73 54 79 70 65 28 2a 70 70 44 69 72 65 63 74 6f  sType(*ppDirecto
af30: 72 79 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41 50  ry, MEMTYPE_HEAP
af40: 29 20 29 3b 0a 20 20 69 66 28 20 70 70 44 69 72  ) );.  if( ppDir
af50: 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 63 68  ectory ){.    ch
af60: 61 72 20 2a 7a 56 61 6c 75 65 55 74 66 38 20 3d  ar *zValueUtf8 =
af70: 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 6c   0;.    if( zVal
af80: 75 65 20 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20  ue && zValue[0] 
af90: 29 7b 0a 20 20 20 20 20 20 7a 56 61 6c 75 65 55  ){.      zValueU
afa0: 74 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  tf8 = unicodeToU
afb0: 74 66 38 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20  tf8(zValue);.   
afc0: 20 20 20 69 66 20 28 20 7a 56 61 6c 75 65 55 74     if ( zValueUt
afd0: 66 38 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f8==0 ){.       
afe0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
aff0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
b000: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
b010: 66 72 65 65 28 2a 70 70 44 69 72 65 63 74 6f 72  free(*ppDirector
b020: 79 29 3b 0a 20 20 20 20 2a 70 70 44 69 72 65 63  y);.    *ppDirec
b030: 74 6f 72 79 20 3d 20 7a 56 61 6c 75 65 55 74 66  tory = zValueUtf
b040: 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  8;.    return SQ
b050: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
b060: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
b070: 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OR;.}../*.** The
b080: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
b090: 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
b0a0: 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
b0b0: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
b0c0: 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
b0d0: 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
b0e0: 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
b0f0: 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
b100: 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f  s truncated)..*/
b110: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4c  .static int getL
b120: 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52  astErrorMsg(DWOR
b130: 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74  D lastErrno, int
b140: 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
b150: 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d  f){.  /* FormatM
b160: 65 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 30  essage returns 0
b170: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74   on failure.  Ot
b180: 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20  herwise it.  ** 
b190: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
b1a0: 65 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 69  er of TCHARs wri
b1b0: 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70  tten to the outp
b1c0: 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20  ut.  ** buffer, 
b1d0: 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65  excluding the te
b1e0: 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63  rminating null c
b1f0: 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52  har..  */.  DWOR
b200: 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63  D dwLen = 0;.  c
b210: 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a  har *zOut = 0;..
b220: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
b230: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
b240: 4e 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a 54  NRT.    WCHAR zT
b250: 65 6d 70 57 69 64 65 5b 4d 41 58 5f 50 41 54 48  empWide[MAX_PATH
b260: 2b 31 5d 3b 20 2f 2a 20 4e 4f 54 45 3a 20 53 6f  +1]; /* NOTE: So
b270: 6d 65 77 68 61 74 20 61 72 62 69 74 72 61 72 79  mewhat arbitrary
b280: 2e 20 2a 2f 0a 20 20 20 20 64 77 4c 65 6e 20 3d  . */.    dwLen =
b290: 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65   osFormatMessage
b2a0: 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45  W(FORMAT_MESSAGE
b2b0: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 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 20 46 4f 52 4d              FORM
b2e0: 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52  AT_MESSAGE_IGNOR
b2f0: 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20  E_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 20 4e 55 4c 4c 2c 0a 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 20 6c 61 73 74 45             lastE
b340: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 20 20 20 30 2c 0a 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 20 7a 54 65 6d 70 57 69 64 65 2c 0a 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 20 4d 41 58 5f 50             MAX_P
b3b0: 41 54 48 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ATH,.           
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3d0: 20 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20    0);.#else.    
b3e0: 4c 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65  LPWSTR zTempWide
b3f0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c   = NULL;.    dwL
b400: 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73  en = osFormatMes
b410: 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53  sageW(FORMAT_MES
b420: 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55  SAGE_ALLOCATE_BU
b430: 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20  FFER |.         
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b450: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
b460: 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c  GE_FROM_SYSTEM |
b470: 0a 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 20 46 4f                FO
b490: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e  RMAT_MESSAGE_IGN
b4a0: 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20  ORE_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 20 4e 55 4c 4c 2c 0a            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 20 6c 61 73               las
b4f0: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 20 20 20 20 20 30 2c 0a 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 20 28 4c 50 57 53 54 52 29 20 26 7a       (LPWSTR) &z
b540: 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20  TempWide,.      
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 20 20 20 20 20 20 30 2c 0a 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 20 30 29 3b 0a 23 65 6e 64 69         0);.#endi
b590: 66 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20  f.    if( dwLen 
b5a0: 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  > 0 ){.      /* 
b5b0: 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65  allocate a buffe
b5c0: 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f  r and convert to
b5d0: 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73   UTF8 */.      s
b5e0: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
b5f0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
b600: 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54   zOut = unicodeT
b610: 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29  oUtf8(zTempWide)
b620: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
b630: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
b640: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
b650: 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20  _WINRT.      /* 
b660: 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20  free the system 
b670: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
b680: 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   by FormatMessag
b690: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63  e */.      osLoc
b6a0: 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65  alFree(zTempWide
b6b0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
b6c0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
b6d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
b6e0: 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61  .  else{.    cha
b6f0: 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b  r *zTemp = NULL;
b700: 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46  .    dwLen = osF
b710: 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f  ormatMessageA(FO
b720: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c  RMAT_MESSAGE_ALL
b730: 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20  OCATE_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 20 46 4f 52 4d              FORM
b760: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f  AT_MESSAGE_FROM_
b770: 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20  SYSTEM |.       
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b790: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
b7a0: 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45  SAGE_IGNORE_INSE
b7b0: 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RTS,.           
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7d0: 20 20 4e 55 4c 4c 2c 0a 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 20 6c 61 73 74 45 72 72 6e 6f 2c 0a       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 20 30 2c 0a               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 20 28 4c 50               (LP
b840: 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20  STR) &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 20 30 2c 0a 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 20 30 29 3b 0a 20 20            0);.  
b890: 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20    if( dwLen > 0 
b8a0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f  ){.      /* allo
b8b0: 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e  cate a buffer an
b8c0: 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46  d convert to UTF
b8d0: 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  8 */.      sqlit
b8e0: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
b8f0: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75  loc();.      zOu
b900: 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t = sqlite3_win3
b910: 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
b920: 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  Temp);.      sql
b930: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
b940: 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20  loc();.      /* 
b950: 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20  free the system 
b960: 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64  buffer allocated
b970: 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   by FormatMessag
b980: 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63  e */.      osLoc
b990: 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  alFree(zTemp);. 
b9a0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
b9b0: 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e    if( 0 == dwLen
b9c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b9d0: 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
b9e0: 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78  Buf, "OsError 0x
b9f0: 25 78 20 28 25 75 29 22 2c 20 6c 61 73 74 45 72  %x (%u)", lastEr
ba00: 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b  rno, lastErrno);
ba10: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
ba20: 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20   copy a maximum 
ba30: 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f  of nBuf chars to
ba40: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   output buffer *
ba50: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
ba60: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
ba70: 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  f, "%s", zOut);.
ba80: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
ba90: 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20  UTF8 buffer */. 
baa0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
bab0: 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  zOut);.  }.  ret
bac0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  urn 0;.}../*.**.
bad0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
bae0: 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74   - winLogErrorAt
baf0: 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79  Line() - is only
bb00: 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61   ever called via
bb10: 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69   the macro.** wi
bb20: 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a  nLogError()..**.
bb30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
bb40: 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72  is invoked after
bb50: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
bb60: 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69   in an OS functi
bb70: 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61  on..** It logs a
bb80: 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73   message using s
bb90: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e  qlite3_log() con
bba0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
bbb0: 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  ent value of.** 
bbc0: 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20  error code and, 
bbd0: 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  if possible, the
bbe0: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
bbf0: 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20  equivalent from 
bc00: 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  .** FormatMessag
bc10: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
bc20: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
bc30: 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  ed to the macro 
bc40: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72  should be the er
bc50: 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  ror code that.**
bc60: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
bc70: 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67  d to SQLite (e.g
bc80: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  . SQLITE_IOERR_D
bc90: 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41  ELETE, SQLITE_CA
bca0: 4e 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65  NTOPEN). .** The
bcb0: 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20   two subsequent 
bcc0: 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64  arguments should
bcd0: 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   be the name of 
bce0: 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20  the OS function 
bcf0: 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61  that.** failed a
bd00: 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  nd the associate
bd10: 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61  d file-system pa
bd20: 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23  th, if any..*/.#
bd30: 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72  define winLogErr
bd40: 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69  or(a,b,c,d)   wi
bd50: 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  nLogErrorAtLine(
bd60: 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f  a,b,c,d,__LINE__
bd70: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ).static int win
bd80: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a  LogErrorAtLine(.
bd90: 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20    int errcode,  
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f    /* SQLite erro
bdc0: 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52  r code */.  DWOR
bdd0: 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20  D lastErrno,    
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
bdf0: 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20  in32 last error 
be00: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
be10: 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20  *zFunc,         
be20: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
be30: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
be40: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e   failed */.  con
be50: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
be70: 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69  File path associ
be80: 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20  ated with error 
be90: 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 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 20 2f 2a 20 53 6f 75 72 63 65 20 6c       /* Source l
bec0: 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65  ine number where
bed0: 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20   error occurred 
bee0: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73  */.){.  char zMs
bef0: 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20  g[500];         
bf00: 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e          /* Human
bf10: 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20   readable error 
bf20: 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  text */.  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 20 2f 2a 20 4c 6f 6f            /* Loo
bf50: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
bf60: 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 67  zMsg[0] = 0;.  g
bf70: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6c  etLastErrorMsg(l
bf80: 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66  astErrno, sizeof
bf90: 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a 20  (zMsg), zMsg);. 
bfa0: 20 61 73 73 65 72 74 28 20 65 72 72 63 6f 64 65   assert( errcode
bfb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
bfc0: 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20   if( zPath==0 ) 
bfd0: 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 66 6f  zPath = "";.  fo
bfe0: 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26  r(i=0; zMsg[i] &
bff0: 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20  & zMsg[i]!='\r' 
c000: 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27  && zMsg[i]!='\n'
c010: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b  ; i++){}.  zMsg[
c020: 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  i] = 0;.  sqlite
c030: 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20  3_log(errcode,. 
c040: 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a 25       "os_win.c:%
c050: 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d  d: (%d) %s(%s) -
c060: 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e   %s",.      iLin
c070: 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46  e, lastErrno, zF
c080: 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67  unc, zPath, zMsg
c090: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
c0a0: 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  errcode;.}../*.*
c0b0: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
c0c0: 74 69 6d 65 73 20 74 68 61 74 20 61 20 52 65 61  times that a Rea
c0d0: 64 46 69 6c 65 28 29 2c 20 57 72 69 74 65 46 69  dFile(), WriteFi
c0e0: 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c 65 74 65  le(), and Delete
c0f0: 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62  File().** will b
c100: 65 20 72 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77  e retried follow
c110: 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72  ing a locking er
c120: 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79 20 63  ror - probably c
c130: 61 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e 74  aused by .** ant
c140: 69 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 2e  ivirus software.
c150: 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69 74 69    Also the initi
c160: 61 6c 20 64 65 6c 61 79 20 62 65 66 6f 72 65 20  al delay before 
c170: 74 68 65 20 66 69 72 73 74 20 72 65 74 72 79 2e  the first retry.
c180: 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79 20 69 6e  .** The delay in
c190: 63 72 65 61 73 65 73 20 6c 69 6e 65 61 72 6c 79  creases linearly
c1a0: 20 77 69 74 68 20 65 61 63 68 20 72 65 74 72 79   with each retry
c1b0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
c1c0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
c1d0: 52 45 54 52 59 0a 23 20 64 65 66 69 6e 65 20 53  RETRY.# define S
c1e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
c1f0: 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e 64 69  R_RETRY 10.#endi
c200: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
c210: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
c220: 52 59 5f 44 45 4c 41 59 0a 23 20 64 65 66 69 6e  RY_DELAY.# defin
c230: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  e SQLITE_WIN32_I
c240: 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59  OERR_RETRY_DELAY
c250: 20 32 35 0a 23 65 6e 64 69 66 0a 73 74 61 74 69   25.#endif.stati
c260: 63 20 69 6e 74 20 77 69 6e 33 32 49 6f 65 72 72  c int win32Ioerr
c270: 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f 57  Retry = SQLITE_W
c280: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
c290: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
c2a0: 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  32IoerrRetryDela
c2b0: 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  y = SQLITE_WIN32
c2c0: 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c  _IOERR_RETRY_DEL
c2d0: 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  AY;../*.** If a 
c2e0: 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72  ReadFile() or Wr
c2f0: 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20  iteFile() error 
c300: 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74  occurs, invoke t
c310: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
c320: 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 6f 75  o see if it shou
c330: 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e 20 20  ld be retried.  
c340: 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72  Return TRUE to r
c350: 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41  etry.  Return FA
c360: 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75  LSE.** to give u
c370: 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e  p with an error.
c380: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
c390: 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70  etryIoerr(int *p
c3a0: 6e 52 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70  nRetry, DWORD *p
c3b0: 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20  Error){.  DWORD 
c3c0: 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  e = osGetLastErr
c3d0: 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52  or();.  if( *pnR
c3e0: 65 74 72 79 3e 3d 77 69 6e 33 32 49 6f 65 72 72  etry>=win32Ioerr
c3f0: 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28  Retry ){.    if(
c400: 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20   pError ){.     
c410: 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20   *pError = e;.  
c420: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30    }.    return 0
c430: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 3d 3d 45  ;.  }.  if( e==E
c440: 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49  RROR_ACCESS_DENI
c450: 45 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45  ED ||.      e==E
c460: 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54  RROR_LOCK_VIOLAT
c470: 49 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d  ION ||.      e==
c480: 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49  ERROR_SHARING_VI
c490: 4f 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73  OLATION ){.    s
c4a0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
c4b0: 65 70 28 77 69 6e 33 32 49 6f 65 72 72 52 65 74  ep(win32IoerrRet
c4c0: 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65  ryDelay*(1+*pnRe
c4d0: 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e  try));.    ++*pn
c4e0: 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72  Retry;.    retur
c4f0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  n 1;.  }.  if( p
c500: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45  Error ){.    *pE
c510: 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20  rror = e;.  }.  
c520: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
c530: 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72  ** Log a I/O err
c540: 6f 72 20 72 65 74 72 79 20 65 70 69 73 6f 64 65  or retry episode
c550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c560: 20 6c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52   logIoerr(int nR
c570: 65 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65  etry){.  if( nRe
c580: 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  try ){.    sqlit
c590: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f  e3_log(SQLITE_IO
c5a0: 45 52 52 2c 20 0a 20 20 20 20 20 20 22 64 65 6c  ERR, .      "del
c5b0: 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f  ayed %dms for lo
c5c0: 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c  ck/sharing confl
c5d0: 69 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 33  ict",.      win3
c5e0: 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  2IoerrRetryDelay
c5f0: 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b  *nRetry*(nRetry+
c600: 31 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  1)/2.    );.  }.
c610: 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  }..#if SQLITE_OS
c620: 5f 57 49 4e 43 45 0a 2f 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: 2a 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f  *.** This sectio
c680: 6e 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20  n contains code 
c690: 66 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a  for WinCE only..
c6a0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
c6b0: 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41  SQLITE_MSVC_LOCA
c6c0: 4c 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53  LTIME_API) || !S
c6d0: 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
c6e0: 54 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54  TIME_API./*.** T
c6f0: 68 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57  he MSVC CRT on W
c700: 69 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f  indows CE may no
c710: 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69  t have a localti
c720: 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  me() function.  
c730: 53 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73  So.** create a s
c740: 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69  ubstitute..*/.#i
c750: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
c760: 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65  struct tm *__cde
c770: 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e  cl localtime(con
c780: 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a  st time_t *t).{.
c790: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
c7a0: 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45  tm y;.  FILETIME
c7b0: 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53   uTm, lTm;.  SYS
c7c0: 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73  TEMTIME pTm;.  s
c7d0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34  qlite3_int64 t64
c7e0: 3b 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20  ;.  t64 = *t;.  
c7f0: 74 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36  t64 = (t64 + 116
c800: 34 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30  44473600)*100000
c810: 30 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44  00;.  uTm.dwLowD
c820: 61 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44  ateTime = (DWORD
c830: 29 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46  )(t64 & 0xFFFFFF
c840: 46 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67  FF);.  uTm.dwHig
c850: 68 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52  hDateTime= (DWOR
c860: 44 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20  D)(t64 >> 32);. 
c870: 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63   osFileTimeToLoc
c880: 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c  alFileTime(&uTm,
c890: 26 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54  &lTm);.  osFileT
c8a0: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28  imeToSystemTime(
c8b0: 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e  &lTm,&pTm);.  y.
c8c0: 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59  tm_year = pTm.wY
c8d0: 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e  ear - 1900;.  y.
c8e0: 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f  tm_mon = pTm.wMo
c8f0: 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f  nth - 1;.  y.tm_
c900: 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f  wday = pTm.wDayO
c910: 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64  fWeek;.  y.tm_md
c920: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20  ay = pTm.wDay;. 
c930: 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d   y.tm_hour = pTm
c940: 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d  .wHour;.  y.tm_m
c950: 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65  in = pTm.wMinute
c960: 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70  ;.  y.tm_sec = p
c970: 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65  Tm.wSecond;.  re
c980: 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69  turn &y;.}.#endi
c990: 66 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c  f..#define HANDL
c9a0: 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20  E_TO_WINFILE(a) 
c9b0: 28 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61  (winFile*)&((cha
c9c0: 72 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73  r*)a)[-(int)offs
c9d0: 65 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d  etof(winFile,h)]
c9e0: 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
c9f0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61  a lock on the ha
ca00: 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63  ndle h.*/.static
ca10: 20 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78   void winceMutex
ca20: 41 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68  Acquire(HANDLE h
ca30: 29 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72  ){.   DWORD dwEr
ca40: 72 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  r;.   do {.     
ca50: 64 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f  dwErr = osWaitFo
ca60: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c  rSingleObject(h,
ca70: 20 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d   INFINITE);.   }
ca80: 20 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d   while (dwErr !=
ca90: 20 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26   WAIT_OBJECT_0 &
caa0: 26 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f  & dwErr != WAIT_
cab0: 41 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a  ABANDONED);.}./*
cac0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f  .** Release a lo
cad0: 63 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77  ck acquired by w
cae0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
caf0: 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  ().*/.#define wi
cb00: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
cb10: 68 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28  h) ReleaseMutex(
cb20: 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  h)../*.** Create
cb30: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73   the mutex and s
cb40: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65  hared memory use
cb50: 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e  d for locking in
cb60: 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73   the file.** des
cb70: 63 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f  criptor pFile.*/
cb80: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63  .static int winc
cb90: 65 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73  eCreateLock(cons
cba0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
cbb0: 65 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  e, winFile *pFil
cbc0: 65 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f  e){.  LPWSTR zTo
cbd0: 6b 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d  k;.  LPWSTR zNam
cbe0: 65 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  e;.  DWORD lastE
cbf0: 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f  rrno;.  BOOL bLo
cc00: 67 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  gged = FALSE;.  
cc10: 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55  BOOL bInit = TRU
cc20: 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 75 74  E;..  zName = ut
cc30: 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  f8ToUnicode(zFil
cc40: 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  ename);.  if( zN
cc50: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
cc60: 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a   out of memory *
cc70: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
cc80: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
cc90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
cca0: 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20  alize the local 
ccb0: 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65  lockdata */.  me
ccc0: 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63  mset(&pFile->loc
ccd0: 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 46  al, 0, sizeof(pF
cce0: 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20  ile->local));.. 
ccf0: 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20   /* Replace the 
cd00: 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d  backslashes from
cd10: 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e   the filename an
cd20: 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20  d lowercase it. 
cd30: 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20   ** to derive a 
cd40: 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20  mutex name. */. 
cd50: 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f   zTok = osCharLo
cd60: 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66  werW(zName);.  f
cd70: 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b  or (;*zTok;zTok+
cd80: 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f  +){.    if (*zTo
cd90: 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b  k == '\\') *zTok
cda0: 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f   = '_';.  }..  /
cdb0: 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68  * Create/open th
cdc0: 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f  e named mutex */
cdd0: 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  .  pFile->hMutex
cde0: 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78   = osCreateMutex
cdf0: 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a  W(NULL, FALSE, z
ce00: 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46  Name);.  if (!pF
ce10: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
ce20: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
ce30: 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
ce40: 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f  ror();.    winLo
ce50: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
ce60: 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ERR, pFile->last
ce70: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
ce80: 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65         "winceCre
ce90: 61 74 65 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65  ateLock1", zFile
cea0: 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  name);.    sqlit
ceb0: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
cec0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ced0: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20  E_IOERR;.  }..  
cee0: 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d  /* Acquire the m
cef0: 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f 6e 74  utex before cont
cf00: 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63  inuing */.  winc
cf10: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
cf20: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
cf30: 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20  .  /* Since the 
cf40: 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d  names of named m
cf50: 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72  utexes, semaphor
cf60: 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  es, file mapping
cf70: 73 20 65 74 63 20 61 72 65 20 0a 20 20 2a 2a 20  s etc are .  ** 
cf80: 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20  case-sensitive, 
cf90: 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  take advantage o
cfa0: 66 20 74 68 61 74 20 62 79 20 75 70 70 65 72 63  f that by upperc
cfb0: 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20  asing the mutex 
cfc0: 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73  name.  ** and us
cfd0: 69 6e 67 20 74 68 61 74 20 61 73 20 74 68 65 20  ing that as the 
cfe0: 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69  shared filemappi
cff0: 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ng name..  */.  
d000: 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61  osCharUpperW(zNa
d010: 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53  me);.  pFile->hS
d020: 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65  hared = osCreate
d030: 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56  FileMappingW(INV
d040: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
d050: 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  E, 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: 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
d090: 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
d0a0: 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20  Lock),.         
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 20 7a                 z
d0d0: 4e 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53  Name);  ..  /* S
d0e0: 65 74 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  et a flag that i
d0f0: 6e 64 69 63 61 74 65 73 20 77 65 27 72 65 20 74  ndicates we're t
d100: 68 65 20 66 69 72 73 74 20 74 6f 20 63 72 65 61  he first to crea
d110: 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f  te the memory so
d120: 20 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62   it .  ** must b
d130: 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a  e zero-initializ
d140: 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72 6e  ed */.  lastErrn
d150: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
d160: 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73 74  or();.  if (last
d170: 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f 41  Errno == ERROR_A
d180: 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b 0a  LREADY_EXISTS){.
d190: 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c 53      bInit = FALS
d1a0: 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  E;.  }..  sqlite
d1b0: 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a  3_free(zName);..
d1c0: 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65    /* If we succe
d1d0: 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74  eded in making t
d1e0: 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
d1f0: 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e   handle, map it.
d200: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
d210: 3e 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20  >hShared ){.    
d220: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20  pFile->shared = 
d230: 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61  (winceLock*)osMa
d240: 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c  pViewOfFile(pFil
d250: 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20 20  e->hShared, .   
d260: 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d            FILE_M
d270: 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50  AP_READ|FILE_MAP
d280: 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69  _WRITE, 0, 0, si
d290: 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
d2a0: 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70  ;.    /* If mapp
d2b0: 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73  ing failed, clos
d2c0: 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  e the shared mem
d2d0: 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65  ory handle and e
d2e0: 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  rase it */.    i
d2f0: 66 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65  f( !pFile->share
d300: 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d ){.      pFile
d310: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
d320: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
d330: 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
d340: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  r(SQLITE_IOERR, 
d350: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d360: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d370: 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
d380: 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock2", zFilenam
d390: 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65  e);.      bLogge
d3a0: 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
d3b0: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
d3c0: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20  ile->hShared);. 
d3d0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61       pFile->hSha
d3e0: 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  red = NULL;.    
d3f0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  }.  }..  /* If s
d400: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75  hared memory cou
d410: 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65  ld not be create
d420: 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  d, then close th
d430: 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c  e mutex and fail
d440: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
d450: 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29  >hShared==NULL )
d460: 7b 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67  {.    if( !bLogg
d470: 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed ){.      pFil
d480: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
d490: 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
d4a0: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
d4b0: 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d  TE_IOERR, pFile-
d4c0: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
d4e0: 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22  inceCreateLock3"
d4f0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
d500: 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52      bLogged = TR
d510: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69  UE;.    }.    wi
d520: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
d530: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
d540: 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
d550: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
d560: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
d570: 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tex = NULL;.    
d580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
d590: 45 52 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ERR;.  }.  .  /*
d5a0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
d5b0: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66  shared memory if
d5c0: 20 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20   we're supposed 
d5d0: 74 6f 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69  to */.  if( bIni
d5e0: 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  t ){.    memset(
d5f0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30  pFile->shared, 0
d600: 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
d610: 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e  ck));.  }..  win
d620: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
d630: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
d640: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d650: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74  K;.}../*.** Dest
d660: 72 6f 79 20 74 68 65 20 70 61 72 74 20 6f 66 20  roy the part of 
d670: 77 69 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61  winFile that dea
d680: 6c 73 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f  ls with wince lo
d690: 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  cks.*/.static vo
d6a0: 69 64 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c  id winceDestroyL
d6b0: 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
d6c0: 6c 65 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65  le){.  if (pFile
d6d0: 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f  ->hMutex){.    /
d6e0: 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75  * Acquire the mu
d6f0: 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65  tex */.    wince
d700: 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
d710: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
d720: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
d730: 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64  ng blocks should
d740: 20 70 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74   probably assert
d750: 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20   in debug mode, 
d760: 62 75 74 20 74 68 65 79 0a 20 20 20 20 20 20 20  but they.       
d770: 61 72 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69  are to cleanup i
d780: 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73  n case any locks
d790: 20 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a   remained open *
d7a0: 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
d7b0: 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29  >local.nReaders)
d7c0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
d7d0: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
d7e0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  --;.    }.    if
d7f0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
d800: 52 65 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20  Reserved){.     
d810: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
d820: 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53  bReserved = FALS
d830: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  E;.    }.    if 
d840: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50  (pFile->local.bP
d850: 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70  ending){.      p
d860: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
d870: 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
d880: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
d890: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
d8a0: 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46  usive){.      pF
d8b0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78  ile->shared->bEx
d8c0: 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b  clusive = FALSE;
d8d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
d8e0: 65 2d 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20  e-reference and 
d8f0: 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f  close our copy o
d900: 66 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  f the shared mem
d910: 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ory handle */.  
d920: 20 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46    osUnmapViewOfF
d930: 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  ile(pFile->share
d940: 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48  d);.    osCloseH
d950: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68  andle(pFile->hSh
d960: 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  ared);..    /* D
d970: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75 74  one with the mut
d980: 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d  ex */.    winceM
d990: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
d9a0: 65 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20 20 0a  e->hMutex);    .
d9b0: 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
d9c0: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
d9d0: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
d9e0: 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  tex = NULL;.  }.
d9f0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70  }../* .** An imp
da00: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
da10: 68 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50  he LockFile() AP
da20: 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72  I of Windows for
da30: 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f   CE.*/.static BO
da40: 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  OL winceLockFile
da50: 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
da60: 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
da70: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  ileOffsetLow,.  
da80: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
da90: 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
daa0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
dab0: 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  LockLow,.  DWORD
dac0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
dad0: 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77  oLockHigh.){.  w
dae0: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
daf0: 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c  HANDLE_TO_WINFIL
db00: 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f  E(phFile);.  BOO
db10: 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53  L bReturn = FALS
db20: 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  E;..  UNUSED_PAR
db30: 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66  AMETER(dwFileOff
db40: 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53  setHigh);.  UNUS
db50: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75  ED_PARAMETER(nNu
db60: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
db70: 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21  kHigh);..  if (!
db80: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72  pFile->hMutex) r
db90: 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69  eturn TRUE;.  wi
dba0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
dbb0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
dbc0: 0a 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e  .  /* Wanting an
dbd0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f   exclusive lock?
dbe0: 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65   */.  if (dwFile
dbf0: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
dc00: 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
dc10: 0a 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62  .       && nNumb
dc20: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
dc30: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
dc40: 52 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69  RED_SIZE){.    i
dc50: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
dc60: 2d 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20  ->nReaders == 0 
dc70: 26 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  && pFile->shared
dc80: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
dc90: 30 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65  0){.       pFile
dca0: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
dcb0: 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20  sive = TRUE;.   
dcc0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
dcd0: 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52  .bExclusive = TR
dce0: 55 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75  UE;.       bRetu
dcf0: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
dd00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20  .  }..  /* Want 
dd10: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b  a read-only lock
dd20: 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
dd30: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
dd40: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
dd50: 5f 46 49 52 53 54 20 26 26 0a 20 20 20 20 20 20  _FIRST &&.      
dd60: 20 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79       nNumberOfBy
dd70: 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
dd80: 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
dd90: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
dda0: 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20  usive == 0){.   
ddb0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
ddc0: 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20  nReaders ++;.   
ddd0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
dde0: 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20  cal.nReaders == 
ddf0: 31 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  1){.        pFil
de00: 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
de10: 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  ers ++;.      }.
de20: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
de30: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
de40: 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e  .  /* Want a pen
de50: 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  ding lock? */.  
de60: 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
de70: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
de80: 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a  RD)PENDING_BYTE.
de90: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e             && nN
dea0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
deb0: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
dec0: 20 2f 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e   /* If no pendin
ded0: 67 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20  g lock has been 
dee0: 61 63 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61  acquired, then a
def0: 63 71 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20  cquire it */.   
df00: 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
df10: 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20  ed->bPending == 
df20: 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0) {.      pFile
df30: 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
df40: 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ng = TRUE;.     
df50: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50   pFile->local.bP
df60: 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20  ending = TRUE;. 
df70: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
df80: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
df90: 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65    /* Want a rese
dfa0: 72 76 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  rved lock? */.  
dfb0: 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
dfc0: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
dfd0: 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45  RD)RESERVED_BYTE
dfe0: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
dff0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
e000: 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
e010: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
e020: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
e030: 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69  = 0) {.      pFi
e040: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
e050: 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20  erved = TRUE;.  
e060: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
e070: 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55  .bReserved = TRU
e080: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
e090: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
e0a0: 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
e0b0: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
e0c0: 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
e0d0: 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a   bReturn;.}../*.
e0e0: 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
e0f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f  tion of the Unlo
e100: 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69  ckFile API of Wi
e110: 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a  ndows for CE.*/.
e120: 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
e130: 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c  eUnlockFile(.  L
e140: 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a  PHANDLE phFile,.
e150: 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
e160: 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
e170: 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67   dwFileOffsetHig
e180: 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  h,.  DWORD nNumb
e190: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
e1a0: 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
e1b0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
e1c0: 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69  lockHigh.){.  wi
e1d0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48  nFile *pFile = H
e1e0: 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
e1f0: 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c  (phFile);.  BOOL
e200: 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45   bReturn = FALSE
e210: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
e220: 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73  METER(dwFileOffs
e230: 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45  etHigh);.  UNUSE
e240: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d  D_PARAMETER(nNum
e250: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
e260: 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28  ckHigh);..  if (
e270: 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20  !pFile->hMutex) 
e280: 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77  return TRUE;.  w
e290: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
e2a0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
e2b0: 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  ..  /* Releasing
e2c0: 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f   a reader lock o
e2d0: 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
e2e0: 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46  ock */.  if (dwF
e2f0: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
e300: 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
e310: 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64  RST){.    /* Did
e320: 20 77 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c   we have an excl
e330: 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  usive lock? */. 
e340: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
e350: 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b  cal.bExclusive){
e360: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e  .      assert(nN
e370: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
e380: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  lockLow == (DWOR
e390: 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a  D)SHARED_SIZE);.
e3a0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
e3b0: 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  al.bExclusive = 
e3c0: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
e3d0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
e3e0: 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
e3f0: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
e400: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  TRUE;.    }..   
e410: 20 2f 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20   /* Did we just 
e420: 68 61 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f  have a reader lo
e430: 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  ck? */.    else 
e440: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
e450: 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20  .nReaders){.    
e460: 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72    assert(nNumber
e470: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
e480: 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
e490: 52 45 44 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  RED_SIZE.       
e4a0: 20 20 20 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72        || nNumber
e4b0: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
e4c0: 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20  ow == 1);.      
e4d0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
e4e0: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20  aders --;.      
e4f0: 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
e500: 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a  .nReaders == 0).
e510: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
e520: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
e530: 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20  Readers --;.    
e540: 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72    }.      bRetur
e550: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
e560: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73    }..  /* Releas
e570: 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  ing a pending lo
e580: 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  ck */.  else if 
e590: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
e5a0: 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49   == (DWORD)PENDI
e5b0: 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  NG_BYTE.        
e5c0: 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
e5d0: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
e5e0: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
e5f0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
e600: 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69  ding){.      pFi
e610: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
e620: 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
e630: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
e640: 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  >bPending = FALS
e650: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
e660: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
e670: 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e   }.  /* Releasin
e680: 67 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  g a reserved loc
e690: 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  k */.  else if (
e6a0: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
e6b0: 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56  == (DWORD)RESERV
e6c0: 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  ED_BYTE.        
e6d0: 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
e6e0: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
e6f0: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
e700: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
e710: 65 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70  erved) {.      p
e720: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73  File->local.bRes
e730: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
e740: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
e750: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
e760: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
e770: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
e780: 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
e790: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
e7a0: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
e7b0: 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
e7c0: 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  /*.** End of the
e7d0: 20 73 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f   special code fo
e7e0: 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a  r 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 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  *****/.#endif /*
e840: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
e850: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20   */../*.** Lock 
e860: 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a  a file region..*
e870: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
e880: 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  nLockFile(.  LPH
e890: 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
e8a0: 44 57 4f 52 44 20 66 6c 61 67 73 2c 0a 20 20 44  DWORD flags,.  D
e8b0: 57 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a  WORD offsetLow,.
e8c0: 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69    DWORD offsetHi
e8d0: 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42  gh,.  DWORD numB
e8e0: 79 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  ytesLow,.  DWORD
e8f0: 20 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b   numBytesHigh.){
e900: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
e910: 49 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e  INCE.  /*.  ** N
e920: 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20  OTE: Windows CE 
e930: 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65  is handled diffe
e940: 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20  rently here due 
e950: 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20  its lack of the 
e960: 57 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20  Win32.  **      
e970: 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20   API LockFile.. 
e980: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e   */.  return win
e990: 63 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c  ceLockFile(phFil
e9a0: 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66  e, offsetLow, of
e9b0: 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20  fsetHigh,.      
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9d0: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
e9e0: 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c  mBytesHigh);.#el
e9f0: 73 65 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  se.  if( isNT() 
ea00: 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
ea10: 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73  D ovlp;.    mems
ea20: 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
ea30: 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
ea40: 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
ea50: 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20  t = offsetLow;. 
ea60: 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69     ovlp.OffsetHi
ea70: 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b  gh = offsetHigh;
ea80: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f  .    return osLo
ea90: 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65  ckFileEx(*phFile
eaa0: 2c 20 66 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42  , flags, 0, numB
eab0: 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65  ytesLow, numByte
eac0: 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20  sHigh, &ovlp);. 
ead0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
eae0: 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70  rn osLockFile(*p
eaf0: 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77  hFile, offsetLow
eb00: 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75  , offsetHigh, nu
eb10: 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20  mBytesLow,.     
eb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb30: 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
eb40: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
eb50: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c  .** Unlock a fil
eb60: 65 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74  e region.. */.st
eb70: 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c  atic BOOL winUnl
eb80: 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
eb90: 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
eba0: 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20  ORD offsetLow,. 
ebb0: 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67   DWORD offsetHig
ebc0: 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  h,.  DWORD numBy
ebd0: 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  tesLow,.  DWORD 
ebe0: 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a  numBytesHigh.){.
ebf0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
ec00: 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f  NCE.  /*.  ** NO
ec10: 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69  TE: Windows CE i
ec20: 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72  s handled differ
ec30: 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69  ently here due i
ec40: 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57  ts lack of the W
ec50: 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20  in32.  **       
ec60: 41 50 49 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a  API UnlockFile..
ec70: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69    */.  return wi
ec80: 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68  nceUnlockFile(ph
ec90: 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
eca0: 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 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 20 6e 75 6d 42 79 74 65 73 4c 6f        numBytesLo
ecd0: 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29  w, numBytesHigh)
ece0: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 69 73  ;.#else.  if( is
ecf0: 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52  NT() ){.    OVER
ed00: 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20  LAPPED ovlp;.   
ed10: 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30   memset(&ovlp, 0
ed20: 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50  , sizeof(OVERLAP
ed30: 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e  PED));.    ovlp.
ed40: 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c  Offset = offsetL
ed50: 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ow;.    ovlp.Off
ed60: 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74  setHigh = offset
ed70: 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e  High;.    return
ed80: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28   osUnlockFileEx(
ed90: 2a 70 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42  *phFile, 0, numB
eda0: 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65  ytesLow, numByte
edb0: 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20  sHigh, &ovlp);. 
edc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
edd0: 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28  rn osUnlockFile(
ede0: 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c  *phFile, offsetL
edf0: 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20  ow, offsetHigh, 
ee00: 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20  numBytesLow,.   
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee20: 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67       numBytesHig
ee30: 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  h);.  }.#endif.}
ee40: 0a 0a 2f 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 2a  ****************
ee90: 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f  .** The next gro
eea0: 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 69  up of routines i
eeb0: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f  mplement the I/O
eec0: 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66 69   methods specifi
eed0: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71 6c  ed.** by the sql
eee0: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
eef0: 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a  object..********
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 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ******/../*.** S
ef50: 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f  ome Microsoft co
ef60: 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69  mpilers lack thi
ef70: 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f  s definition..*/
ef80: 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44  .#ifndef INVALID
ef90: 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
efa0: 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c  R.# define INVAL
efb0: 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
efc0: 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29 0a  TER ((DWORD)-1).
efd0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  #endif../*.** Mo
efe0: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ve the current p
eff0: 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  osition of the f
f000: 69 6c 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65  ile handle passe
f010: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a  d as the first .
f020: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f  ** argument to o
f030: 66 66 73 65 74 20 69 4f 66 66 73 65 74 20 77 69  ffset iOffset wi
f040: 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 49  thin the file. I
f050: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
f060: 74 75 72 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68 65  turn 0. .** Othe
f070: 72 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65  rwise, set pFile
f080: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20  ->lastErrno and 
f090: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
f0a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
f0b0: 65 65 6b 57 69 6e 46 69 6c 65 28 77 69 6e 46 69  eekWinFile(winFi
f0c0: 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74  le *pFile, sqlit
f0d0: 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74  e3_int64 iOffset
f0e0: 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  ){.#if !SQLITE_O
f0f0: 53 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75  S_WINRT.  LONG u
f100: 70 70 65 72 42 69 74 73 3b 20 20 20 20 20 20 20  pperBits;       
f110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73            /* Mos
f120: 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f  t sig. 32 bits o
f130: 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a  f new offset */.
f140: 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73    LONG lowerBits
f150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f160: 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20    /* Least sig. 
f170: 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f  32 bits of new o
f180: 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44  ffset */.  DWORD
f190: 20 64 77 52 65 74 3b 20 20 20 20 20 20 20 20 20   dwRet;         
f1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
f1b0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
f1c0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29  SetFilePointer()
f1d0: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
f1e0: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
f1f0: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
f200: 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
f210: 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20  stError() */..  
f220: 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e  upperBits = (LON
f230: 47 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29  G)((iOffset>>32)
f240: 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
f250: 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c    lowerBits = (L
f260: 4f 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20 30  ONG)(iOffset & 0
f270: 78 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f  xffffffff);..  /
f280: 2a 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66  * API oddity: If
f290: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74   successful, Set
f2a0: 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65  FilePointer() re
f2b0: 74 75 72 6e 73 20 61 20 64 77 6f 72 64 20 0a 20  turns a dword . 
f2c0: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
f2d0: 68 65 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73  he lower 32-bits
f2e0: 20 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65   of the new file
f2f0: 2d 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20  -offset. Or, if 
f300: 69 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69  it fails,.  ** i
f310: 74 20 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49  t returns INVALI
f320: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
f330: 45 52 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f  ER. However acco
f340: 72 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a  rding to MSDN, .
f350: 20 20 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54    ** INVALID_SET
f360: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61  _FILE_POINTER ma
f370: 79 20 61 6c 73 6f 20 62 65 20 61 20 76 61 6c 69  y also be a vali
f380: 64 20 6e 65 77 20 6f 66 66 73 65 74 2e 20 53 6f  d new offset. So
f390: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20   to determine . 
f3a0: 20 2a 2a 20 77 68 65 74 68 65 72 20 61 6e 20 65   ** whether an e
f3b0: 72 72 6f 72 20 68 61 73 20 61 63 74 75 61 6c 6c  rror has actuall
f3c0: 79 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20 69  y occurred, it i
f3d0: 73 20 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79  s also necessary
f3e0: 20 74 6f 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47   to call .  ** G
f3f0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a 20  etLastError().. 
f400: 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f 73   */.  dwRet = os
f410: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70  SetFilePointer(p
f420: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69  File->h, lowerBi
f430: 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20  ts, &upperBits, 
f440: 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20  FILE_BEGIN);..  
f450: 69 66 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41  if( (dwRet==INVA
f460: 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
f470: 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20 28 28  NTER.      && ((
f480: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
f490: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e  tLastError())!=N
f4a0: 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20  O_ERROR)) ){.   
f4b0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f4c0: 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
f4d0: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
f4e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
f4f0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
f500: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
f510: 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20   "seekWinFile", 
f520: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
f530: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
f540: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ..  return 0;.#e
f550: 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61  lse.  /*.  ** Sa
f560: 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65 78 63  me as above, exc
f570: 65 70 74 20 74 68 61 74 20 74 68 69 73 20 69 6d  ept that this im
f580: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72  plementation wor
f590: 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20  ks for WinRT..  
f5a0: 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45  */..  LARGE_INTE
f5b0: 47 45 52 20 78 3b 20 20 20 20 20 20 20 20 20 20  GER x;          
f5c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
f5d0: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f   offset */.  BOO
f5e0: 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20 20 20  L bRet;         
f5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f600: 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
f610: 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  y SetFilePointer
f620: 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61  Ex() */..  x.Qua
f630: 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b  dPart = iOffset;
f640: 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46  .  bRet = osSetF
f650: 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69  ilePointerEx(pFi
f660: 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c  le->h, x, 0, FIL
f670: 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28  E_BEGIN);..  if(
f680: 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c  !bRet){.    pFil
f690: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
f6a0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
f6b0: 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
f6c0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  (SQLITE_IOERR_SE
f6d0: 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  EK, pFile->lastE
f6e0: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
f6f0: 20 20 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22     "seekWinFile"
f700: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
f710: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
f720: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   }..  return 0;.
f730: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
f740: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a  Close a file..**
f750: 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74  .** It is report
f760: 65 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d  ed that an attem
f770: 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61  pt to close a ha
f780: 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74  ndle might somet
f790: 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54  imes.** fail.  T
f7a0: 68 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e  his is a very un
f7b0: 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c  reasonable resul
f7c0: 74 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69  t, but Windows i
f7d0: 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66  s notorious.** f
f7e0: 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f  or being unreaso
f7f0: 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f  nable so I do no
f800: 74 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20  t doubt that it 
f810: 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49  might happen.  I
f820: 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66  f.** the close f
f830: 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66  ails, we pause f
f840: 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f  or 100 milliseco
f850: 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69  nds and try agai
f860: 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61  n.  As.** many a
f870: 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  s MX_CLOSE_ATTEM
f880: 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63  PT attempts to c
f890: 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20  lose the handle 
f8a0: 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a  are made before.
f8b0: 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64  ** giving up and
f8c0: 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   returning an er
f8d0: 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ror..*/.#define 
f8e0: 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
f8f0: 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69   3.static int wi
f900: 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  nClose(sqlite3_f
f910: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
f920: 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77  rc, cnt = 0;.  w
f930: 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
f940: 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  (winFile*)id;.. 
f950: 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
f960: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
f970: 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65  _OMIT_WAL.  asse
f980: 72 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d  rt( pFile->pShm=
f990: 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 4f  =0 );.#endif.  O
f9a0: 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25  STRACE(("CLOSE %
f9b0: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  d\n", pFile->h))
f9c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
f9d0: 65 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46  e->h!=NULL && pF
f9e0: 69 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f  ile->h!=INVALID_
f9f0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
fa00: 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f    do{.    rc = o
fa10: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
fa20: 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53  le->h);.    /* S
fa30: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
fa40: 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f  rc=0; cnt=MX_CLO
fa50: 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a  SE_ATTEMPT; ); *
fa60: 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  /.  }while( rc==
fa70: 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f  0 && ++cnt < MX_
fa80: 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26  CLOSE_ATTEMPT &&
fa90: 20 28 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   (sqlite3_win32_
faa0: 73 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29  sleep(100), 1) )
fab0: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
fac0: 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49  WINCE.#define WI
fad0: 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54  NCE_DELETION_ATT
fae0: 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44  EMPTS 3.  winceD
faf0: 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65  estroyLock(pFile
fb00: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
fb10: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29  zDeleteOnClose )
fb20: 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
fb30: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20  0;.    while(.  
fb40: 20 20 20 20 20 20 20 20 20 6f 73 44 65 6c 65 74           osDelet
fb50: 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44  eFileW(pFile->zD
fb60: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30  eleteOnClose)==0
fb70: 0a 20 20 20 20 20 20 20 20 26 26 20 6f 73 47 65  .        && osGe
fb80: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
fb90: 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
fba0: 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66  nClose)!=0xfffff
fbb0: 66 66 66 20 0a 20 20 20 20 20 20 20 20 26 26 20  fff .        && 
fbc0: 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45  cnt++ < WINCE_DE
fbd0: 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a  LETION_ATTEMPTS.
fbe0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
fbf0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
fc00: 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74  p(100);  /* Wait
fc10: 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65   a little before
fc20: 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f   trying again */
fc30: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
fc40: 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a  e3_free(pFile->z
fc50: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a  DeleteOnClose);.
fc60: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54    }.#endif.  OST
fc70: 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 20  RACE(("CLOSE %d 
fc80: 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
fc90: 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61   rc ? "ok" : "fa
fca0: 69 6c 65 64 22 29 29 3b 0a 20 20 69 66 28 20 72  iled"));.  if( r
fcb0: 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
fcc0: 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20  h = NULL;.  }.  
fcd0: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
fce0: 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53  .  return rc ? S
fcf0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
fd00: 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72       : winLogErr
fd10: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
fd20: 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74  CLOSE, osGetLast
fd30: 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd50: 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70     "winClose", p
fd60: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a  File->zPath);.}.
fd70: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
fd80: 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
fd90: 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
fda0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
fdb0: 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
fdc0: 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
fdd0: 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
fde0: 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
fdf0: 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
fe00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
fe10: 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  inRead(.  sqlite
fe20: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
fe30: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
fe40: 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76  read from */.  v
fe50: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
fe60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
fe70: 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  te content into 
fe80: 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
fe90: 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
feb0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
fec0: 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69  o read */.  sqli
fed0: 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
fee0: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
fef0: 72 65 61 64 69 6e 67 20 61 74 20 74 68 69 73 20  reading at this 
ff00: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66  offset */.){.#if
ff10: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
ff20: 45 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f  E.  OVERLAPPED o
ff30: 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20  verlapped;      
ff40: 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65      /* The offse
ff50: 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20  t for ReadFile. 
ff60: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46  */.#endif.  winF
ff70: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
ff80: 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66  nFile*)id;  /* f
ff90: 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
ffa0: 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20  DWORD nRead;    
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffc0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
ffd0: 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
ffe0: 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20   from file */.  
fff0: 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
10000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10010 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
10020 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  rys */..  assert
10030 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d  ( id!=0 );.  Sim
10040 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
10050 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
10060 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43  _READ);.  OSTRAC
10070 45 28 28 22 52 45 41 44 20 25 64 20 6c 6f 63 6b  E(("READ %d lock
10080 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
10090 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
100a0 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  e));..#if SQLITE
100b0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20  _OS_WINCE.  if( 
100c0 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c  seekWinFile(pFil
100d0 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20  e, offset) ){.  
100e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
100f0 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  FULL;.  }.  whil
10100 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70  e( !osReadFile(p
10110 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61  File->h, pBuf, a
10120 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29  mt, &nRead, 0) )
10130 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74  {.#else.  memset
10140 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c  (&overlapped, 0,
10150 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50   sizeof(OVERLAPP
10160 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70  ED));.  overlapp
10170 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e  ed.Offset = (LON
10180 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66  G)(offset & 0xff
10190 66 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c  ffffff);.  overl
101a0 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
101b0 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
101c0 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
101d0 66 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  fff);.  while( !
101e0 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65  osReadFile(pFile
101f0 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
10200 26 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70  &nRead, &overlap
10210 70 65 64 29 20 26 26 0a 20 20 20 20 20 20 20 20  ped) &&.        
10220 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
10230 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  )!=ERROR_HANDLE_
10240 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20  EOF ){.#endif.  
10250 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
10260 6f 3b 0a 20 20 20 20 69 66 28 20 72 65 74 72 79  o;.    if( retry
10270 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26  Ioerr(&nRetry, &
10280 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e  lastErrno) ) con
10290 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c 65  tinue;.    pFile
102a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
102b0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74  stErrno;.    ret
102c0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
102d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
102e0 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  D, pFile->lastEr
102f0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
10300 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69    "winRead", pFi
10310 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
10320 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72    logIoerr(nRetr
10330 79 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c  y);.  if( nRead<
10340 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20  (DWORD)amt ){.  
10350 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
10360 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
10370 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
10380 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
10390 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
103a0 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d  [nRead], 0, amt-
103b0 6e 52 65 61 64 29 3b 0a 20 20 20 20 72 65 74 75  nRead);.    retu
103c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
103d0 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
103e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
103f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  _OK;.}../*.** Wr
10400 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
10410 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
10420 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
10430 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
10440 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
10450 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
10460 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
10470 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28  ic int winWrite(
10480 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
10490 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *id,            
104a0 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72     /* File to wr
104b0 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f  ite into */.  co
104c0 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
104e0 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 65   The bytes to be
104f0 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
10500 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
10510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10520 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
10530 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73   to write */.  s
10540 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
10550 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  set            /
10560 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  * Offset into th
10570 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20  e file to begin 
10580 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b  writing at */.){
10590 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
105a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
105b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72     /* True if er
105c0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
105d0 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a  , else false */.
105e0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
105f0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
10600 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
10610 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79   */.  int nRetry
10620 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10630 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10640 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20  of retries */.. 
10650 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
10660 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
10670 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
10680 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
10690 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
106a0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73  );.  SimulateDis
106b0 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72  kfullError(retur
106c0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a  n SQLITE_FULL);.
106d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
106e0 54 45 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22  TE %d lock=%d\n"
106f0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  , pFile->h, pFil
10700 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a  e->locktype));..
10710 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
10720 4e 43 45 0a 20 20 72 63 20 3d 20 73 65 65 6b 57  NCE.  rc = seekW
10730 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66  inFile(pFile, of
10740 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
10750 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a  =0 ){.#else.  {.
10760 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49  #endif.#if !SQLI
10770 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
10780 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c  OVERLAPPED overl
10790 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  apped;        /*
107a0 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20   The offset for 
107b0 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65  WriteFile. */.#e
107c0 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61 52 65  ndif.    u8 *aRe
107d0 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20  m = (u8 *)pBuf; 
107e0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79         /* Data y
107f0 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  et to be written
10800 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d   */.    int nRem
10810 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20   = amt;         
10820 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10830 6f 66 20 62 79 74 65 73 20 79 65 74 20 74 6f 20  of bytes yet to 
10840 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
10850 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20    DWORD nWrite; 
10860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10870 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74 65 6e  /* Bytes written
10880 20 62 79 20 65 61 63 68 20 57 72 69 74 65 46 69   by each WriteFi
10890 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20  le() call */.   
108a0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
108b0 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f   = NO_ERROR;   /
108c0 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
108d0 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72   by GetLastError
108e0 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49  () */..#if !SQLI
108f0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
10900 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70  memset(&overlapp
10910 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  ed, 0, sizeof(OV
10920 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20  ERLAPPED));.    
10930 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
10940 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
10950 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
10960 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e  .    overlapped.
10970 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f  OffsetHigh = (LO
10980 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29  NG)((offset>>32)
10990 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
109a0 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c  #endif..    whil
109b0 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66  e( nRem>0 ){.#if
109c0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
109d0 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72  .      if( !osWr
109e0 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  iteFile(pFile->h
109f0 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e  , aRem, nRem, &n
10a00 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c  Write, 0) ){.#el
10a10 73 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  se.      if( !os
10a20 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
10a30 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20  >h, aRem, nRem, 
10a40 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c 61  &nWrite, &overla
10a50 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a  pped) ){.#endif.
10a60 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72          if( retr
10a70 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20  yIoerr(&nRetry, 
10a80 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f  &lastErrno) ) co
10a90 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
10aa0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
10ab0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 57 72       assert( nWr
10ac0 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65  ite==0 || nWrite
10ad0 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 3b  <=(DWORD)nRem );
10ae0 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74  .      if( nWrit
10af0 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3e 28  e==0 || nWrite>(
10b00 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a 20 20  DWORD)nRem ){.  
10b10 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
10b20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
10b30 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ();.        brea
10b40 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21  k;.      }.#if !
10b50 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
10b60 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
10b70 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f 76  nWrite;.      ov
10b80 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20  erlapped.Offset 
10b90 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20  = (LONG)(offset 
10ba0 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
10bb0 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e       overlapped.
10bc0 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f  OffsetHigh = (LO
10bd0 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29  NG)((offset>>32)
10be0 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
10bf0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52 65  #endif.      aRe
10c00 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  m += nWrite;.   
10c10 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74     nRem -= nWrit
10c20 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
10c30 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20   nRem>0 ){.     
10c40 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10c50 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
10c60 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
10c70 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
10c80 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28 20   ){.    if(   ( 
10c90 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
10ca0 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44  ==ERROR_HANDLE_D
10cb0 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20  ISK_FULL ).     
10cc0 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61    || ( pFile->la
10cd0 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44  stErrno==ERROR_D
10ce0 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20  ISK_FULL )){.   
10cf0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10d00 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  _FULL;.    }.   
10d10 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
10d20 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
10d30 5f 57 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  _WRITE, pFile->l
10d40 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
10d50 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65         "winWrite
10d60 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
10d70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c  ;.  }else{.    l
10d80 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b  ogIoerr(nRetry);
10d90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
10da0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
10db0 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
10dc0 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
10dd0 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
10de0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75  tatic int winTru
10df0 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
10e00 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
10e10 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  int64 nByte){.  
10e20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
10e30 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
10e40 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f  /* File handle o
10e50 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
10e60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
10e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
10e80 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68  turn code for th
10e90 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  is function */..
10ea0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
10eb0 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
10ec0 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c 64  TRUNCATE %d %lld
10ed0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e  \n", pFile->h, n
10ee0 42 79 74 65 29 29 3b 0a 20 20 53 69 6d 75 6c 61  Byte));.  Simula
10ef0 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
10f00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
10f10 55 4e 43 41 54 45 29 3b 0a 0a 20 20 2f 2a 20 49  UNCATE);..  /* I
10f20 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
10f30 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
10f40 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
10f50 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
10f60 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
10f70 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
10f80 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
10f90 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
10fa0 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
10fb0 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
10fc0 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
10fd0 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
10fe0 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
10ff0 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
11000 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
11010 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
11020 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
11030 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
11040 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
11050 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
11060 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
11070 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69  .  /* SetEndOfFi
11080 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e  le() returns non
11090 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63 63 65  -zero when succe
110a0 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77  ssful, or zero w
110b0 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f  hen it fails. */
110c0 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e 46 69  .  if( seekWinFi
110d0 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29  le(pFile, nByte)
110e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
110f0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
11100 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
11110 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11120 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
11130 77 69 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70  winTruncate1", p
11140 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
11150 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73 53  }else if( 0==osS
11160 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c  etEndOfFile(pFil
11170 65 2d 3e 68 29 20 29 7b 0a 20 20 20 20 70 46 69  e->h) ){.    pFi
11180 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
11190 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
111a0 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  ;.    rc = winLo
111b0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
111c0 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46  ERR_TRUNCATE, pF
111d0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
111e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
111f0 6e 54 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69  nTruncate2", pFi
11200 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
11210 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55  .  OSTRACE(("TRU
11220 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 20 25 73  NCATE %d %lld %s
11230 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e  \n", pFile->h, n
11240 42 79 74 65 2c 20 72 63 20 3f 20 22 66 61 69 6c  Byte, rc ? "fail
11250 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20  ed" : "ok"));.  
11260 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
11270 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
11280 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
11290 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73   number of fulls
112a0 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  yncs and normal 
112b0 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20  syncs.  This is 
112c0 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  used to test.** 
112d0 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66  that syncs and f
112e0 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63  ullsyncs are occ
112f0 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  uring at the rig
11300 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
11310 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
11320 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
11330 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
11340 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
11350 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
11360 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
11370 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
11380 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
11390 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  o disk..*/.stati
113a0 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71  c int winSync(sq
113b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
113c0 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e  int flags){.#ifn
113d0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
113e0 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65  NC.  /*.  ** Use
113f0 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49  d only when SQLI
11400 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f  TE_NO_SYNC is no
11410 74 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f  t defined..   */
11420 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64  .  BOOL rc;.#end
11430 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
11440 4e 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69  NDEBUG) || !defi
11450 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ned(SQLITE_NO_SY
11460 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65  NC) || \.    (de
11470 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
11480 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  T) && defined(SQ
11490 4c 49 54 45 5f 44 45 42 55 47 29 29 0a 20 20 2f  LITE_DEBUG)).  /
114a0 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e  *.  ** Used when
114b0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
114c0 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61  is not defined a
114d0 6e 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74  nd by the assert
114e0 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f  () and/or.  ** O
114f0 53 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e  STRACE() macros.
11500 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  .   */.  winFile
11510 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
11520 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20  le*)id;.#else.  
11530 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
11540 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  (id);.#endif..  
11550 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11560 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
11570 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
11580 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
11590 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
115a0 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
115b0 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
115c0 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
115d0 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
115e0 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
115f0 4c 4c 0a 20 20 29 3b 0a 0a 20 20 4f 53 54 52 41  LL.  );..  OSTRA
11600 43 45 28 28 22 53 59 4e 43 20 25 64 20 6c 6f 63  CE(("SYNC %d loc
11610 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
11620 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
11630 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78  pe));..  /* Unix
11640 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d   cannot, but som
11650 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65  e systems may re
11660 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
11670 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73   from here. This
11680 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f  .  ** line is to
11690 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67   test that doing
116a0 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75   so does not cau
116b0 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
116c0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
116d0 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72  DiskfullError( r
116e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
116f0 4c 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  L );..#ifndef SQ
11700 4c 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55 53  LITE_TEST.  UNUS
11710 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61  ED_PARAMETER(fla
11720 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  gs);.#else.  if(
11730 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
11740 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20  QLITE_SYNC_FULL 
11750 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
11760 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  ullsync_count++;
11770 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
11780 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
11790 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  dif..  /* If we 
117a0 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68  compiled with th
117b0 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
117c0 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63   flag, then sync
117d0 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f  ing is a.  ** no
117e0 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  -op.  */.#ifdef 
117f0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
11800 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11810 4b 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20  K;.#else.  rc = 
11820 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65  osFlushFileBuffe
11830 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  rs(pFile->h);.  
11840 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
11850 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69   rc=FALSE );.  i
11860 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
11870 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11880 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
11890 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
118a0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
118b0 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
118c0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
118d0 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c  OERR_FSYNC, pFil
118e0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
118f0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
11900 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
11910 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  th);.  }.#endif.
11920 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
11930 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ne the current s
11940 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
11950 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63   bytes.*/.static
11960 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65   int winFileSize
11970 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11980 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
11990 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46   *pSize){.  winF
119a0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
119b0 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  nFile*)id;.  int
119c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
119d0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
119e0 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
119f0 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
11a00 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
11a10 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
11a20 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20 46  _WINRT.  {.    F
11a30 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49 4e 46  ILE_STANDARD_INF
11a40 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20  O info;.    if( 
11a50 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  osGetFileInforma
11a60 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 28 70  tionByHandleEx(p
11a70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53 74 61  File->h, FileSta
11a80 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20 20 20  ndardInfo,.     
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 20 20 20                  
11ab0 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  &info, sizeof(in
11ac0 66 6f 29 29 20 29 7b 0a 20 20 20 20 20 20 2a 70  fo)) ){.      *p
11ad0 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f  Size = info.EndO
11ae0 66 46 69 6c 65 2e 51 75 61 64 50 61 72 74 3b 0a  fFile.QuadPart;.
11af0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11b00 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11b10 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
11b20 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
11b30 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
11b40 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c  ITE_IOERR_FSTAT,
11b50 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11b60 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
11b70 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69            "winFi
11b80 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e  leSize", pFile->
11b90 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
11ba0 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20  }.#else.  {.    
11bb0 44 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 3b  DWORD upperBits;
11bc0 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f 77 65 72  .    DWORD lower
11bd0 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20  Bits;.    DWORD 
11be0 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 20 20  lastErrno;..    
11bf0 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73 47 65  lowerBits = osGe
11c00 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d  tFileSize(pFile-
11c10 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b  >h, &upperBits);
11c20 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 28 28  .    *pSize = ((
11c30 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 75  (sqlite3_int64)u
11c40 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b  pperBits)<<32) +
11c50 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20   lowerBits;.    
11c60 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73  if(   (lowerBits
11c70 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45   == INVALID_FILE
11c80 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20 26 26  _SIZE).       &&
11c90 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f   ((lastErrno = o
11ca0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
11cb0 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20  !=NO_ERROR) ){. 
11cc0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11cd0 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
11ce0 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  o;.      rc = wi
11cf0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
11d00 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46  _IOERR_FSTAT, pF
11d10 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
11d30 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c  nFileSize", pFil
11d40 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
11d50 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
11d60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11d70 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  * LOCKFILE_FAIL_
11d80 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75  IMMEDIATELY is u
11d90 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65  ndefined on some
11da0 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   Windows systems
11db0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43  ..*/.#ifndef LOC
11dc0 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
11dd0 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20  IATELY.# define 
11de0 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
11df0 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64  MEDIATELY 1.#end
11e00 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b  if..#ifndef LOCK
11e10 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
11e20 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43  OCK.# define LOC
11e30 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
11e40 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a 2f  LOCK 2.#endif../
11e50 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 6c  *.** Historicall
11e60 79 2c 20 53 51 4c 69 74 65 20 68 61 73 20 75 73  y, SQLite has us
11e70 65 64 20 62 6f 74 68 20 74 68 65 20 4c 6f 63 6b  ed both the Lock
11e80 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69 6c  File and LockFil
11e90 65 45 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  eEx functions..*
11ea0 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b 46  * When the LockF
11eb0 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  ile function was
11ec0 20 75 73 65 64 2c 20 69 74 20 77 61 73 20 61 6c   used, it was al
11ed0 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f  ways expected to
11ee0 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61   fail.** immedia
11ef0 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  tely if the lock
11f00 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f 62   could not be ob
11f10 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20 69  tained.  Also, i
11f20 74 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65  t always expecte
11f30 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20 61  d to.** obtain a
11f40 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
11f50 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 61  .  These flags a
11f60 72 65 20 75 73 65 64 20 77 69 74 68 20 74 68 65  re used with the
11f70 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63   LockFileEx func
11f80 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66 6c  tion.** and refl
11f90 65 63 74 20 74 68 6f 73 65 20 65 78 70 65 63 74  ect those expect
11fa0 61 74 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f 72  ations; therefor
11fb0 65 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20 6e  e, they should n
11fc0 6f 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a  ot be changed..*
11fd0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11fe0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 0a  _LOCKFILE_FLAGS.
11ff0 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
12000 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20 20  LOCKFILE_FLAGS  
12010 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f   (LOCKFILE_FAIL_
12020 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c 0a  IMMEDIATELY | \.
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 20                  
12050 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55    LOCKFILE_EXCLU
12060 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69  SIVE_LOCK).#endi
12070 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e 74  f../*.** Current
12080 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65 76 65 72  ly, SQLite never
12090 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b 46   calls the LockF
120a0 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 20 77  ileEx function w
120b0 69 74 68 6f 75 74 20 77 61 6e 74 69 6e 67 20 74  ithout wanting t
120c0 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 61  he.** call to fa
120d0 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  il immediately i
120e0 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
120f0 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a  t be obtained..*
12100 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
12110 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47  _LOCKFILEEX_FLAG
12120 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
12130 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41  E_LOCKFILEEX_FLA
12140 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  GS (LOCKFILE_FAI
12150 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a 23  L_IMMEDIATELY).#
12160 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  endif../*.** Acq
12170 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f  uire a reader lo
12180 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74  ck..** Different
12190 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72   API routines ar
121a0 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69  e called dependi
121b0 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
121c0 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20   not this.** is 
121d0 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a  Win9x or WinNT..
121e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
121f0 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c  tReadLock(winFil
12200 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
12210 20 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54   res;.  if( isNT
12220 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
12230 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a  _OS_WINCE.    /*
12240 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  .    ** NOTE: Wi
12250 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
12260 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
12270 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
12280 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
12290 20 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20     **       API 
122a0 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20  LockFileEx..    
122b0 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  */.    res = win
122c0 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  ceLockFile(&pFil
122d0 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
122e0 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65  ST, 0, 1, 0);.#e
122f0 6c 73 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69  lse.    res = wi
12300 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
12310 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
12320 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48  FILEEX_FLAGS, SH
12330 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20  ARED_FIRST, 0,. 
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12350 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
12360 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 0);.#endif.  }
12370 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
12380 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
12390 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b  else{.    int lk
123a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
123b0 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28  ndomness(sizeof(
123c0 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70  lk), &lk);.    p
123d0 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
123e0 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28  Byte = (short)((
123f0 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29  lk & 0x7fffffff)
12400 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
12410 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  1));.    res = w
12420 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
12430 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
12440 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20  KFILE_FLAGS,.   
12450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12460 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
12470 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
12480 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
12490 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
124a0 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20  ( res == 0 ){.  
124b0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
124c0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
124d0 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f  ror();.    /* No
124e0 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66   need to log a f
124f0 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a  ailure to lock *
12500 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  /.  }.  return r
12510 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64  es;.}../*.** Und
12520 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a  o a readlock.*/.
12530 73 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63  static int unloc
12540 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c  kReadLock(winFil
12550 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
12560 20 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61   res;.  DWORD la
12570 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 69  stErrno;.  if( i
12580 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73  sNT() ){.    res
12590 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65   = winUnlockFile
125a0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
125b0 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
125c0 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
125d0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
125e0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
125f0 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d   else{.    res =
12600 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
12610 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
12620 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68  _FIRST+pFile->sh
12630 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c  aredLockByte, 0,
12640 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   1, 0);.  }.#end
12650 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  if.  if( res==0 
12660 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
12670 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
12680 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f  ))!=ERROR_NOT_LO
12690 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46 69  CKED) ){.    pFi
126a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
126b0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
126c0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
126d0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20  E_IOERR_UNLOCK, 
126e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
126f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
12700 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c  unlockReadLock",
12710 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
12720 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
12730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
12740 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
12750 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
12760 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f   by parameter lo
12770 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20  cktype - one.** 
12780 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
12790 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
127a0 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
127b0 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
127c0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
127d0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
127e0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
127f0 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
12800 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
12810 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
12820 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
12830 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
12840 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
12850 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
12860 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
12870 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
12880 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
12890 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
128a0 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
128b0 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
128c0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
128d0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
128e0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
128f0 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
12900 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
12910 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
12920 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
12930 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
12940 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
12950 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
12960 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
12970 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
12980 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
12990 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
129a0 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
129b0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
129c0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
129d0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
129e0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
129f0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
12a00 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
12a10 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c  ock.  The winUnl
12a20 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a  ock() routine.**
12a30 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b   erases all lock
12a40 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65  s at once and re
12a50 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61  turns us immedia
12a60 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  tely to locking 
12a70 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69  level 0..** It i
12a80 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
12a90 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  o lower the lock
12aa0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74  ing level one st
12ab0 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59  ep at a time.  Y
12ac0 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74  ou.** must go st
12ad0 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e  raight to lockin
12ae0 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74  g level 0..*/.st
12af0 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b  atic int winLock
12b00 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12b10 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
12b20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
12b30 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65  ITE_OK;    /* Re
12b40 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
12b50 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20  ubroutines */.  
12b60 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20  int res = 1;    
12b70 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
12b80 20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f   of a Windows lo
12b90 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ck call */.  int
12ba0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20   newLocktype;   
12bb0 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65      /* Set pFile
12bc0 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68  ->locktype to th
12bd0 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  is value before 
12be0 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  exiting */.  int
12bf0 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
12c00 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77  = 0;/* True if w
12c10 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e  e acquired a PEN
12c20 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74  DING lock this t
12c30 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ime */.  winFile
12c40 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
12c50 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20  le*)id;.  DWORD 
12c60 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45  lastErrno = NO_E
12c70 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28  RROR;..  assert(
12c80 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52   id!=0 );.  OSTR
12c90 41 43 45 28 28 22 4c 4f 43 4b 20 25 64 20 25 64  ACE(("LOCK %d %d
12ca0 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 0a   was %d(%d)\n",.
12cb0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
12cc0 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 70  ->h, locktype, p
12cd0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
12ce0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
12cf0 6b 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 49  kByte));..  /* I
12d00 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
12d10 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
12d20 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
12d30 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
12d40 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64  e.  ** OsFile, d
12d50 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
12d60 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63   use the end_loc
12d70 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
12d80 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45  .  ** sqlite3OsE
12d90 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
12da0 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
12db0 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
12dc0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
12dd0 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
12de0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12df0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
12e00 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
12e10 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
12e20 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73  rrect.  */.  ass
12e30 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
12e40 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  type!=NO_LOCK ||
12e50 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
12e60 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
12e70 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45  rt( locktype!=PE
12e80 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
12e90 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
12ea0 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
12eb0 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  || pFile->lockty
12ec0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
12ed0 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68  );..  /* Lock th
12ee0 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
12ef0 79 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  yte if we need t
12f00 6f 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44  o acquire a PEND
12f10 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a  ING lock or.  **
12f20 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20   a SHARED lock. 
12f30 20 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69   If we are acqui
12f40 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
12f50 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74  ck, the acquisit
12f60 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ion of.  ** the 
12f70 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74  PENDING_LOCK byt
12f80 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a  e is temporary..
12f90 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79    */.  newLockty
12fa0 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  pe = pFile->lock
12fb0 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70  type;.  if(   (p
12fc0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
12fd0 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c  NO_LOCK).     ||
12fe0 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d   (   (locktype==
12ff0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
13000 20 20 20 20 20 20 20 20 20 26 26 20 28 70 46 69           && (pFi
13010 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  le->locktype==RE
13020 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SERVED_LOCK)).  
13030 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
13040 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63   3;.    while( c
13050 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d  nt-->0 && (res =
13060 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
13070 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
13080 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20  OCKFILE_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 20 20 20 50 45 4e 44 49 4e 47 5f          PENDING_
130c0 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d  BYTE, 0, 1, 0))=
130d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
130e0 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65  ry 3 times to ge
130f0 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f  t the pending lo
13100 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65  ck.  This is nee
13110 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20  ded to work.    
13120 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62    ** around prob
13130 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 69  lems caused by i
13140 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61  ndexing and/or a
13150 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61  nti-virus softwa
13160 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57  re on.      ** W
13170 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
13180 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20        ** If you 
13190 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 63  are using this c
131a0 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66  ode as a model f
131b0 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56  or alternative V
131c0 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20  FSes, do not.   
131d0 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20     ** copy this 
131e0 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74  retry logic.  It
131f0 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e   is a hack inten
13200 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20  ded for Windows 
13210 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  only..      */. 
13220 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 63       OSTRACE(("c
13230 6f 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 20 50  ould not get a P
13240 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74  ENDING lock. cnt
13250 3d 25 64 5c 6e 22 2c 20 63 6e 74 29 29 3b 0a 20  =%d\n", cnt));. 
13260 20 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 73       if( cnt ) s
13270 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
13280 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ep(1);.    }.   
13290 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
132a0 3d 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21  = res;.    if( !
132b0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73  res ){.      las
132c0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
132d0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d  stError();.    }
132e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
132f0 72 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  re a shared lock
13300 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
13310 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
13320 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
13330 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
13340 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
13350 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 67 65   );.    res = ge
13360 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
13370 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
13380 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
13390 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
133a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
133b0 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
133c0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
133d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
133e0 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
133f0 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  VED lock.  */.  
13400 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  if( locktype==RE
13410 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SERVED_LOCK && r
13420 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
13430 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
13440 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
13450 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  ;.    res = winL
13460 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
13470 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
13480 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56  LE_FLAGS, RESERV
13490 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
134a0 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
134b0 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
134c0 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c  ype = RESERVED_L
134d0 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
134e0 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
134f0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
13500 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
13510 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45   /* Acquire a PE
13520 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  NDING lock.  */.
13530 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
13540 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
13550 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77  & res ){.    new
13560 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  Locktype = PENDI
13570 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74  NG_LOCK;.    got
13580 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b  PendingLock = 0;
13590 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
135a0 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
135b0 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
135c0 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
135d0 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  IVE_LOCK && res 
135e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
135f0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
13600 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
13610 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52     res = unlockR
13620 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
13630 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
13640 72 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22  readlock = %d\n"
13650 2c 20 72 65 73 29 29 3b 0a 20 20 20 20 72 65 73  , res));.    res
13660 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
13670 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
13680 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
13690 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
136a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
136b0 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
136c0 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
136d0 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
136e0 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c  wLocktype = EXCL
136f0 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
13700 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
13710 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
13720 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
13730 20 4f 53 54 52 41 43 45 28 28 22 65 72 72 6f 72   OSTRACE(("error
13740 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c 20 6c  -code = %d\n", l
13750 61 73 74 45 72 72 6e 6f 29 29 3b 0a 20 20 20 20  astErrno));.    
13760 20 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46    getReadLock(pF
13770 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
13780 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
13790 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e  holding a PENDIN
137a0 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68  G lock that ough
137b0 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64  t to be released
137c0 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65  , then.  ** rele
137d0 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ase it now..  */
137e0 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e  .  if( gotPendin
137f0 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70  gLock && locktyp
13800 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
13810 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
13820 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50  ile(&pFile->h, P
13830 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
13840 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  1, 0);.  }..  /*
13850 20 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74   Update the stat
13860 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61  e of the lock ha
13870 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69  s held in the fi
13880 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
13890 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74  en.  ** return t
138a0 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72  he appropriate r
138b0 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f  esult code..  */
138c0 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20  .  if( res ){.  
138d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
138e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f  ;.  }else{.    O
138f0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 46 41  STRACE(("LOCK FA
13900 49 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66  ILED %d trying f
13910 6f 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64  or %d but got %d
13920 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
13930 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79            lockty
13940 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29  pe, newLocktype)
13950 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  );.    pFile->la
13960 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
13970 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  rno;.    rc = SQ
13980 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
13990 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
139a0 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79   = (u8)newLockty
139b0 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
139c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
139d0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
139e0 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
139f0 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
13a00 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
13a10 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
13a20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
13a30 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
13a40 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65  lock is held, re
13a50 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
13a60 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f  , otherwise zero
13a70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13a80 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
13a90 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
13aa0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
13ab0 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Out){.  int rc;.
13ac0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
13ad0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
13ae0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
13af0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
13b00 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
13b10 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a  SERVEDLOCK; );..
13b20 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
13b30 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
13b40 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56  locktype>=RESERV
13b50 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
13b60 63 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41  c = 1;.    OSTRA
13b70 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
13b80 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c  K %d %d (local)\
13b90 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
13ba0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
13bb0 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c   rc = winLockFil
13bc0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
13bd0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
13be0 4c 41 47 53 2c 52 45 53 45 52 56 45 44 5f 42 59  LAGS,RESERVED_BY
13bf0 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
13c00 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
13c10 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
13c20 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  &pFile->h, RESER
13c30 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
13c40 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
13c50 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53 54 52   = !rc;.    OSTR
13c60 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
13c70 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f 74 65  CK %d %d (remote
13c80 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
13c90 72 63 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  rc));.  }.  *pRe
13ca0 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74  sOut = rc;.  ret
13cb0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13cc0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
13cd0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
13ce0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
13cf0 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70  or id to locktyp
13d00 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
13d10 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
13d20 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
13d30 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
13d40 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
13d50 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
13d60 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
13d70 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
13d80 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
13d90 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
13da0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
13db0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
13dc0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
13dd0 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
13de0 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68  ne to fail if th
13df0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
13e00 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e  t.** is NO_LOCK.
13e10 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
13e20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52  argument is SHAR
13e30 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69  ED_LOCK then thi
13e40 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67  s routine.** mig
13e50 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
13e60 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69  _IOERR;.*/.stati
13e70 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28  c int winUnlock(
13e80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13e90 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
13ea0 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77  .  int type;.  w
13eb0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
13ec0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
13ed0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13ee0 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46  OK;.  assert( pF
13ef0 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ile!=0 );.  asse
13f00 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
13f10 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f  ARED_LOCK );.  O
13f20 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
13f30 25 64 20 74 6f 20 25 64 20 77 61 73 20 25 64 28  %d to %d was %d(
13f40 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  %d)\n", pFile->h
13f50 2c 20 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20  , locktype,.    
13f60 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
13f70 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68  ktype, pFile->sh
13f80 61 72 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a  aredLockByte));.
13f90 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e    type = pFile->
13fa0 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
13fb0 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f  type>=EXCLUSIVE_
13fc0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
13fd0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
13fe0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
13ff0 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
14000 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c  E, 0);.    if( l
14010 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
14020 4c 4f 43 4b 20 26 26 20 21 67 65 74 52 65 61 64  LOCK && !getRead
14030 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20  Lock(pFile) ){. 
14040 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f       /* This sho
14050 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e  uld never happen
14060 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77  .  We should alw
14070 61 79 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20  ays be able to. 
14080 20 20 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72       ** reacquir
14090 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  e the read lock 
140a0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  */.      rc = wi
140b0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
140c0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f  _IOERR_UNLOCK, o
140d0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
140e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
140f0 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69  "winUnlock", pFi
14100 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
14110 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  }.  }.  if( type
14120 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
14130 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  ){.    winUnlock
14140 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
14150 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
14160 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 1, 0);.  }.  i
14170 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  f( locktype==NO_
14180 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48  LOCK && type>=SH
14190 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
141a0 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28   unlockReadLock(
141b0 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pFile);.  }.  if
141c0 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  ( type>=PENDING_
141d0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
141e0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
141f0 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
14200 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
14210 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
14220 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70  pe = (u8)locktyp
14230 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
14240 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  }../*.** If *pAr
14250 67 20 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79  g is inititially
14260 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74   negative then t
14270 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20  his is a query. 
14280 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a   Set *pArg to.**
14290 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e   1 or 0 dependin
142a0 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
142b0 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20  not bit mask of 
142c0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
142d0 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49   is set..**.** I
142e0 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20  f *pArg is 0 or 
142f0 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72  1, then clear or
14300 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69   set the mask bi
14310 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c  t of pFile->ctrl
14320 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  Flags..*/.static
14330 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74   void winModeBit
14340 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c  (winFile *pFile,
14350 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d   unsigned char m
14360 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b  ask, int *pArg){
14370 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29  .  if( *pArg<0 )
14380 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70  {.    *pArg = (p
14390 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
143a0 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65  & mask)!=0;.  }e
143b0 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d  lse if( (*pArg)=
143c0 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  =0 ){.    pFile-
143d0 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d  >ctrlFlags &= ~m
143e0 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ask;.  }else{.  
143f0 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
14400 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a  gs |= mask;.  }.
14410 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
14420 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  claration */.sta
14430 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d 70 6e  tic int getTempn
14440 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
14450 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a  ar *zBuf);../*.*
14460 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75  * Control and qu
14470 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20  ery of the open 
14480 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  file handle..*/.
14490 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69  static int winFi
144a0 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
144b0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
144c0 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
144d0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
144e0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
144f0 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
14500 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
14510 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
14520 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
14530 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
14540 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
14550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14570 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52   SQLITE_LAST_ERR
14580 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  NO: {.      *(in
14590 74 2a 29 70 41 72 67 20 3d 20 28 69 6e 74 29 70  t*)pArg = (int)p
145a0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
145b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
145c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
145d0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
145e0 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a  CNTL_CHUNK_SIZE:
145f0 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
14600 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20  szChunk = *(int 
14610 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65  *)pArg;.      re
14620 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14630 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
14640 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
14650 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69  _HINT: {.      i
14660 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
14670 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  k>0 ){.        s
14680 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64  qlite3_int64 old
14690 53 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  Sz;.        int 
146a0 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
146b0 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20  (id, &oldSz);.  
146c0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
146d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
146e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
146f0 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c  64 newSz = *(sql
14700 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67  ite3_int64*)pArg
14710 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14720 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20  newSz>oldSz ){. 
14730 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c             Simul
14740 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
14750 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (1);.           
14760 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74   rc = winTruncat
14770 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20  e(id, newSz);.  
14780 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61            Simula
14790 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
147a0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
147b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
147c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
147d0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
147e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
147f0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
14800 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
14810 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69  _WAL: {.      wi
14820 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  nModeBit(pFile, 
14830 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  WINFILE_PERSIST_
14840 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  WAL, (int*)pArg)
14850 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
14860 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
14870 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
14880 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
14890 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20  OVERWRITE: {.   
148a0 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46     winModeBit(pF
148b0 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f  ile, WINFILE_PSO
148c0 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  W, (int*)pArg);.
148d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
148e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
148f0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
14900 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20  NTL_VFSNAME: {. 
14910 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41       *(char**)pA
14920 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rg = sqlite3_mpr
14930 69 6e 74 66 28 22 77 69 6e 33 32 22 29 3b 0a 20  intf("win32");. 
14940 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
14950 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
14960 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
14970 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52  TL_WIN32_AV_RETR
14980 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a  Y: {.      int *
14990 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a  a = (int*)pArg;.
149a0 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30        if( a[0]>0
149b0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33   ){.        win3
149c0 32 49 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b  2IoerrRetry = a[
149d0 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0];.      }else{
149e0 0a 20 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20  .        a[0] = 
149f0 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 3b  win32IoerrRetry;
14a00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
14a10 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20  f( a[1]>0 ){.   
14a20 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52       win32IoerrR
14a30 65 74 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d  etryDelay = a[1]
14a40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14a50 20 20 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69         a[1] = wi
14a60 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c  n32IoerrRetryDel
14a70 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ay;.      }.    
14a80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14a90 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
14aa0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
14ab0 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a  TEMPFILENAME: {.
14ac0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69        char *zTFi
14ad0 6c 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  le = sqlite3Mall
14ae0 6f 63 5a 65 72 6f 28 20 70 46 69 6c 65 2d 3e 70  ocZero( pFile->p
14af0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
14b00 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46  );.      if( zTF
14b10 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 67  ile ){.        g
14b20 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65  etTempname(pFile
14b30 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
14b40 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20  me, zTFile);.   
14b50 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41       *(char**)pA
14b60 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20  rg = zTFile;.   
14b70 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
14b80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
14b90 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
14ba0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
14bb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
14bc0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
14bd0 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
14be0 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
14bf0 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
14c00 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
14c10 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
14c20 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
14c30 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
14c40 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
14c50 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
14c60 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
14c70 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
14c80 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
14c90 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
14ca0 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
14cb0 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
14cc0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
14cd0 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
14ce0 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
14cf0 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
14d00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
14d10 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
14d20 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
14d30 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
14d40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
14d50 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  inSectorSize(sql
14d60 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
14d70 20 20 28 76 6f 69 64 29 69 64 3b 0a 20 20 72 65    (void)id;.  re
14d80 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41  turn SQLITE_DEFA
14d90 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
14da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
14db0 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76   a vector of dev
14dc0 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
14dd0 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ics..*/.static i
14de0 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68 61 72  nt winDeviceChar
14df0 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
14e00 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
14e10 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77   winFile *p = (w
14e20 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65  inFile*)id;.  re
14e30 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41  turn SQLITE_IOCA
14e40 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
14e50 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20  EN_OPEN |.      
14e60 20 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67     ((p->ctrlFlag
14e70 73 20 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  s & WINFILE_PSOW
14e80 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  )?SQLITE_IOCAP_P
14e90 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
14ea0 54 45 3a 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  TE:0);.}..#ifnde
14eb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
14ec0 4c 0a 0a 2f 2a 20 0a 2a 2a 20 57 69 6e 64 6f 77  L../* .** Window
14ed0 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20  s will only let 
14ee0 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65 20  you create file 
14ef0 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a  view mappings.**
14f00 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73   on allocation s
14f10 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20  ize granularity 
14f20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44  boundaries..** D
14f30 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73  uring sqlite3_os
14f40 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61 20  _init() we do a 
14f50 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a  GetSystemInfo().
14f60 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67 72  ** to get the gr
14f70 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a  anularity size..
14f80 2a 2f 0a 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77  */.SYSTEM_INFO w
14f90 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 2f 2a 0a 2a  inSysInfo;../*.*
14fa0 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
14fb0 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64  ns to obtain and
14fc0 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20   relinquish the 
14fd0 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68  global mutex. Th
14fe0 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65  e.** global mute
14ff0 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f  x is used to pro
15000 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b  tect the winLock
15010 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73 65  Info objects use
15020 64 20 62 79 20 0a 2a 2a 20 74 68 69 73 20 66 69  d by .** this fi
15030 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68  le, all of which
15040 20 6d 61 79 20 62 65 20 73 68 61 72 65 64 20 62   may be shared b
15050 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  y multiple threa
15060 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69  ds..**.** Functi
15070 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  on winShmMutexHe
15080 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20  ld() is used to 
15090 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
150a0 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a  e global mutex .
150b0 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20  ** is held when 
150c0 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 66  required. This f
150d0 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
150e0 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
150f0 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61  assert() .** sta
15100 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a  tements. e.g..**
15110 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74 65  .**   winShmEnte
15120 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20  rMutex().**     
15130 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75  assert( winShmMu
15140 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20  texHeld() );.** 
15150 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
15160 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ex().*/.static v
15170 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  oid winShmEnterM
15180 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71  utex(void){.  sq
15190 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
151a0 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  r(sqlite3MutexAl
151b0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
151c0 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
151d0 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
151e0 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
151f0 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
15200 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
15210 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
15220 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
15230 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
15240 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
15250 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 77  BUG.static int w
15260 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 76  inShmMutexHeld(v
15270 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20  oid) {.  return 
15280 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15290 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ld(sqlite3MutexA
152a0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
152b0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
152c0 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
152d0 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74  ** Object used t
152e0 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 73 69  o represent a si
152f0 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e 65 64  ngle file opened
15300 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74 6f 20   and mmapped to 
15310 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61 72 65  provide.** share
15320 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20  d memory.  When 
15330 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
15340 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74   all reference t
15350 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73  he same.** log-s
15360 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74 68 72  ummary, each thr
15370 65 61 64 20 68 61 73 20 69 74 73 20 6f 77 6e 20  ead has its own 
15380 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20  winFile object, 
15390 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20  but they all.** 
153a0 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c  point to a singl
153b0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
153c0 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f  is object.  In o
153d0 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68  ther words, each
153e0 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20  .** log-summary 
153f0 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f  is opened only o
15400 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e  nce per process.
15410 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74  .**.** winShmMut
15420 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65  exHeld() must be
15430 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74   true when creat
15440 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e  ing or destroyin
15450 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74  g.** this object
15460 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e   or while readin
15470 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
15480 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
15490 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52  s:.**.**      nR
154a0 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65 78 74  ef.**      pNext
154b0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c   .**.** The foll
154c0 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
154d0 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72   read-only after
154e0 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63   the object is c
154f0 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20  reated:.** .**  
15500 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20      fid.**      
15510 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
15520 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64  Either winShmNod
15530 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  e.mutex must be 
15540 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f  held or winShmNo
15550 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a  de.nRef==0 and.*
15560 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  * winShmMutexHel
15570 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e  d() is true when
15580 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
15590 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ing any other fi
155a0 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73  eld.** in this s
155b0 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a  tructure..**.*/.
155c0 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
155d0 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e {.  sqlite3_mu
155e0 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
155f0 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63   /* Mutex to acc
15600 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ess this object 
15610 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
15620 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
15630 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
15640 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ile */.  winFile
15650 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20   hFile;         
15660 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
15670 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20  le from winOpen 
15680 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67 69  */..  int szRegi
15690 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
156a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72   /* Size of shar
156b0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
156c0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69  s */.  int nRegi
156d0 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
156e0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
156f0 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20  ay apRegion */. 
15700 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f   struct ShmRegio
15710 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20 68  n {.    HANDLE h
15720 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Map;            
15730 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
15740 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65 4d  from CreateFileM
15750 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f  apping */.    vo
15760 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61  id *pMap;.  } *a
15770 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20  Region;.  DWORD 
15780 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  lastErrno;      
15790 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e 64       /* The Wind
157a0 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74  ows errno from t
157b0 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f  he last I/O erro
157c0 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66  r */..  int nRef
157d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
157e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
157f0 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  winShm objects p
15800 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
15810 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46 69  */.  winShm *pFi
15820 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  rst;            
15830 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62  /* All winShm ob
15840 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
15850 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53  o this */.  winS
15860 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20  hmNode *pNext;  
15870 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 69         /* Next i
15880 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77 69  n list of all wi
15890 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73  nShmNode objects
158a0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
158b0 45 5f 44 45 42 55 47 0a 20 20 75 38 20 6e 65 78  E_DEBUG.  u8 nex
158c0 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20  tShmId;         
158d0 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61       /* Next ava
158e0 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64  ilable winShm.id
158f0 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
15900 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f  .};../*.** A glo
15910 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c 6c  bal array of all
15920 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
15930 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77  cts..**.** The w
15940 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
15950 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
15960 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
15970 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73 74  riting this list
15980 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e 53  ..*/.static winS
15990 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f  hmNode *winShmNo
159a0 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  deList = 0;../*.
159b0 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65  ** Structure use
159c0 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20  d internally by 
159d0 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f  this VFS to reco
159e0 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  rd the state of 
159f0 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65  an.** open share
15a00 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74  d memory connect
15a10 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
15a20 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
15a30 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
15a40 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74  when this object
15a50 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a   is created and.
15a60 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ** are read-only
15a70 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a   thereafter:.**.
15a80 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53 68  **    winShm.pSh
15a90 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53  mNode.**    winS
15aa0 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  hm.id.**.** All 
15ab0 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65  other fields are
15ac0 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68   read/write.  Th
15ad0 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64  e winShm.pShmNod
15ae0 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  e->mutex must be
15af0 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61   held.** while a
15b00 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61  ccessing any rea
15b10 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a  d/write fields..
15b20 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d  */.struct winShm
15b30 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20   {.  winShmNode 
15b40 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
15b50 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
15b60 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  g winShmNode obj
15b70 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ect */.  winShm 
15b80 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
15b90 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53      /* Next winS
15ba0 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  hm with the same
15bb0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20   winShmNode */. 
15bc0 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20   u8 hasMutex;   
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15be0 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74  rue if holding t
15bf0 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75  he winShmNode mu
15c00 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61  tex */.  u16 sha
15c10 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  redMask;        
15c20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73      /* Mask of s
15c30 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64  hared locks held
15c40 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61   */.  u16 exclMa
15c50 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
15c60 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c   /* Mask of excl
15c70 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64  usive locks held
15c80 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
15c90 45 5f 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b  E_DEBUG.  u8 id;
15ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cb0 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68       /* Id of th
15cc0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  is connection wi
15cd0 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64  th its winShmNod
15ce0 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
15cf0 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20  /*.** Constants 
15d00 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
15d10 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f  .*/.#define WIN_
15d20 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b  SHM_BASE   ((22+
15d30 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
15d40 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66  )*4)        /* f
15d50 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a  irst lock byte *
15d60 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48  /.#define WIN_SH
15d70 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48  M_DMS    (WIN_SH
15d80 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48  M_BASE+SQLITE_SH
15d90 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61  M_NLOCK)  /* dea
15da0 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a  dman switch */..
15db0 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69  /*.** Apply advi
15dc0 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
15dd0 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e  ll n bytes begin
15de0 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f  ning at ofst..*/
15df0 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e  .#define _SHM_UN
15e00 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 5f  LCK  1.#define _
15e10 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65  SHM_RDLCK  2.#de
15e20 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20  fine _SHM_WRLCK 
15e30 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69   3.static int wi
15e40 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a  nShmSystemLock(.
15e50 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46    winShmNode *pF
15e60 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79  ile,    /* Apply
15e70 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f   locks to this o
15e80 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  pen shared-memor
15e90 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69  y segment */.  i
15ea0 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20  nt lockType,    
15eb0 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c       /* _SHM_UNL
15ec0 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  CK, _SHM_RDLCK, 
15ed0 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f  or _SHM_WRLCK */
15ee0 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
15ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
15f00 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65  et to first byte
15f10 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e   to be locked/un
15f20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  locked */.  int 
15f30 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20  nByte           
15f40 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
15f50 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20  ytes to lock or 
15f60 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69  unlock */.){.  i
15f70 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
15f80 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
15f90 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e  ode form Lock/Un
15fa0 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a  lockFileEx() */.
15fb0 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20  .  /* Access to 
15fc0 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  the winShmNode o
15fd0 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
15fe0 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
15ff0 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  r */.  assert( s
16000 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16010 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20  d(pFile->mutex) 
16020 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d  || pFile->nRef==
16030 30 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  0 );..  /* Relea
16040 73 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73  se/Acquire the s
16050 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
16060 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79   */.  if( lockTy
16070 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29  pe==_SHM_UNLCK )
16080 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e  {.    rc = winUn
16090 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
160a0 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20  >hFile.h, ofst, 
160b0 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  0, nByte, 0);.  
160c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
160d0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
160e0 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
160f0 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46  */.    DWORD dwF
16100 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f  lags = LOCKFILE_
16110 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
16120 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  ;.    if( lockTy
16130 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b  pe == _SHM_WRLCK
16140 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f   ) dwFlags |= LO
16150 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
16160 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  _LOCK;.    rc = 
16170 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
16180 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46  le->hFile.h, dwF
16190 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e  lags, ofst, 0, n
161a0 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Byte, 0);.  }.  
161b0 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b  .  if( rc!= 0 ){
161c0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
161d0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
161e0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
161f0 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45  no =  osGetLastE
16200 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d  rror();.    rc =
16210 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
16220 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  }..  OSTRACE(("S
16230 48 4d 2d 4c 4f 43 4b 20 25 64 20 25 73 20 25 73  HM-LOCK %d %s %s
16240 20 30 78 25 30 38 6c 78 5c 6e 22 2c 20 0a 20 20   0x%08lx\n", .  
16250 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
16260 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20  hFile.h,.       
16270 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
16280 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
16290 65 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ed",.           
162a0 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55  lockType==_SHM_U
162b0 4e 4c 43 4b 20 3f 20 22 55 6e 6c 6f 63 6b 46 69  NLCK ? "UnlockFi
162c0 6c 65 45 78 22 20 3a 20 22 4c 6f 63 6b 46 69 6c  leEx" : "LockFil
162d0 65 45 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  eEx",.          
162e0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
162f0 6f 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  o));..  return r
16300 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
16310 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
16320 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74  FS methods */.st
16330 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e  atic int winOpen
16340 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f  (sqlite3_vfs*,co
16350 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65  nst char*,sqlite
16360 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a  3_file*,int,int*
16370 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
16380 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f  nDelete(sqlite3_
16390 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72  vfs *,const char
163a0 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  *,int);../*.** P
163b0 75 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d 4e  urge the winShmN
163c0 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
163d0 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
163e0 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66   winShmNode.nRef
163f0 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ==0..**.** This 
16400 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61  is not a VFS sha
16410 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
16420 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69  d; it is a utili
16430 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ty function call
16440 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61  ed.** by VFS sha
16450 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
16460 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
16470 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28 73  id winShmPurge(s
16480 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
16490 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67  , int deleteFlag
164a0 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ){.  winShmNode 
164b0 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  **pp;.  winShmNo
164c0 64 65 20 2a 70 3b 0a 20 20 42 4f 4f 4c 20 62 52  de *p;.  BOOL bR
164d0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  c;.  assert( win
164e0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
164f0 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d  ;.  pp = &winShm
16500 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c  NodeList;.  whil
16510 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20  e( (p = *pp)!=0 
16520 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  ){.    if( p->nR
16530 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ef==0 ){.      i
16540 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20  nt i;.      if( 
16550 70 2d 3e 6d 75 74 65 78 20 29 20 73 71 6c 69 74  p->mutex ) sqlit
16560 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d  e3_mutex_free(p-
16570 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 66  >mutex);.      f
16580 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65  or(i=0; i<p->nRe
16590 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  gion; i++){.    
165a0 20 20 20 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61      bRc = osUnma
165b0 70 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61  pViewOfFile(p->a
165c0 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b  Region[i].pMap);
165d0 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
165e0 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64  (("SHM-PURGE pid
165f0 2d 25 64 20 75 6e 6d 61 70 20 72 65 67 69 6f 6e  -%d unmap region
16600 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  =%d %s\n",.     
16610 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74              (int
16620 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f  )osGetCurrentPro
16630 63 65 73 73 49 64 28 29 2c 20 69 2c 0a 20 20 20  cessId(), i,.   
16640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52                bR
16650 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  c ? "ok" : "fail
16660 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 62  ed"));.        b
16670 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64  Rc = osCloseHand
16680 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
16690 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .hMap);.        
166a0 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
166b0 52 47 45 20 70 69 64 2d 25 64 20 63 6c 6f 73 65  RGE pid-%d close
166c0 20 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22   region=%d %s\n"
166d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
166e0 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72     (int)osGetCur
166f0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
16700 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   i,.            
16710 20 20 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20       bRc ? "ok" 
16720 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
16730 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16740 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c  p->hFile.h!=NULL
16750 20 26 26 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d   && p->hFile.h!=
16760 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
16770 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ALUE ){.        
16780 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
16790 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
167a0 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69    winClose((sqli
167b0 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68  te3_file *)&p->h
167c0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53  File);.        S
167d0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
167e0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d  nign(0);.      }
167f0 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 65 74  .      if( delet
16800 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  eFlag ){.       
16810 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
16820 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
16830 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
16840 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
16850 20 20 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65         winDelete
16860 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e  (pVfs, p->zFilen
16870 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
16880 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
16890 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
168a0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
168b0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
168c0 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d     }.      *pp =
168d0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20   p->pNext;.     
168e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
168f0 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  >aRegion);.     
16900 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
16910 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16920 20 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78     pp = &p->pNex
16930 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
16940 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73  /*.** Open the s
16950 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65  hared-memory are
16960 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
16970 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
16980 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  pDbFd..**.** Whe
16990 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20  n opening a new 
169a0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
169b0 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  le, if no other 
169c0 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61  instances of tha
169d0 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75  t.** file are cu
169e0 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e  rrently open, in
169f0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
16a00 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73   in other proces
16a10 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ses, then.** the
16a20 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72   file must be tr
16a30 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
16a40 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69  length or have i
16a50 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65  ts header cleare
16a60 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
16a70 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65   winOpenSharedMe
16a80 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44  mory(winFile *pD
16a90 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77  bFd){.  struct w
16aa0 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  inShm *p;       
16ab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16ac0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
16ad0 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
16ae0 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
16af0 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20   *pShmNode = 0; 
16b00 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
16b10 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ing mmapped file
16b20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 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 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
16b50 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72  lt code */.  str
16b60 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  uct winShmNode *
16b70 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
16b80 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  /* Newly allocat
16b90 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  ed winShmNode */
16ba0 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
16bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16bc0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
16bd0 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20   zName in bytes 
16be0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44  */..  assert( pD
16bf0 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20  bFd->pShm==0 ); 
16c00 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f     /* Not previo
16c10 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a  usly opened */..
16c20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
16c30 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
16c40 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65  sqlite3_shm obje
16c50 63 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c  ct.  Also specul
16c60 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c  atively.  ** all
16c70 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
16c80 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65  a new winShmNode
16c90 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20   and filename.. 
16ca0 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
16cb0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
16cc0 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
16cd0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
16ce0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
16cf0 4d 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  M;.  nName = sql
16d00 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62  ite3Strlen30(pDb
16d10 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e  Fd->zPath);.  pN
16d20 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ew = sqlite3Mall
16d30 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
16d40 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d  pShmNode) + nNam
16d50 65 20 2b 20 31 37 20 29 3b 0a 20 20 69 66 28 20  e + 17 );.  if( 
16d60 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
16d70 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
16d80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16d90 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
16da0 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c 65   }.  pNew->zFile
16db0 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
16dc0 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74 65  New[1];.  sqlite
16dd0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d 65  3_snprintf(nName
16de0 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  +15, pNew->zFile
16df0 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20  name, "%s-shm", 
16e00 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
16e10 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
16e20 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
16e30 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
16e40 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  e); ..  /* Look 
16e50 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
16e60 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77  is an existing w
16e70 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63  inShmNode that c
16e80 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a  an be used..  **
16e90 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   If no matching 
16ea0 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65  winShmNode curre
16eb0 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65  ntly exists, cre
16ec0 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20  ate a new one.. 
16ed0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
16ee0 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
16ef0 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68  pShmNode = winSh
16f00 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e  mNodeList; pShmN
16f10 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53  ode; pShmNode=pS
16f20 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a  hmNode->pNext){.
16f30 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20      /* TBD need 
16f40 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20  to come up with 
16f50 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65 72  better match her
16f60 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20 20  e.  Perhaps.    
16f70 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42  ** use FILE_ID_B
16f80 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72  OTH_DIR_INFO Str
16f90 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ucture..    */. 
16fa0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
16fb0 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e  rICmp(pShmNode->
16fc0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d  zFilename, pNew-
16fd0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29  >zFilename)==0 )
16fe0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
16ff0 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20  ( pShmNode ){.  
17000 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17010 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  New);.  }else{. 
17020 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e     pShmNode = pN
17030 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  ew;.    pNew = 0
17040 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a  ;.    ((winFile*
17050 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  )(&pShmNode->hFi
17060 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49  le))->h = INVALI
17070 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
17080 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e      pShmNode->pN
17090 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ext = winShmNode
170a0 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d  List;.    winShm
170b0 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e  NodeList = pShmN
170c0 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e 6f  ode;..    pShmNo
170d0 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69  de->mutex = sqli
170e0 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
170f0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
17100 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  T);.    if( pShm
17110 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  Node->mutex==0 )
17120 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
17130 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
17140 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
17150 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
17160 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
17170 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20  n(pDbFd->pVfs,. 
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17190 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
171a0 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
171b0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
171c0 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  file (UTF-8) */.
171d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171e0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
171f0 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
17200 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c  ,  /* File handl
17210 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 20 20  e here */.      
17220 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
17230 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c  E_OPEN_WAL | SQL
17240 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
17250 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
17260 5f 43 52 45 41 54 45 2c 0a 20 20 20 20 20 20 20  _CREATE,.       
17270 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20            0);.  
17280 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
17290 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  =rc ){.      got
172a0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
172b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
172c0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e  eck to see if an
172d0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
172e0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61   holding the dea
172f0 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20  d-man switch..  
17300 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75    ** If not, tru
17310 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
17320 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a  o zero length. .
17330 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 77      */.    if( w
17340 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
17350 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57  pShmNode, _SHM_W
17360 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  RLCK, WIN_SHM_DM
17370 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  S, 1)==SQLITE_OK
17380 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
17390 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69  inTruncate((sqli
173a0 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
173b0 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b  Node->hFile, 0);
173c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
173d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
173e0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
173f0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
17400 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74  R_SHMOPEN, osGet
17410 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
17420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
17430 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62 46  inOpenShm", pDbF
17440 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
17450 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
17460 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17470 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53 79  {.      winShmSy
17480 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
17490 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57  e, _SHM_UNLCK, W
174a0 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
174b0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
174c0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
174d0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
174e0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
174f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
17500 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f   rc ) goto shm_o
17510 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20  pen_err;.  }..  
17520 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  /* Make the new 
17530 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69  connection a chi
17540 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d  ld of the winShm
17550 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68  Node */.  p->pSh
17560 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
17570 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
17580 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20  DEBUG.  p->id = 
17590 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68  pShmNode->nextSh
175a0 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  mId++;.#endif.  
175b0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b  pShmNode->nRef++
175c0 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
175d0 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61  = p;.  winShmLea
175e0 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  veMutex();..  /*
175f0 20 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   The reference c
17600 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65  ount on pShmNode
17610 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
17620 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e  n incremented un
17630 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76  der.  ** the cov
17640 65 72 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d  er of the winShm
17650 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74  EnterMutex() mut
17660 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74  ex and the point
17670 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  er from the.  **
17680 20 6e 65 77 20 28 73 74 72 75 63 74 20 77 69 6e   new (struct win
17690 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74  Shm) object to t
176a0 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  he pShmNode has 
176b0 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68  been set. All th
176c0 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20  at is.  ** left 
176d0 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b  to do is to link
176e0 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20   the new object 
176f0 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20  into the linked 
17700 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20  list starting.  
17710 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e  ** at pShmNode->
17720 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73  pFirst. This mus
17730 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20  t be done while 
17740 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d  holding the pShm
17750 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a  Node->mutex .  *
17760 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20  * mutex..  */.  
17770 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
17780 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
17790 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74  tex);.  p->pNext
177a0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69   = pShmNode->pFi
177b0 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  rst;.  pShmNode-
177c0 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73  >pFirst = p;.  s
177d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
177e0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
177f0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
17800 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
17810 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20  ump here on any 
17820 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65  error */.shm_ope
17830 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53  n_err:.  winShmS
17840 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
17850 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20  de, _SHM_UNLCK, 
17860 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b  WIN_SHM_DMS, 1);
17870 0a 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70  .  winShmPurge(p
17880 44 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20  DbFd->pVfs, 0); 
17890 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
178a0 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65  l frees pShmNode
178b0 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
178c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
178d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
178e0 65 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68  e(pNew);.  winSh
178f0 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  mLeaveMutex();. 
17900 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17910 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e  *.** Close a con
17920 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
17930 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74  d-memory.  Delet
17940 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
17950 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20   .** storage if 
17960 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72  deleteFlag is tr
17970 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
17980 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a 20  t winShmUnmap(. 
17990 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
179a0 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  d,          /* D
179b0 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
179c0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
179d0 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  .  int deleteFla
179e0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g             /*
179f0 20 44 65 6c 65 74 65 20 61 66 74 65 72 20 63 6c   Delete after cl
17a00 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f  osing if true */
17a10 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
17a20 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a 20 44  DbFd;       /* D
17a30 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
17a40 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f  shared-memory */
17a50 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20  .  winShm *p;   
17a60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17a70 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
17a80 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e   closed */.  win
17a90 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
17aa0 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c  e; /* The underl
17ab0 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ying shared-memo
17ac0 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e  ry file */.  win
17ad0 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20  Shm **pp;       
17ae0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
17af0 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63  g over sibling c
17b00 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  onnections */.. 
17b10 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c   pDbFd = (winFil
17b20 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62  e*)fd;.  p = pDb
17b30 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20  Fd->pShm;.  if( 
17b40 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
17b50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e  LITE_OK;.  pShmN
17b60 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
17b70 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  e;..  /* Remove 
17b80 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f  connection p fro
17b90 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e  m the set of con
17ba0 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  nections associa
17bb0 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53  ted.  ** with pS
17bc0 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  hmNode */.  sqli
17bd0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
17be0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
17bf0 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d  ;.  for(pp=&pShm
17c00 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a  Node->pFirst; (*
17c10 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a  pp)!=p; pp = &(*
17c20 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  pp)->pNext){}.  
17c30 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
17c40 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63  .  /* Free the c
17c50 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20  onnection p */. 
17c60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
17c70 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
17c80 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
17c90 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
17ca0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  ode->mutex);..  
17cb0 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e  /* If pShmNode->
17cc0 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64  nRef has reached
17cd0 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74   0, then close t
17ce0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20  he underlying.  
17cf0 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
17d00 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20   file, too */.  
17d10 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
17d20 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ();.  assert( pS
17d30 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29  hmNode->nRef>0 )
17d40 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ;.  pShmNode->nR
17d50 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d  ef--;.  if( pShm
17d60 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Node->nRef==0 ){
17d70 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72 67 65  .    winShmPurge
17d80 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 64 65  (pDbFd->pVfs, de
17d90 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20  leteFlag);.  }. 
17da0 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
17db0 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  x();..  return S
17dc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17dd0 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f  ** Change the lo
17de0 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73  ck state for a s
17df0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
17e00 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
17e10 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a  int winShmLock(.
17e20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
17e30 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fd,          /* 
17e40 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
17e50 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
17e60 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
17e70 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20   ofst,          
17e80 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
17e90 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65   lock to acquire
17ea0 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
17eb0 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20   int n,         
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
17ed0 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74  umber of locks t
17ee0 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c  o acquire or rel
17ef0 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ease */.  int fl
17f00 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
17f10 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20       /* What to 
17f20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  do with the lock
17f30 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
17f40 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69   *pDbFd = (winFi
17f50 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20 20 2f  le*)fd;        /
17f60 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c  * Connection hol
17f70 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
17f80 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ry */.  winShm *
17f90 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
17fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17fb0 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   The shared memo
17fc0 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20  ry being locked 
17fd0 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58 3b  */.  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 20 20 20 20 2f 2a 20 46 6f             /* Fo
18000 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61  r looping over a
18010 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  ll siblings */. 
18020 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
18030 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
18040 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
18050 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18070 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
18080 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20   u16 mask;      
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
180b0 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20  f locks to take 
180c0 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20  or release */.. 
180d0 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30   assert( ofst>=0
180e0 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49   && ofst+n<=SQLI
180f0 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
18100 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29    assert( n>=1 )
18110 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
18120 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
18130 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
18140 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
18150 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
18160 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
18170 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
18180 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  E).       || fla
18190 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
181a0 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
181b0 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
181c0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
181d0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
181e0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
181f0 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73  LUSIVE) );.  ass
18200 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c  ert( n==1 || (fl
18210 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
18220 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29  _EXCLUSIVE)!=0 )
18230 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31 36  ;..  mask = (u16
18240 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29  )((1U<<(ofst+n))
18250 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0a   - (1U<<ofst));.
18260 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c    assert( n>1 ||
18270 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29   mask==(1<<ofst)
18280 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   );.  sqlite3_mu
18290 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
182a0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  de->mutex);.  if
182b0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
182c0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  _SHM_UNLOCK ){. 
182d0 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d     u16 allMask =
182e0 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c   0; /* Mask of l
182f0 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62  ocks held by sib
18300 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  lings */..    /*
18310 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c   See if any sibl
18320 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73  ings hold this s
18330 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ame lock */.    
18340 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
18350 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
18360 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
18370 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f    if( pX==p ) co
18380 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73  ntinue;.      as
18390 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d  sert( (pX->exclM
183a0 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61  ask & (p->exclMa
183b0 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  sk|p->sharedMask
183c0 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  ))==0 );.      a
183d0 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68  llMask |= pX->sh
183e0 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
183f0 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74  .    /* Unlock t
18400 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20  he system-level 
18410 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
18420 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b   (mask & allMask
18430 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  )==0 ){.      rc
18440 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
18450 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
18460 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_UNLCK, ofst+W
18470 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
18480 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18490 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
184a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
184b0 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c  Undo the local l
184c0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
184d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
184e0 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61  .      p->exclMa
184f0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
18500 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
18510 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
18520 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c   .  }else if( fl
18530 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
18540 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75  _SHARED ){.    u
18550 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30  16 allShared = 0
18560 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
18570 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
18580 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
18590 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20  han "p" */..    
185a0 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63  /* Find out whic
185b0 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  h shared locks a
185c0 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  re already held 
185d0 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  by sibling conne
185e0 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49  ctions..    ** I
185f0 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c  f any sibling al
18600 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65  ready holds an e
18610 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67  xclusive lock, g
18620 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75  o ahead and retu
18630 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  rn.    ** SQLITE
18640 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  _BUSY..    */.  
18650 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
18660 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
18670 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
18680 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
18690 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
186a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
186b0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
186c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
186d0 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68     }.      allSh
186e0 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72  ared |= pX->shar
186f0 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
18700 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64     /* Get shared
18710 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
18720 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e  stem level, if n
18730 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
18740 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18750 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  K ){.      if( (
18760 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b  allShared & mask
18770 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
18780 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
18790 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
187a0 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73 74  _SHM_RDLCK, ofst
187b0 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
187c0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
187d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
187e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
187f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
18800 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
18810 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
18820 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18830 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
18840 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
18850 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
18860 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
18870 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
18880 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
18890 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
188a0 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
188b0 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
188c0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
188d0 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
188e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
188f0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
18900 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
18910 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
18920 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
18930 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
18940 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
18950 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
18960 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18970 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
18980 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
18990 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
189a0 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
189b0 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
189c0 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
189d0 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
189e0 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
189f0 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
18a00 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
18a10 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
18a20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18a30 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
18a40 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
18a50 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
18a60 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  WRLCK, ofst+WIN_
18a70 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
18a80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18a90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18aa0 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61   assert( (p->sha
18ab0 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d  redMask & mask)=
18ac0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
18ad0 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73  >exclMask |= mas
18ae0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
18af0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
18b00 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
18b10 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f  ode->mutex);.  O
18b20 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
18b30 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d  K shmid-%d, pid-
18b40 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78  %d got %03x,%03x
18b50 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
18b60 20 20 20 70 2d 3e 69 64 2c 20 28 69 6e 74 29 6f     p->id, (int)o
18b70 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
18b80 73 73 49 64 28 29 2c 20 70 2d 3e 73 68 61 72 65  ssId(), p->share
18b90 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61  dMask, p->exclMa
18ba0 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 72  sk,.           r
18bb0 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  c ? "failed" : "
18bc0 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ok"));.  return 
18bd0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
18be0 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20  lement a memory 
18bf0 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72  barrier or memor
18c00 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65  y fence on share
18c10 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a  d memory.  .**.*
18c20 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
18c30 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
18c40 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
18c50 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
18c60 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
18c70 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
18c80 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
18c90 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
18ca0 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28  d winShmBarrier(
18cb0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
18cc0 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *fd          /* 
18cd0 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
18ce0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
18cf0 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  ry */.){.  UNUSE
18d00 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
18d10 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 42 61 72 72  .  /* MemoryBarr
18d20 69 65 72 28 29 3b 20 2f 2f 20 64 6f 65 73 20 6e  ier(); // does n
18d30 6f 74 20 77 6f 72 6b 20 2d 2d 20 64 6f 20 6e 6f  ot work -- do no
18d40 74 20 6b 6e 6f 77 20 77 68 79 20 6e 6f 74 20 2a  t know why not *
18d50 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
18d60 75 74 65 78 28 29 3b 0a 20 20 77 69 6e 53 68 6d  utex();.  winShm
18d70 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
18d80 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
18d90 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
18da0 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74  o obtain a point
18db0 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65  er to region iRe
18dc0 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  gion of the .** 
18dd0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73  shared-memory as
18de0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
18df0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18e00 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72  fd. Shared-memor
18e10 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72  y regions .** ar
18e20 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
18e30 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45  ing from zero. E
18e40 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ach shared-memor
18e50 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65  y region is szRe
18e60 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69  gion .** bytes i
18e70 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n size..**.** If
18e80 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
18e90 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
18ea0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
18eb0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
18ec0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  LL..**.** Otherw
18ed0 69 73 65 2c 20 69 66 20 74 68 65 20 69 73 57 72  ise, if the isWr
18ee0 69 74 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  ite parameter is
18ef0 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65   0 and the reque
18f00 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
18f10 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73  ry.** region has
18f20 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
18f30 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65  ted (by any clie
18f40 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  nt, including on
18f50 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a  e running in a.*
18f60 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
18f70 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73  ss), then *pp is
18f80 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
18f90 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
18fa0 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 69 73 57 72  ned. If .** isWr
18fb0 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ite is non-zero 
18fc0 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
18fd0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
18fe0 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  region has not y
18ff0 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  et .** been allo
19000 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c  cated, it is all
19010 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
19020 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
19030 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
19040 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61  ory region has a
19050 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
19060 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f  cated or is allo
19070 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  cated by.** this
19080 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62   call as describ
19090 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69  ed above, then i
190a0 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f  t is mapped into
190b0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
190c0 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63  .** address spac
190d0 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
190e0 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73  already), *pp is
190f0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
19100 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20   the mapped .** 
19110 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
19120 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
19130 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
19140 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
19150 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
19160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
19170 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
19180 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
19190 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
191a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
191b0 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
191c0 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
191d0 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
191e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
191f0 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
19200 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20 20    int isWrite,  
19210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19220 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
19230 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
19240 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
19250 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
19260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
19270 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
19280 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
19290 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69   *pDbFd = (winFi
192a0 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d  le*)fd;.  winShm
192b0 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
192c0 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  m;.  winShmNode 
192d0 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  *pShmNode;.  int
192e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
192f0 0a 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ..  if( !p ){.  
19300 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 53 68    rc = winOpenSh
19310 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
19320 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
19330 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
19340 6e 20 72 63 3b 0a 20 20 20 20 70 20 3d 20 70 44  n rc;.    p = pD
19350 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20  bFd->pShm;.  }. 
19360 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
19370 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69  ShmNode;..  sqli
19380 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
19390 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
193a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65  ;.  assert( szRe
193b0 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e  gion==pShmNode->
193c0 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d  szRegion || pShm
193d0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30  Node->nRegion==0
193e0 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
193f0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52  ode->nRegion<=iR
19400 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72  egion ){.    str
19410 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61  uct ShmRegion *a
19420 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
19430 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d  /* New aRegion[]
19440 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
19450 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69  t nByte = (iRegi
19460 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20  on+1)*szRegion; 
19470 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
19480 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
19490 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /.    sqlite3_in
194a0 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20  t64 sz;         
194b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
194c0 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d  ent size of wal-
194d0 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20  index file */.. 
194e0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52     pShmNode->szR
194f0 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e  egion = szRegion
19500 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ;..    /* The re
19510 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69  quested region i
19520 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74  s not mapped int
19530 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
19540 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a   address space..
19550 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20      ** Check to 
19560 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65  see if it has be
19570 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e  en allocated (i.
19580 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e  e. if the wal-in
19590 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20  dex file is.    
195a0 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  ** large enough 
195b0 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72  to contain the r
195c0 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29  equested region)
195d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
195e0 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73  = winFileSize((s
195f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
19600 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
19610 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &sz);.    if( rc
19620 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
19630 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
19640 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
19650 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65  RR_SHMSIZE, osGe
19660 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
19670 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
19680 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62 46 64  nShmMap1", pDbFd
19690 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
196a0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
196b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
196c0 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20   sz<nByte ){.   
196d0 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
196e0 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
196f0 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
19700 2e 20 49 66 20 69 73 57 72 69 74 65 20 69 73 20  . If isWrite is 
19710 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  set to.      ** 
19720 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72 6c 79  zero, exit early
19730 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
19740 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
19750 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
19760 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
19770 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c   ** Alternativel
19780 79 2c 20 69 66 20 69 73 57 72 69 74 65 20 69 73  y, if isWrite is
19790 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20 66   non-zero, use f
197a0 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61 6c  truncate() to al
197b0 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a 2a 20  locate.      ** 
197c0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
197d0 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20 20  mory region..   
197e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
197f0 21 69 73 57 72 69 74 65 20 29 20 67 6f 74 6f 20  !isWrite ) goto 
19800 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
19810 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
19820 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ate((sqlite3_fil
19830 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
19840 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  File, nByte);.  
19850 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19860 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
19870 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
19880 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
19890 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73  HMSIZE, osGetLas
198a0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
198b0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
198c0 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e  hmMap2", pDbFd->
198d0 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
198e0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
198f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19900 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
19910 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
19920 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
19930 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
19940 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
19950 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63    apNew = (struc
19960 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71  t ShmRegion *)sq
19970 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
19980 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
19990 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69  >aRegion, (iRegi
199a0 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e  on+1)*sizeof(apN
199b0 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20  ew[0]).    );.  
199c0 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a    if( !apNew ){.
199d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
199e0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
199f0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
19a00 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
19a10 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
19a20 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20  on = apNew;..   
19a30 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65   while( pShmNode
19a40 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69  ->nRegion<=iRegi
19a50 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44  on ){.      HAND
19a60 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20  LE hMap = NULL; 
19a70 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d          /* file-
19a80 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a  mapping handle *
19a90 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d  /.      void *pM
19aa0 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ap = 0;         
19ab0 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65      /* Mapped me
19ac0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 20  mory region */. 
19ad0 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54 45 5f      .#if SQLITE_
19ae0 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68  OS_WINRT.      h
19af0 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
19b00 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
19b10 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
19b20 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55  .h,.          NU
19b30 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
19b40 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a  TE, nByte, NULL.
19b50 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64        );.#elif d
19b60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
19b70 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
19b80 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65      hMap = osCre
19b90 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
19ba0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
19bb0 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 4e 55  h, .          NU
19bc0 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
19bd0 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55  TE, 0, nByte, NU
19be0 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69  LL.      );.#eli
19bf0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
19c00 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
19c10 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73  .      hMap = os
19c20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
19c30 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  gA(pShmNode->hFi
19c40 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20 20  le.h, .         
19c50 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44   NULL, PAGE_READ
19c60 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c  WRITE, 0, nByte,
19c70 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23   NULL.      );.#
19c80 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52  endif.      OSTR
19c90 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 20 70 69  ACE(("SHM-MAP pi
19ca0 64 2d 25 64 20 63 72 65 61 74 65 20 72 65 67 69  d-%d create regi
19cb0 6f 6e 3d 25 64 20 6e 62 79 74 65 3d 25 64 20 25  on=%d nbyte=%d %
19cc0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
19cd0 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43       (int)osGetC
19ce0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
19cf0 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  ), pShmNode->nRe
19d00 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20  gion, nByte,.   
19d10 20 20 20 20 20 20 20 20 20 20 20 20 68 4d 61 70              hMap
19d20 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
19d30 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  d"));.      if( 
19d40 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  hMap ){.        
19d50 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53  int iOffset = pS
19d60 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a  hmNode->nRegion*
19d70 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20  szRegion;.      
19d80 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69    int iOffsetShi
19d90 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77  ft = iOffset % w
19da0 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
19db0 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
19dc0 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  y;.#if SQLITE_OS
19dd0 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20 20 70  _WINRT.        p
19de0 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f  Map = osMapViewO
19df0 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61  fFileFromApp(hMa
19e00 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  p, FILE_MAP_WRIT
19e10 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41  E | FILE_MAP_REA
19e20 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  D,.            i
19e30 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74  Offset - iOffset
19e40 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20  Shift, szRegion 
19e50 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20  + iOffsetShift. 
19e60 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a         );.#else.
19e70 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f          pMap = o
19e80 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68  sMapViewOfFile(h
19e90 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52  Map, FILE_MAP_WR
19ea0 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52  ITE | FILE_MAP_R
19eb0 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EAD,.           
19ec0 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f   0, iOffset - iO
19ed0 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65  ffsetShift, szRe
19ee0 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68  gion + iOffsetSh
19ef0 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23  ift.        );.#
19f00 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f 53  endif.        OS
19f10 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 20  TRACE(("SHM-MAP 
19f20 70 69 64 2d 25 64 20 6d 61 70 20 72 65 67 69 6f  pid-%d map regio
19f30 6e 3d 25 64 20 6f 66 66 73 65 74 3d 25 64 20 73  n=%d offset=%d s
19f40 69 7a 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20  ize=%d %s\n",.  
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
19f60 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74  int)osGetCurrent
19f70 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68  ProcessId(), pSh
19f80 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20  mNode->nRegion, 
19f90 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20  iOffset,.       
19fa0 20 20 20 20 20 20 20 20 20 20 73 7a 52 65 67 69            szRegi
19fb0 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20  on, pMap ? "ok" 
19fc0 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
19fd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19fe0 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  !pMap ){.       
19ff0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45   pShmNode->lastE
1a000 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1a010 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
1a020 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
1a030 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
1a040 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d  HMMAP, pShmNode-
1a050 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
1a060 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1a070 6e 53 68 6d 4d 61 70 33 22 2c 20 70 44 62 46 64  nShmMap3", pDbFd
1a080 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1a090 20 20 69 66 28 20 68 4d 61 70 20 29 20 6f 73 43    if( hMap ) osC
1a0a0 6c 6f 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29  loseHandle(hMap)
1a0b0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
1a0c0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1a0d0 20 20 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e    }..      pShmN
1a0e0 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68  ode->aRegion[pSh
1a0f0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e  mNode->nRegion].
1a100 70 4d 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20  pMap = pMap;.   
1a110 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1a120 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
1a130 52 65 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68  Region].hMap = h
1a140 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Map;.      pShmN
1a150 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a  ode->nRegion++;.
1a160 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61      }.  }..shmpa
1a170 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53  ge_out:.  if( pS
1a180 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e  hmNode->nRegion>
1a190 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69  iRegion ){.    i
1a1a0 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 69 52 65  nt iOffset = iRe
1a1b0 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20  gion*szRegion;. 
1a1c0 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68     int iOffsetSh
1a1d0 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20  ift = iOffset % 
1a1e0 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c  winSysInfo.dwAll
1a1f0 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69  ocationGranulari
1a200 74 79 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20  ty;.    char *p 
1a210 3d 20 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f  = (char *)pShmNo
1a220 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67  de->aRegion[iReg
1a230 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a  ion].pMap;.    *
1a240 70 70 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b  pp = (void *)&p[
1a250 69 4f 66 66 73 65 74 53 68 69 66 74 5d 3b 0a 20  iOffsetShift];. 
1a260 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20   }else{.    *pp 
1a270 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
1a280 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1a290 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1a2a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a2b0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1a2c0 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a  winShmMap     0.
1a2d0 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c  # define winShmL
1a2e0 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ock    0.# defin
1a2f0 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20  e winShmBarrier 
1a300 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
1a310 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69  mUnmap   0.#endi
1a320 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
1a330 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
1a340 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73  ./*.** Here ends
1a350 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
1a360 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74  ion of all sqlit
1a370 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e  e3_file methods.
1a380 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
1a390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73  ********** End s
1a3a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68  qlite3_file Meth
1a3b0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
1a3c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a3d0 2a 2a 2a 0a 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 2a 2a  ****************
1a420 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  **/../*.** This 
1a430 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
1a440 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
1a450 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
1a460 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  on an.** sqlite3
1a470 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e  _file for win32.
1a480 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
1a490 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
1a4a0 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20  ods winIoMethod 
1a4b0 3d 20 7b 0a 20 20 32 2c 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 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
1a4e0 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c  n */.  winClose,
1a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a500 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
1a510 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20   */.  winRead,  
1a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a530 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a        /* xRead *
1a540 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20  /.  winWrite,   
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a560 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f      /* xWrite */
1a570 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20  .  winTruncate, 
1a580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a590 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20     /* xTruncate 
1a5a0 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20  */.  winSync,   
1a5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5c0 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
1a5d0 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20  .  winFileSize, 
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5f0 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20     /* xFileSize 
1a600 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20  */.  winLock,   
1a610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a620 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f       /* xLock */
1a630 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20  .  winUnlock,   
1a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a650 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f     /* xUnlock */
1a660 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72  .  winCheckReser
1a670 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  vedLock,        
1a680 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
1a690 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  rvedLock */.  wi
1a6a0 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20  nFileControl,   
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a6c0 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f   xFileControl */
1a6d0 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65  .  winSectorSize
1a6e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a6f0 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a     /* xSectorSiz
1a700 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65  e */.  winDevice
1a710 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c  Characteristics,
1a720 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63         /* xDevic
1a730 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1a740 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c   */.  winShmMap,
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
1a770 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b   */.  winShmLock
1a780 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a790 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63        /* xShmLoc
1a7a0 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72  k */.  winShmBar
1a7b0 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  rier,           
1a7c0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61         /* xShmBa
1a7d0 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68  rrier */.  winSh
1a7e0 6d 55 6e 6d 61 70 20 20 20 20 20 20 20 20 20 20  mUnmap          
1a7f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1a800 68 6d 55 6e 6d 61 70 20 2a 2f 0a 7d 3b 0a 0a 2f  hmUnmap */.};../
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 2a 2a 2a 2a 0a 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 2a 2a 2a 2a 20 73 71 6c 69 74 65  ********* sqlite
1a880 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a  3_vfs 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 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
1a8b0 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63   This division c
1a8c0 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c  ontains the impl
1a8d0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65  ementation of me
1a8e0 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  thods on the.** 
1a8f0 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65  sqlite3_vfs obje
1a900 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ct..*/../*.** Co
1a910 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 66 69  nvert a UTF-8 fi
1a920 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74  lename into what
1a930 65 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e  ever form the un
1a940 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72  derlying.** oper
1a950 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e  ating system wan
1a960 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e  ts filenames in.
1a970 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
1a980 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73  the result.** is
1a990 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
1a9a0 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62  alloc and must b
1a9b0 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
1a9c0 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
1a9d0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  on..*/.static vo
1a9e0 69 64 20 2a 63 6f 6e 76 65 72 74 55 74 66 38 46  id *convertUtf8F
1a9f0 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68  ilename(const ch
1aa00 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
1aa10 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
1aa20 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 73  ed = 0;.  if( is
1aa30 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e  NT() ){.    zCon
1aa40 76 65 72 74 65 64 20 3d 20 75 74 66 38 54 6f 55  verted = utf8ToU
1aa50 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
1aa60 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
1aa70 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1aa80 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
1aa90 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c  zConverted = sql
1aaa0 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
1aab0 74 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d  to_mbcs(zFilenam
1aac0 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e);.  }.#endif. 
1aad0 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20   /* caller will 
1aae0 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65  handle out of me
1aaf0 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e  mory */.  return
1ab00 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a   zConverted;.}..
1ab10 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
1ab20 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
1ab30 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75  me in zBuf.  zBu
1ab40 66 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e  f must be big en
1ab50 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20  ough to.** hold 
1ab60 61 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  at pVfs->mxPathn
1ab70 61 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a  ame characters..
1ab80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
1ab90 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
1aba0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
1abb0 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a  .  static char z
1abc0 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
1abd0 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
1abe0 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
1abf0 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
1ac00 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
1ac10 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
1ac20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69  size_t i, j;.  i
1ac30 6e 74 20 6e 54 65 6d 70 50 61 74 68 3b 0a 20 20  nt nTempPath;.  
1ac40 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d  char zTempPath[M
1ac50 41 58 5f 50 41 54 48 2b 32 5d 3b 0a 0a 20 20 2f  AX_PATH+2];..  /
1ac60 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
1ac70 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
1ac80 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
1ac90 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
1aca0 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
1acb0 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
1acc0 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
1acd0 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
1ace0 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
1acf0 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
1ad00 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1ad10 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1ad20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a  SQLITE_IOERR );.
1ad30 0a 20 20 6d 65 6d 73 65 74 28 7a 54 65 6d 70 50  .  memset(zTempP
1ad40 61 74 68 2c 20 30 2c 20 4d 41 58 5f 50 41 54 48  ath, 0, MAX_PATH
1ad50 2b 32 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  +2);..  if( sqli
1ad60 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
1ad70 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ry ){.    sqlite
1ad80 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
1ad90 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74  ATH-30, zTempPat
1ada0 68 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  h, "%s", sqlite3
1adb0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29  _temp_directory)
1adc0 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54  ;.  }.#if !SQLIT
1add0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 65 6c 73  E_OS_WINRT.  els
1ade0 65 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a  e if( isNT() ){.
1adf0 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69      char *zMulti
1ae00 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57 69 64  ;.    WCHAR zWid
1ae10 65 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b  ePath[MAX_PATH];
1ae20 0a 20 20 20 20 6f 73 47 65 74 54 65 6d 70 50 61  .    osGetTempPa
1ae30 74 68 57 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c  thW(MAX_PATH-30,
1ae40 20 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20   zWidePath);.   
1ae50 20 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64   zMulti = unicod
1ae60 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74  eToUtf8(zWidePat
1ae70 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c  h);.    if( zMul
1ae80 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ti ){.      sqli
1ae90 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
1aea0 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50  _PATH-30, zTempP
1aeb0 61 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74  ath, "%s", zMult
1aec0 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  i);.      sqlite
1aed0 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a  3_free(zMulti);.
1aee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1aef0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1af00 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
1af10 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
1af20 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
1af30 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63  SI.  else{.    c
1af40 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20  har *zUtf8;.    
1af50 63 68 61 72 20 7a 4d 62 63 73 50 61 74 68 5b 4d  char zMbcsPath[M
1af60 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 6f 73  AX_PATH];.    os
1af70 47 65 74 54 65 6d 70 50 61 74 68 41 28 4d 41 58  GetTempPathA(MAX
1af80 5f 50 41 54 48 2d 33 30 2c 20 7a 4d 62 63 73 50  _PATH-30, zMbcsP
1af90 61 74 68 29 3b 0a 20 20 20 20 7a 55 74 66 38 20  ath);.    zUtf8 
1afa0 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
1afb0 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62  mbcs_to_utf8(zMb
1afc0 63 73 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  csPath);.    if(
1afd0 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20   zUtf8 ){.      
1afe0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1aff0 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54  (MAX_PATH-30, zT
1b000 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a  empPath, "%s", z
1b010 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
1b020 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
1b030 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b040 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b050 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
1b060 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23    }.  }.#endif.#
1b070 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63  endif..  /* Chec
1b080 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
1b090 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
1b0a0 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
1b0b0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
1b0c0 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69  .  ** name. If i
1b0d0 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e  t is not, return
1b0e0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20   SQLITE_ERROR.. 
1b0f0 20 2a 2f 0a 20 20 6e 54 65 6d 70 50 61 74 68 20   */.  nTempPath 
1b100 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1b110 30 28 7a 54 65 6d 70 50 61 74 68 29 3b 0a 0a 20  0(zTempPath);.. 
1b120 20 69 66 28 20 28 6e 54 65 6d 70 50 61 74 68 20   if( (nTempPath 
1b130 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  + sqlite3Strlen3
1b140 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  0(SQLITE_TEMP_FI
1b150 4c 45 5f 50 52 45 46 49 58 29 20 2b 20 31 38 29  LE_PREFIX) + 18)
1b160 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20 20 20 20   >= nBuf ){.    
1b170 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1b180 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28  ROR;.  }..  for(
1b190 69 3d 6e 54 65 6d 70 50 61 74 68 3b 20 69 3e 30  i=nTempPath; i>0
1b1a0 20 26 26 20 7a 54 65 6d 70 50 61 74 68 5b 69 2d   && zTempPath[i-
1b1b0 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d  1]=='\\'; i--){}
1b1c0 0a 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20  .  zTempPath[i] 
1b1d0 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  = 0;..  sqlite3_
1b1e0 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 38  snprintf(nBuf-18
1b1f0 2c 20 7a 42 75 66 2c 20 28 6e 54 65 6d 70 50 61  , zBuf, (nTempPa
1b200 74 68 20 3e 20 30 29 20 3f 0a 20 20 20 20 20 20  th > 0) ?.      
1b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b220 20 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45   "%s\\"SQLITE_TE
1b230 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 20 3a  MP_FILE_PREFIX :
1b240 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c   SQLITE_TEMP_FIL
1b250 45 5f 50 52 45 46 49 58 2c 0a 20 20 20 20 20 20  E_PREFIX,.      
1b260 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65               zTe
1b270 6d 70 50 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73  mpPath);.  j = s
1b280 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1b290 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Buf);.  sqlite3_
1b2a0 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26  randomness(15, &
1b2b0 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28  zBuf[j]);.  for(
1b2c0 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20  i=0; i<15; i++, 
1b2d0 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a  j++){.    zBuf[j
1b2e0 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
1b2f0 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
1b300 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
1b310 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
1b320 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d  .  }.  zBuf[j] =
1b330 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20   0;.  zBuf[j+1] 
1b340 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  = 0;..  OSTRACE(
1b350 28 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a  ("TEMP FILENAME:
1b360 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a   %s\n", zBuf));.
1b370 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b380 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  OK; .}../*.** Re
1b390 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1b3a0 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72   named file is r
1b3b0 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
1b3c0 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  y.  Return false
1b3d0 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d   if.** it is som
1b3e0 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
1b3f0 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f  n a directory, o
1b400 72 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  r if there is an
1b410 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79  y kind of memory
1b420 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  .** allocation f
1b430 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
1b440 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63  c int winIsDir(c
1b450 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  onst void *zConv
1b460 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20  erted){.  DWORD 
1b470 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  attr;.  int rc =
1b480 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   0;.  DWORD last
1b490 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 69 73  Errno;..  if( is
1b4a0 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  NT() ){.    int 
1b4b0 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e  cnt = 0;.    WIN
1b4c0 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  32_FILE_ATTRIBUT
1b4d0 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61  E_DATA sAttrData
1b4e0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41  ;.    memset(&sA
1b4f0 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65  ttrData, 0, size
1b500 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a  of(sAttrData));.
1b510 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20      while( !(rc 
1b520 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
1b530 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54  butesExW((LPCWST
1b540 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
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 20 20 20 20 47 65 74 46 69             GetFi
1b570 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64  leExInfoStandard
1b580 2c 0a 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 20 20 20 20 26                 &
1b5a0 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20 72  sAttrData)) && r
1b5b0 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
1b5c0 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a  &lastErrno) ){}.
1b5d0 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20      if( !rc ){. 
1b5e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 2f       return 0; /
1b5f0 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20  * Invalid name? 
1b600 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61 74 74  */.    }.    att
1b610 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77  r = sAttrData.dw
1b620 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a  FileAttributes;.
1b630 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1b640 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a  NCE==0.  }else{.
1b650 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
1b660 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
1b670 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
1b680 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  d);.#endif.  }. 
1b690 20 72 65 74 75 72 6e 20 28 61 74 74 72 21 3d 49   return (attr!=I
1b6a0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
1b6b0 49 42 55 54 45 53 29 20 26 26 20 28 61 74 74 72  IBUTES) && (attr
1b6c0 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  &FILE_ATTRIBUTE_
1b6d0 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f  DIRECTORY);.}../
1b6e0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  *.** Open a file
1b6f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b700 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  winOpen(.  sqlit
1b710 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
1b720 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
1b730 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1b740 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
1b750 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
1b760 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ile (UTF-8) */. 
1b770 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
1b780 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  d,         /* Wr
1b790 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66  ite the SQLite f
1b7a0 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
1b7b0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b7d0 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67  * Open mode flag
1b7e0 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  s */.  int *pOut
1b7f0 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
1b800 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72   /* Status retur
1b810 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  n flags */.){.  
1b820 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52  HANDLE h;.  DWOR
1b830 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 44  D lastErrno;.  D
1b840 57 4f 52 44 20 64 77 44 65 73 69 72 65 64 41 63  WORD dwDesiredAc
1b850 63 65 73 73 3b 0a 20 20 44 57 4f 52 44 20 64 77  cess;.  DWORD dw
1b860 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f  ShareMode;.  DWO
1b870 52 44 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73  RD dwCreationDis
1b880 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52  position;.  DWOR
1b890 44 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72  D dwFlagsAndAttr
1b8a0 69 62 75 74 65 73 20 3d 20 30 3b 0a 23 69 66 20  ibutes = 0;.#if 
1b8b0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1b8c0 20 20 69 6e 74 20 69 73 54 65 6d 70 20 3d 20 30    int isTemp = 0
1b8d0 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69  ;.#endif.  winFi
1b8e0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
1b8f0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64  File*)id;.  void
1b900 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20   *zConverted;   
1b910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1b920 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63  lename in OS enc
1b930 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  oding */.  const
1b940 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65   char *zUtf8Name
1b950 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c   = zName; /* Fil
1b960 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65  ename in UTF-8 e
1b970 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  ncoding */.  int
1b980 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20   cnt = 0;..  /* 
1b990 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
1b9a0 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
1b9b0 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
1b9c0 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
1b9d0 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
1b9e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
1b9f0 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
1ba00 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
1ba10 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
1ba20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41  char zTmpname[MA
1ba30 58 5f 50 41 54 48 2b 32 5d 3b 20 20 20 20 20 2f  X_PATH+2];     /
1ba40 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74 6f  * Buffer used to
1ba50 20 63 72 65 61 74 65 20 74 65 6d 70 20 66 69 6c   create temp fil
1ba60 65 6e 61 6d 65 20 2a 2f 0a 0a 20 20 69 6e 74 20  ename */..  int 
1ba70 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1ba80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
1ba90 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f  nction Return Co
1baa0 64 65 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  de */.#if !defin
1bab0 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 53 51  ed(NDEBUG) || SQ
1bac0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
1bad0 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67  int eType = flag
1bae0 73 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f  s&0xFFFFFF00;  /
1baf0 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74  * Type of file t
1bb00 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66  o open */.#endif
1bb10 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73  ..  int isExclus
1bb20 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ive  = (flags & 
1bb30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
1bb40 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73  USIVE);.  int is
1bb50 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c  Delete     = (fl
1bb60 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1bb70 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29  N_DELETEONCLOSE)
1bb80 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65  ;.  int isCreate
1bb90 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
1bba0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1bbb0 54 45 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  TE);.#ifndef NDE
1bbc0 42 55 47 0a 20 20 69 6e 74 20 69 73 52 65 61 64  BUG.  int isRead
1bbd0 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20  only   = (flags 
1bbe0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
1bbf0 41 44 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a  ADONLY);.#endif.
1bc00 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74    int isReadWrit
1bc10 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
1bc20 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1bc30 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  ITE);..#ifndef N
1bc40 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f 70  DEBUG.  int isOp
1bc50 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43  enJournal = (isC
1bc60 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20  reate && (.     
1bc70 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45     eType==SQLITE
1bc80 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
1bc90 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
1bca0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1bcb0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _MAIN_JOURNAL . 
1bcc0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
1bcd0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
1bce0 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ));.#endif..  /*
1bcf0 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
1bd00 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
1bd10 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
1bd20 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
1bd30 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
1bd40 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
1bd50 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
1bd60 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
1bd70 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
1bd80 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
1bd90 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
1bda0 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
1bdb0 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
1bdc0 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
1bdd0 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
1bde0 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
1bdf0 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
1be00 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
1be10 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
1be20 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
1be30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
1be40 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
1be50 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
1be60 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
1be70 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
1be80 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
1be90 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
1bea0 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
1beb0 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
1bec0 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
1bed0 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
1bee0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
1bef0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
1bf00 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
1bf10 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
1bf20 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
1bf30 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f  never .  ** auto
1bf40 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
1bf50 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
1bf60 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
1bf70 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
1bf80 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
1bf90 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
1bfa0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
1bfb0 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
1bfc0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
1bfd0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
1bfe0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
1bff0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
1c000 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
1c010 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
1c020 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
1c030 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
1c040 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
1c050 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
1c060 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
1c070 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
1c080 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
1c090 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
1c0a0 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
1c0b0 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
1c0c0 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
1c0d0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
1c0e0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
1c0f0 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
1c100 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
1c110 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
1c120 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
1c130 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
1c140 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
1c150 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
1c160 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
1c170 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1c180 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
1c190 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1c1a0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
1c1b0 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
1c1c0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1c1d0 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c  _TRANSIENT_DB ||
1c1e0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1c1f0 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20  PEN_WAL.  );..  
1c200 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
1c210 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69   );.  memset(pFi
1c220 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69  le, 0, sizeof(wi
1c230 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65  nFile));.  pFile
1c240 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
1c250 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66  NDLE_VALUE;..#if
1c260 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
1c270 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f  .  if( !sqlite3_
1c280 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29  temp_directory )
1c290 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
1c2a0 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a  g(SQLITE_ERROR,.
1c2b0 20 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33          "sqlite3
1c2c0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
1c2d0 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20  variable should 
1c2e0 62 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54  be set for WinRT
1c2f0 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ");.  }.#endif..
1c300 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f    /* If the seco
1c310 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
1c320 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c330 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61  NULL, generate a
1c340 20 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79   .  ** temporary
1c350 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73   file name to us
1c360 65 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a  e .  */.  if( !z
1c370 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20  Utf8Name ){.    
1c380 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20  assert(isDelete 
1c390 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61  && !isOpenJourna
1c3a0 6c 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a  l);.    memset(z
1c3b0 54 6d 70 6e 61 6d 65 2c 20 30 2c 20 4d 41 58 5f  Tmpname, 0, MAX_
1c3c0 50 41 54 48 2b 32 29 3b 0a 20 20 20 20 72 63 20  PATH+2);.    rc 
1c3d0 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41  = getTempname(MA
1c3e0 58 5f 50 41 54 48 2b 32 2c 20 7a 54 6d 70 6e 61  X_PATH+2, zTmpna
1c3f0 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  me);.    if( rc!
1c400 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c410 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c420 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61     }.    zUtf8Na
1c430 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20  me = zTmpname;. 
1c440 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73   }..  /* Databas
1c450 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
1c460 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
1c470 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61  inated if they a
1c480 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73  re not.  ** URIs
1c490 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73   with parameters
1c4a0 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63  .  Hence, they c
1c4b0 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73  an always be pas
1c4c0 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71  sed into.  ** sq
1c4d0 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
1c4e0 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ter()..  */.  as
1c4f0 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53 51  sert( (eType!=SQ
1c500 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
1c510 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  B) || (flags & S
1c520 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
1c530 7c 7c 0a 20 20 20 20 20 20 20 20 7a 55 74 66 38  ||.        zUtf8
1c540 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 55 74 66  Name[strlen(zUtf
1c550 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  8Name)+1]==0 );.
1c560 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68  .  /* Convert th
1c570 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68  e filename to th
1c580 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e  e system encodin
1c590 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74  g. */.  zConvert
1c5a0 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
1c5b0 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61  Filename(zUtf8Na
1c5c0 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
1c5d0 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
1c5e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1c5f0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ERR_NOMEM;.  }..
1c600 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a    if( winIsDir(z
1c610 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
1c620 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1c630 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
1c640 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
1c650 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20  NTOPEN_ISDIR;.  
1c660 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64 57  }..  if( isReadW
1c670 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65  rite ){.    dwDe
1c680 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47 45  siredAccess = GE
1c690 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e  NERIC_READ | GEN
1c6a0 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65  ERIC_WRITE;.  }e
1c6b0 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72  lse{.    dwDesir
1c6c0 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52  edAccess = GENER
1c6d0 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  IC_READ;.  }..  
1c6e0 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45  /* SQLITE_OPEN_E
1c6f0 58 43 4c 55 53 49 56 45 20 69 73 20 75 73 65 64  XCLUSIVE is used
1c700 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
1c710 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73  at a new file is
1c720 20 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20   .  ** created. 
1c730 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75  SQLite doesn't u
1c740 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74  se it to indicat
1c750 65 20 22 65 78 63 6c 75 73 69 76 65 20 61 63 63  e "exclusive acc
1c760 65 73 73 22 20 0a 20 20 2a 2a 20 61 73 20 69 74  ess" .  ** as it
1c770 20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65   is usually unde
1c780 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69  rstood..  */.  i
1c790 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29  f( isExclusive )
1c7a0 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73  {.    /* Creates
1c7b0 20 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c   a new file, onl
1c7c0 79 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  y if it does not
1c7d0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20   already exist. 
1c7e0 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  */.    /* If the
1c7f0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74   file exists, it
1c800 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64   fails. */.    d
1c810 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
1c820 74 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45  tion = CREATE_NE
1c830 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  W;.  }else if( i
1c840 73 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f  sCreate ){.    /
1c850 2a 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20  * Open existing 
1c860 66 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20  file, or create 
1c870 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78  if it doesn't ex
1c880 69 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ist */.    dwCre
1c890 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
1c8a0 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a   = OPEN_ALWAYS;.
1c8b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1c8c0 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e  Opens a file, on
1c8d0 6c 79 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  ly if it exists.
1c8e0 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69   */.    dwCreati
1c8f0 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20  onDisposition = 
1c900 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20  OPEN_EXISTING;. 
1c910 20 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64   }..  dwShareMod
1c920 65 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52  e = FILE_SHARE_R
1c930 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45  EAD | FILE_SHARE
1c940 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69  _WRITE;..  if( i
1c950 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53  sDelete ){.#if S
1c960 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
1c970 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
1c980 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
1c990 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b  TTRIBUTE_HIDDEN;
1c9a0 0a 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b  .    isTemp = 1;
1c9b0 0a 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61  .#else.    dwFla
1c9c0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
1c9d0 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  = FILE_ATTRIBUTE
1c9e0 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20  _TEMPORARY.     
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca00 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45            | FILE
1ca10 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45  _ATTRIBUTE_HIDDE
1ca20 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca40 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c   | FILE_FLAG_DEL
1ca50 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65  ETE_ON_CLOSE;.#e
1ca60 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
1ca70 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
1ca80 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
1ca90 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a  TRIBUTE_NORMAL;.
1caa0 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73    }.  /* Reports
1cab0 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e   from the intern
1cac0 65 74 20 61 72 65 20 74 68 61 74 20 70 65 72 66  et are that perf
1cad0 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79  ormance is alway
1cae0 73 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66  s.  ** better if
1caf0 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
1cb00 4d 5f 41 43 43 45 53 53 20 69 73 20 75 73 65 64  M_ACCESS is used
1cb10 2e 20 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e  .  Ticket #2699.
1cb20 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   */.#if SQLITE_O
1cb30 53 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67  S_WINCE.  dwFlag
1cb40 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c  sAndAttributes |
1cb50 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  = FILE_FLAG_RAND
1cb60 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69  OM_ACCESS;.#endi
1cb70 66 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  f..  if( isNT() 
1cb80 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
1cb90 5f 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54  _WINRT.    CREAT
1cba0 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f  EFILE2_EXTENDED_
1cbb0 50 41 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e  PARAMETERS exten
1cbc0 64 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20  dedParameters;. 
1cbd0 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
1cbe0 65 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73  eters.dwSize = s
1cbf0 69 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45  izeof(CREATEFILE
1cc00 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d  2_EXTENDED_PARAM
1cc10 45 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65  ETERS);.    exte
1cc20 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64  ndedParameters.d
1cc30 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 20  wFileAttributes 
1cc40 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 77  =.            dw
1cc50 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
1cc60 65 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42  es & FILE_ATTRIB
1cc70 55 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78  UTE_MASK;.    ex
1cc80 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
1cc90 2e 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64  .dwFileFlags = d
1cca0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
1ccb0 74 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f  tes & FILE_FLAG_
1ccc0 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64  MASK;.    extend
1ccd0 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53  edParameters.dwS
1cce0 65 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20  ecurityQosFlags 
1ccf0 3d 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59  = SECURITY_ANONY
1cd00 4d 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64  MOUS;.    extend
1cd10 65 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53  edParameters.lpS
1cd20 65 63 75 72 69 74 79 41 74 74 72 69 62 75 74 65  ecurityAttribute
1cd30 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78  s = NULL;.    ex
1cd40 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
1cd50 2e 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d  .hTemplateFile =
1cd60 20 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65   NULL;.    while
1cd70 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46  ( (h = osCreateF
1cd80 69 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43  ile2((LPCWSTR)zC
1cd90 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdb0 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
1cdc0 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
1cdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cde0 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f         dwShareMo
1cdf0 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce10 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
1ce20 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
1ce30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce40 20 20 20 20 20 20 20 26 65 78 74 65 6e 64 65 64         &extended
1ce50 50 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e  Parameters))==IN
1ce60 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1ce70 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  UE &&.          
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce90 20 20 20 20 72 65 74 72 79 49 6f 65 72 72 28 26      retryIoerr(&
1cea0 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
1ceb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1cec0 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20     /* Noop */.  
1ced0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77 68    }.#else.    wh
1cee0 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61  ile( (h = osCrea
1cef0 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52  teFileW((LPCWSTR
1cf00 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
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 20 20 20 20 64 77 44 65 73             dwDes
1cf30 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72            dwShar
1cf60 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20  eMode, 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 20 20 20 20 64 77 43 72 65             dwCre
1cf90 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
1cfa0 2c 0a 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 20 20 20 20                  
1cfc0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
1cfd0 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  utes,.          
1cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cff0 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41      NULL))==INVA
1d000 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
1d010 20 26 26 0a 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 20 20                  
1d030 20 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e    retryIoerr(&cn
1d040 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
1d050 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1d060 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20   /* Noop */.    
1d070 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  }.#endif.  }.#if
1d080 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
1d090 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
1d0a0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20  {.    while( (h 
1d0b0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 28  = osCreateFileA(
1d0c0 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65 72 74  (LPCSTR)zConvert
1d0d0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
1d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0f0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
1d100 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
1d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d120 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55   dwShareMode, NU
1d130 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
1d140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d150 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
1d160 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
1d170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d180 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
1d190 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20  dAttributes,.   
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 20 20 20 20 4e 55 4c 4c 29             NULL)
1d1c0 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  )==INVALID_HANDL
1d1d0 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20  E_VALUE &&.     
1d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d1f0 20 20 20 20 20 20 20 20 20 72 65 74 72 79 49 6f           retryIo
1d200 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
1d210 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
1d220 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20          /* Noop 
1d230 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  */.    }.  }.#en
1d240 64 69 66 0a 20 20 6c 6f 67 49 6f 65 72 72 28 63  dif.  logIoerr(c
1d250 6e 74 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  nt);..  OSTRACE(
1d260 28 22 4f 50 45 4e 20 25 64 20 25 73 20 30 78 25  ("OPEN %d %s 0x%
1d270 6c 78 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20  lx %s\n", .     
1d280 20 20 20 20 20 20 68 2c 20 7a 4e 61 6d 65 2c 20        h, zName, 
1d290 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
1d2a0 20 0a 20 20 20 20 20 20 20 20 20 20 20 68 3d 3d   .           h==
1d2b0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
1d2c0 41 4c 55 45 20 3f 20 22 66 61 69 6c 65 64 22 20  ALUE ? "failed" 
1d2d0 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28  : "ok"));..  if(
1d2e0 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44   h==INVALID_HAND
1d2f0 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
1d300 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1d310 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
1d320 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
1d330 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70  LITE_CANTOPEN, p
1d340 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
1d350 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66   "winOpen", zUtf
1d360 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  8Name);.    sqli
1d370 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
1d380 74 65 64 29 3b 0a 20 20 20 20 69 66 28 20 69 73  ted);.    if( is
1d390 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69 73  ReadWrite && !is
1d3a0 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20  Exclusive ){.   
1d3b0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65     return winOpe
1d3c0 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69  n(pVfs, zName, i
1d3d0 64 2c 20 0a 20 20 20 20 20 20 20 20 20 28 28 66  d, .         ((f
1d3e0 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  lags|SQLITE_OPEN
1d3f0 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a 20 20 20  _READONLY) &.   
1d400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d410 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    ~(SQLITE_OPEN_
1d420 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50  CREATE|SQLITE_OP
1d430 45 4e 5f 52 45 41 44 57 52 49 54 45 29 29 2c 0a  EN_READWRITE)),.
1d440 20 20 20 20 20 20 20 20 20 70 4f 75 74 46 6c 61           pOutFla
1d450 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  gs);.    }else{.
1d460 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d470 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
1d480 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
1d490 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b  if( pOutFlags ){
1d4a0 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57  .    if( isReadW
1d4b0 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  rite ){.      *p
1d4c0 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  OutFlags = SQLIT
1d4d0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1d4e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d4f0 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
1d500 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1d510 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ONLY;.    }.  }.
1d520 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1d530 49 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65 61  INCE.  if( isRea
1d540 64 57 72 69 74 65 20 26 26 20 65 54 79 70 65 3d  dWrite && eType=
1d550 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
1d560 4e 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20 28  N_DB.       && (
1d570 72 63 20 3d 20 77 69 6e 63 65 43 72 65 61 74 65  rc = winceCreate
1d580 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c  Lock(zName, pFil
1d590 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  e))!=SQLITE_OK. 
1d5a0 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48   ){.    osCloseH
1d5b0 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 73 71  andle(h);.    sq
1d5c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
1d5d0 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65 74 75  erted);.    retu
1d5e0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
1d5f0 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70   isTemp ){.    p
1d600 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
1d610 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65  lose = zConverte
1d620 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  d;.  }else.#endi
1d630 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
1d640 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
1d650 64 29 3b 0a 20 20 7d 0a 0a 20 20 70 46 69 6c 65  d);.  }..  pFile
1d660 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e  ->pMethod = &win
1d670 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c  IoMethod;.  pFil
1d680 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  e->pVfs = pVfs;.
1d690 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a    pFile->h = h;.
1d6a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72    if( sqlite3_ur
1d6b0 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c  i_boolean(zName,
1d6c0 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f   "psow", SQLITE_
1d6d0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1d6e0 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  ITE) ){.    pFil
1d6f0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
1d700 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20  WINFILE_PSOW;.  
1d710 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  }.  pFile->lastE
1d720 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
1d730 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20  .  pFile->zPath 
1d740 3d 20 7a 4e 61 6d 65 3b 0a 0a 20 20 4f 70 65 6e  = zName;..  Open
1d750 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72  Counter(+1);.  r
1d760 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d770 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61  ** Delete the na
1d780 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  med file..**.** 
1d790 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f 77  Note that Window
1d7a0 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  s does not allow
1d7b0 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65   a file to be de
1d7c0 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  leted if some ot
1d7d0 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68  her.** process h
1d7e0 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d  as it open.  Som
1d7f0 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20 73  etimes a virus s
1d800 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69  canner or indexi
1d810 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69  ng program.** wi
1d820 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  ll open a journa
1d830 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61  l file shortly a
1d840 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61 74  fter it is creat
1d850 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64  ed in order to d
1d860 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74  o.** whatever it
1d870 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68   does.  While th
1d880 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  is other process
1d890 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a   is holding the.
1d8a0 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65  ** file open, we
1d8b0 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20   will be unable 
1d8c0 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54  to delete it.  T
1d8d0 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
1d8e0 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77  is.** problem, w
1d8f0 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c  e delay 100 mill
1d900 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79  iseconds and try
1d910 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e   to delete again
1d920 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44  .  Up.** to MX_D
1d930 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73  ELETION_ATTEMPTs
1d940 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70   deletion attemp
1d950 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72  ts are run befor
1d960 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61  e giving.** up a
1d970 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  nd returning an 
1d980 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
1d990 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a   int winDelete(.
1d9a0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1d9b0 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Vfs,          /*
1d9c0 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
1d9d0 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
1d9e0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
1d9f0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
1da00 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  ile to delete */
1da10 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20  .  int syncDir  
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1da30 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
1da40 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  n32 */.){.  int 
1da50 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  cnt = 0;.  int r
1da60 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b  c;.  DWORD attr;
1da70 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
1da80 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  no;.  void *zCon
1da90 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44  verted;.  UNUSED
1daa0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
1dab0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1dac0 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a  ETER(syncDir);..
1dad0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1dae0 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
1daf0 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20  IOERR_DELETE);. 
1db00 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f   zConverted = co
1db10 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
1db20 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
1db30 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
1db40 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1db50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1db60 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  EM;.  }.  if( is
1db70 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b  NT() ){.    do {
1db80 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1db90 49 4e 52 54 0a 20 20 20 20 20 20 57 49 4e 33 32  INRT.      WIN32
1dba0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  _FILE_ATTRIBUTE_
1dbb0 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a  DATA sAttrData;.
1dbc0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41        memset(&sA
1dbd0 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65  ttrData, 0, size
1dbe0 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a  of(sAttrData));.
1dbf0 20 20 20 20 20 20 69 66 20 28 20 6f 73 47 65 74        if ( osGet
1dc00 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
1dc10 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20 47 65  W(zConverted, Ge
1dc20 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64  tFileExInfoStand
1dc30 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ard,.           
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc50 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
1dc60 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74  a) ){.        at
1dc70 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
1dc80 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
1dc90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1dca0 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
1dcb0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
1dcc0 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
1dcd0 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
1dce0 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a  _FILE_NOT_FOUND.
1dcf0 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74           || last
1dd00 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54  Errno==ERROR_PAT
1dd10 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
1dd20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1dd30 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
1dd40 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65  E_NOENT; /* Alre
1dd50 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
1dd60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1dd70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1dd80 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
1dd90 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
1dda0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ;.      }.#else.
1ddb0 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47        attr = osG
1ddc0 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
1ddd0 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  W(zConverted);.#
1dde0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20 28  endif.      if (
1ddf0 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46   attr==INVALID_F
1de00 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29  ILE_ATTRIBUTES )
1de10 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72  {.        lastEr
1de20 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
1de30 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
1de40 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  if( lastErrno==E
1de50 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
1de60 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  UND.         || 
1de70 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
1de80 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
1de90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1dea0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
1deb0 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20  ELETE_NOENT; /* 
1dec0 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f  Already gone? */
1ded0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1dee0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1def0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
1df00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
1df10 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1df20 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49      if ( attr&FI
1df30 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
1df40 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  ECTORY ){.      
1df50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
1df60 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e  ROR; /* Files on
1df70 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ly. */.        b
1df80 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1df90 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74      if ( osDelet
1dfa0 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65  eFileW(zConverte
1dfb0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  d) ){.        rc
1dfc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a   = SQLITE_OK; /*
1dfd0 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a   Deleted OK. */.
1dfe0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1dff0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
1e000 28 20 21 72 65 74 72 79 49 6f 65 72 72 28 26 63  ( !retryIoerr(&c
1e010 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
1e020 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e030 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
1e040 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73   No more retries
1e050 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
1e060 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1e070 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a  } while(1);.  }.
1e080 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
1e090 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
1e0a0 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  lse{.    do {.  
1e0b0 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
1e0c0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
1e0d0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
1e0e0 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e     if ( attr==IN
1e0f0 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
1e100 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20  BUTES ){.       
1e110 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
1e120 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1e130 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45         if( lastE
1e140 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45  rrno==ERROR_FILE
1e150 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20  _NOT_FOUND.     
1e160 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f      || lastErrno
1e170 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54  ==ERROR_PATH_NOT
1e180 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  _FOUND ){.      
1e190 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1e1a0 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
1e1b0 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67  NT; /* Already g
1e1c0 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20  one? */.        
1e1d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e1e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1e1f0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
1e200 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e210 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20     }.      if ( 
1e220 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42  attr&FILE_ATTRIB
1e230 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b  UTE_DIRECTORY ){
1e240 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1e250 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46  LITE_ERROR; /* F
1e260 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  iles only. */.  
1e270 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e280 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20     }.      if ( 
1e290 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43  osDeleteFileA(zC
1e2a0 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
1e2b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e2c0 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20  _OK; /* Deleted 
1e2d0 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  OK. */.        b
1e2e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1e2f0 20 20 20 20 69 66 20 28 20 21 72 65 74 72 79 49      if ( !retryI
1e300 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
1e310 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  Errno) ){.      
1e320 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
1e330 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20  ROR; /* No more 
1e340 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20  retries. */.    
1e350 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1e360 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31   }.    } while(1
1e370 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1e380 69 66 28 20 72 63 20 26 26 20 72 63 21 3d 53 51  if( rc && rc!=SQ
1e390 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
1e3a0 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72  E_NOENT ){.    r
1e3b0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1e3c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
1e3d0 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 0a  ETE, lastErrno,.
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1e3f0 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e  nDelete", zFilen
1e400 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
1e410 20 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29     logIoerr(cnt)
1e420 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1e430 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
1e440 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45  ;.  OSTRACE(("DE
1e450 4c 45 54 45 20 5c 22 25 73 5c 22 20 25 73 5c 6e  LETE \"%s\" %s\n
1e460 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 72  ", zFilename, (r
1e470 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  c ? "failed" : "
1e480 6f 6b 22 20 29 29 29 3b 0a 20 20 72 65 74 75 72  ok" )));.  retur
1e490 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
1e4a0 68 65 63 6b 20 74 68 65 20 65 78 69 73 74 65 6e  heck the existen
1e4b0 63 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66  ce and status of
1e4c0 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
1e4d0 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73  ic int winAccess
1e4e0 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
1e4f0 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f  *pVfs,         /
1e500 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
1e510 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  n32 */.  const c
1e520 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1e530 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
1e540 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
1e550 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
1e560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e570 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20  Type of test to 
1e580 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c  make on this fil
1e590 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  e */.  int *pRes
1e5a0 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
1e5b0 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74    /* OUT: Result
1e5c0 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61   */.){.  DWORD a
1e5d0 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ttr;.  int rc = 
1e5e0 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  0;.  DWORD lastE
1e5f0 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  rrno;.  void *zC
1e600 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53  onverted;.  UNUS
1e610 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
1e620 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  s);..  SimulateI
1e630 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
1e640 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
1e650 53 53 3b 20 29 3b 0a 20 20 7a 43 6f 6e 76 65 72  SS; );.  zConver
1e660 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
1e670 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
1e680 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
1e690 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
1e6a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1e6b0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
1e6c0 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
1e6d0 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
1e6e0 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f  .    WIN32_FILE_
1e6f0 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
1e700 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65  AttrData;.    me
1e710 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
1e720 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
1e730 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c  Data));.    whil
1e740 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46  e( !(rc = osGetF
1e750 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
1e760 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
1e770 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e790 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f     GetFileExInfo
1e7a0 53 74 61 6e 64 61 72 64 2c 20 0a 20 20 20 20 20  Standard, .     
1e7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7c0 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61          &sAttrDa
1e7d0 74 61 29 29 20 26 26 20 72 65 74 72 79 49 6f 65  ta)) && retryIoe
1e7e0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
1e7f0 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28  rno) ){}.    if(
1e800 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   rc ){.      /* 
1e810 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43  For an SQLITE_AC
1e820 43 45 53 53 5f 45 58 49 53 54 53 20 71 75 65 72  CESS_EXISTS quer
1e830 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d  y, treat a zero-
1e840 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20  length file.    
1e850 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f    ** as if it do
1e860 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
1e870 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1e880 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54      flags==SQLIT
1e890 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a  E_ACCESS_EXISTS.
1e8a0 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74            && sAt
1e8b0 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65  trData.nFileSize
1e8c0 48 69 67 68 3d 3d 30 20 0a 20 20 20 20 20 20 20  High==0 .       
1e8d0 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e     && sAttrData.
1e8e0 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20  nFileSizeLow==0 
1e8f0 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  ){.        attr 
1e900 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  = INVALID_FILE_A
1e910 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
1e920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e930 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
1e940 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
1e950 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
1e960 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 49  else{.      logI
1e970 6f 65 72 72 28 63 6e 74 29 3b 0a 20 20 20 20 20  oerr(cnt);.     
1e980 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d   if( lastErrno!=
1e990 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
1e9a0 4f 55 4e 44 20 26 26 20 6c 61 73 74 45 72 72 6e  OUND && lastErrn
1e9b0 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o!=ERROR_PATH_NO
1e9c0 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
1e9d0 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
1e9e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
1e9f0 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22  SS, lastErrno, "
1ea00 77 69 6e 41 63 63 65 73 73 22 2c 20 7a 46 69 6c  winAccess", zFil
1ea10 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
1ea20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
1ea30 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
1ea40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ea50 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20  IOERR_ACCESS;.  
1ea60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ea70 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49     attr = INVALI
1ea80 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
1ea90 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  S;.      }.    }
1eaa0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
1eab0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1eac0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61 74  I.  else{.    at
1ead0 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
1eae0 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a  tributesA((char*
1eaf0 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  )zConverted);.  
1eb00 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
1eb10 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
1eb20 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66  ed);.  switch( f
1eb30 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65  lags ){.    case
1eb40 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
1eb50 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51  EAD:.    case SQ
1eb60 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1eb70 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61  TS:.      rc = a
1eb80 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
1eb90 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
1eba0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1ebb0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
1ebc0 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20  S_READWRITE:.   
1ebd0 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e     rc = attr!=IN
1ebe0 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
1ebf0 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20 20  BUTES &&.       
1ec00 20 20 20 20 20 20 28 61 74 74 72 20 26 20 46 49        (attr & FI
1ec10 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41  LE_ATTRIBUTE_REA
1ec20 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20  DONLY)==0;.     
1ec30 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
1ec40 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72  ult:.      asser
1ec50 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67  t(!"Invalid flag
1ec60 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20  s argument");.  
1ec70 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  }.  *pResOut = r
1ec80 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  c;.  return SQLI
1ec90 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
1eca0 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   Returns non-zer
1ecb0 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69  o if the specifi
1ecc0 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f  ed path name sho
1ecd0 75 6c 64 20 62 65 20 75 73 65 64 20 76 65 72 62  uld be used verb
1ece0 61 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e  atim.  If.** non
1ecf0 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
1ed00 64 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  d from this func
1ed10 74 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e  tion, the callin
1ed20 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  g function must 
1ed30 73 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68  simply.** use th
1ed40 65 20 70 72 6f 76 69 64 65 64 20 70 61 74 68 20  e provided path 
1ed50 6e 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d 4f  name verbatim -O
1ed60 52 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69 6e  R- resolve it in
1ed70 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6e  to a full path n
1ed80 61 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ame.** using the
1ed90 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65   GetFullPathName
1eda0 20 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63 74   Win32 API funct
1edb0 69 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62 6c  ion (if availabl
1edc0 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  e)..*/.static BO
1edd0 4f 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69 6d  OL winIsVerbatim
1ede0 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73  Pathname(.  cons
1edf0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d  t char *zPathnam
1ee00 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  e.){.  /*.  ** I
1ee10 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20  f the path name 
1ee20 73 74 61 72 74 73 20 77 69 74 68 20 61 20 66 6f  starts with a fo
1ee30 72 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20 61  rward slash or a
1ee40 20 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20 69   backslash, it i
1ee50 73 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61 20  s either.  ** a 
1ee60 6c 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20  legal UNC name, 
1ee70 61 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76  a volume relativ
1ee80 65 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61 62  e path, or an ab
1ee90 73 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d 65  solute path name
1eea0 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e   in the.  ** "Un
1eeb0 69 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69  ix" format on Wi
1eec0 6e 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73  ndows.  There is
1eed0 20 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f 20   no easy way to 
1eee0 64 69 66 66 65 72 65 6e 74 69 61 74 65 20 62 65  differentiate be
1eef0 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66  tween.  ** the f
1ef00 69 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b 20  inal two cases; 
1ef10 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72 65  therefore, we re
1ef20 74 75 72 6e 20 74 68 65 20 73 61 66 65 72 20 72  turn the safer r
1ef30 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54  eturn value of T
1ef40 52 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  RUE.  ** so that
1ef50 20 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73   callers of this
1ef60 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
1ef70 69 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65 72  imply use it ver
1ef80 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66  batim..  */.  if
1ef90 20 28 20 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 3d   ( zPathname[0]=
1efa0 3d 27 2f 27 20 7c 7c 20 7a 50 61 74 68 6e 61 6d  ='/' || zPathnam
1efb0 65 5b 30 5d 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  e[0]=='\\' ){.  
1efc0 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20    return TRUE;. 
1efd0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
1efe0 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73   the path name s
1eff0 74 61 72 74 73 20 77 69 74 68 20 61 20 6c 65 74  tarts with a let
1f000 74 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20  ter and a colon 
1f010 69 74 20 69 73 20 65 69 74 68 65 72 20 61 20 76  it is either a v
1f020 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74  olume.  ** relat
1f030 69 76 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61  ive path or an a
1f040 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43  bsolute path.  C
1f050 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66  allers of this f
1f060 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74  unction must not
1f070 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  .  ** attempt to
1f080 20 74 72 65 61 74 20 69 74 20 61 73 20 61 20 72   treat it as a r
1f090 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
1f0a0 65 20 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f  e (i.e. they sho
1f0b0 75 6c 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20  uld simply use. 
1f0c0 20 2a 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29   ** it verbatim)
1f0d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 73 71  ..  */.  if ( sq
1f0e0 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50 61  lite3Isalpha(zPa
1f0f0 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50  thname[0]) && zP
1f100 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20  athname[1]==':' 
1f110 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52  ){.    return TR
1f120 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  UE;.  }..  /*.  
1f130 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20  ** If we get to 
1f140 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
1f150 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64  path name should
1f160 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c   almost certainl
1f170 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20 20  y be a purely.  
1f180 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20  ** relative one 
1f190 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20  (i.e. not a UNC 
1f1a0 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75  name, not absolu
1f1b0 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75  te, and not volu
1f1c0 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20 20  me relative)..  
1f1d0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53  */.  return FALS
1f1e0 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  E;.}../*.** Turn
1f1f0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
1f200 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
1f210 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74   pathname.  Writ
1f220 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61  e the full.** pa
1f230 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74  thname into zOut
1f240 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c  [].  zOut[] will
1f250 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66   be at least pVf
1f260 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a  s->mxPathname.**
1f270 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
1f280 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1f290 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  nFullPathname(. 
1f2a0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1f2b0 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
1f2c0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
1f2d0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
1f2e0 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
1f2f0 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ve,        /* Po
1f300 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
1f310 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
1f320 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20  int nFull,      
1f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f340 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
1f350 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
1f360 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  */.  char *zFull
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f380 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
1f390 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 0a 23 69 66  fer */.){.  .#if
1f3a0 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
1f3b0 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49  N__).  SimulateI
1f3c0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
1f3d0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
1f3e0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1f3f0 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73 65  R(nFull);.  asse
1f400 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  rt( pVfs->mxPath
1f410 6e 61 6d 65 3e 3d 4d 41 58 5f 50 41 54 48 20 29  name>=MAX_PATH )
1f420 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 75 6c  ;.  assert( nFul
1f430 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l>=pVfs->mxPathn
1f440 61 6d 65 20 29 3b 0a 20 20 69 66 20 28 20 73 71  ame );.  if ( sq
1f450 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
1f460 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65  tory && !winIsVe
1f470 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a  rbatimPathname(z
1f480 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20  Relative) ){.   
1f490 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
1f4a0 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   We are dealing 
1f4b0 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20  with a relative 
1f4c0 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68  path name and th
1f4d0 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20  e data.    **   
1f4e0 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61      directory ha
1f4f0 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65  s been set.  The
1f500 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61  refore, use it a
1f510 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20  s the basis.    
1f520 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e  **       for con
1f530 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61  verting the rela
1f540 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74  tive path name t
1f550 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20  o an absolute.  
1f560 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62    **       one b
1f570 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65  y prepending the
1f580 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
1f590 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a 20 20 20  and a slash..   
1f5a0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 7a 4f 75   */.    char zOu
1f5b0 74 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 20  t[MAX_PATH+1];. 
1f5c0 20 20 20 6d 65 6d 73 65 74 28 7a 4f 75 74 2c 20     memset(zOut, 
1f5d0 30 2c 20 4d 41 58 5f 50 41 54 48 2b 31 29 3b 0a  0, MAX_PATH+1);.
1f5e0 20 20 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f      cygwin_conv_
1f5f0 70 61 74 68 28 43 43 50 5f 50 4f 53 49 58 5f 54  path(CCP_POSIX_T
1f600 4f 5f 57 49 4e 5f 41 7c 43 43 50 5f 52 45 4c 41  O_WIN_A|CCP_RELA
1f610 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76 65 2c  TIVE, zRelative,
1f620 20 7a 4f 75 74 2c 0a 20 20 20 20 20 20 20 20 20   zOut,.         
1f630 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 58 5f              MAX_
1f640 50 41 54 48 2b 31 29 3b 0a 20 20 20 20 73 71 6c  PATH+1);.    sql
1f650 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
1f660 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
1f670 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
1f680 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20  l, "%s\\%s",.   
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6a0 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
1f6b0 69 72 65 63 74 6f 72 79 2c 20 7a 4f 75 74 29 3b  irectory, zOut);
1f6c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 79  .  }else{.    cy
1f6d0 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 43  gwin_conv_path(C
1f6e0 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f  CP_POSIX_TO_WIN_
1f6f0 41 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46  A, zRelative, zF
1f700 75 6c 6c 2c 20 6e 46 75 6c 6c 29 3b 0a 20 20 7d  ull, nFull);.  }
1f710 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f720 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
1f730 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   (SQLITE_OS_WINC
1f740 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  E || SQLITE_OS_W
1f750 49 4e 52 54 29 20 26 26 20 21 64 65 66 69 6e 65  INRT) && !define
1f760 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
1f770 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1f780 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1f790 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e  RROR );.  /* Win
1f7a0 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70  CE has no concep
1f7b0 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20  t of a relative 
1f7c0 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20  pathname, or so 
1f7d0 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20  I am told. */.  
1f7e0 2f 2a 20 57 69 6e 52 54 20 68 61 73 20 6e 6f 20  /* WinRT has no 
1f7f0 77 61 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 61  way to convert a
1f800 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 74   relative path t
1f810 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e  o an absolute on
1f820 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c  e. */.  if ( sql
1f830 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
1f840 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72  ory && !winIsVer
1f850 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52  batimPathname(zR
1f860 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20  elative) ){.    
1f870 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
1f880 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  We are dealing w
1f890 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70  ith a relative p
1f8a0 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ath name and the
1f8b0 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20   data.    **    
1f8c0 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73     directory has
1f8d0 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72   been set.  Ther
1f8e0 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73  efore, use it as
1f8f0 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a   the basis.    *
1f900 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76  *       for conv
1f910 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74  erting the relat
1f920 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f  ive path name to
1f930 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20   an absolute.   
1f940 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79   **       one by
1f950 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20   prepending the 
1f960 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61  data directory a
1f970 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a  nd a backslash..
1f980 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
1f990 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
1f9a0 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
1f9b0 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
1f9c0 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20 20 20   "%s\\%s",.     
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9e0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
1f9f0 65 63 74 6f 72 79 2c 20 7a 52 65 6c 61 74 69 76  ectory, zRelativ
1fa00 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
1fa10 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1fa20 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
1fa30 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
1fa40 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65  zFull, "%s", zRe
1fa50 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72  lative);.  }.  r
1fa60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fa70 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
1fa80 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
1fa90 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
1faa0 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  T && !defined(__
1fab0 43 59 47 57 49 4e 5f 5f 29 0a 20 20 44 57 4f 52  CYGWIN__).  DWOR
1fac0 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20  D nByte;.  void 
1fad0 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63  *zConverted;.  c
1fae0 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a  har *zOut;..  /*
1faf0 20 49 66 20 74 68 69 73 20 70 61 74 68 20 6e 61   If this path na
1fb00 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  me begins with "
1fb10 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58 22 20  /X:", where "X" 
1fb20 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65 74 69  is any alphabeti
1fb30 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72  c.  ** character
1fb40 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 69 6e  , discard the in
1fb50 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74  itial "/" from t
1fb60 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a  he pathname..  *
1fb70 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76  /.  if( zRelativ
1fb80 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 73 71 6c  e[0]=='/' && sql
1fb90 69 74 65 33 49 73 61 6c 70 68 61 28 7a 52 65 6c  ite3Isalpha(zRel
1fba0 61 74 69 76 65 5b 31 5d 29 20 26 26 20 7a 52 65  ative[1]) && zRe
1fbb0 6c 61 74 69 76 65 5b 32 5d 3d 3d 27 3a 27 20 29  lative[2]==':' )
1fbc0 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b  {.    zRelative+
1fbd0 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27  +;.  }..  /* It'
1fbe0 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
1fbf0 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
1fc00 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
1fc10 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
1fc20 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
1fc30 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
1fc40 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
1fc50 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
1fc60 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
1fc70 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20  n failing. This 
1fc80 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66  function could f
1fc90 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d  ail if, for exam
1fca0 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75  ple, the.  ** cu
1fcb0 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69  rrent working di
1fcc0 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
1fcd0 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a   unlinked..  */.
1fce0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1fcf0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1fd00 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28  _ERROR );.  if (
1fd10 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
1fd20 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49  rectory && !winI
1fd30 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
1fd40 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a  e(zRelative) ){.
1fd50 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
1fd60 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69  TE: We are deali
1fd70 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ng with a relati
1fd80 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64  ve path name and
1fd90 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
1fda0 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
1fdb0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
1fdc0 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  Therefore, use i
1fdd0 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20  t as the basis. 
1fde0 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20     **       for 
1fdf0 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72  converting the r
1fe00 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
1fe10 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  e to an absolute
1fe20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e  .    **       on
1fe30 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  e by prepending 
1fe40 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
1fe50 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61  ry and a backsla
1fe60 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  sh..    */.    s
1fe70 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1fe80 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
1fe90 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
1fea0 75 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20  ull, "%s\\%s",. 
1feb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fec0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
1fed0 5f 64 69 72 65 63 74 6f 72 79 2c 20 7a 52 65 6c  _directory, zRel
1fee0 61 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75  ative);.    retu
1fef0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ff00 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  }.  zConverted =
1ff10 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
1ff20 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 3b  name(zRelative);
1ff30 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
1ff40 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
1ff50 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1ff60 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
1ff70 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c   isNT() ){.    L
1ff80 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20  PWSTR zTemp;.   
1ff90 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
1ffa0 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43  llPathNameW((LPC
1ffb0 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
1ffc0 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
1ffd0 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
1ffe0 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72       winLogError
1fff0 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f  (SQLITE_ERROR, o
20000 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
20010 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20020 20 20 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e     "GetFullPathN
20030 61 6d 65 57 31 22 2c 20 7a 43 6f 6e 76 65 72 74  ameW1", zConvert
20040 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
20050 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
20060 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
20070 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
20080 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20 20  N_FULLPATH;.    
20090 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33  }.    nByte += 3
200a0 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71  ;.    zTemp = sq
200b0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
200c0 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
200d0 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
200e0 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
200f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
20100 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
20110 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
20120 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
20130 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
20140 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
20150 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43  ameW((LPCWSTR)zC
20160 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c  onverted, nByte,
20170 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20   zTemp, 0);.    
20180 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
20190 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
201a0 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
201b0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
201c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
201d0 20 20 20 20 22 47 65 74 46 75 6c 6c 50 61 74 68      "GetFullPath
201e0 4e 61 6d 65 57 32 22 2c 20 7a 43 6f 6e 76 65 72  NameW2", zConver
201f0 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
20200 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
20210 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
20220 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
20230 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
20240 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
20250 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20  LLPATH;.    }.  
20260 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
20270 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
20280 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f  zOut = unicodeTo
20290 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20  Utf8(zTemp);.   
202a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
202b0 65 6d 70 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  emp);.  }.#ifdef
202c0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
202d0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
202e0 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a     char *zTemp;.
202f0 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65      nByte = osGe
20300 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28  tFullPathNameA((
20310 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
20320 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
20330 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
20340 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
20350 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
20360 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
20370 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20380 20 20 20 20 22 47 65 74 46 75 6c 6c 50 61 74 68      "GetFullPath
20390 4e 61 6d 65 41 31 22 2c 20 7a 43 6f 6e 76 65 72  NameA1", zConver
203a0 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
203b0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
203c0 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
203d0 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
203e0 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20  EN_FULLPATH;.   
203f0 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20   }.    nByte += 
20400 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73  3;.    zTemp = s
20410 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
20420 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
20430 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Temp[0]) );.    
20440 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a  if( zTemp==0 ){.
20450 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
20460 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
20470 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
20480 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
20490 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
204a0 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68   = osGetFullPath
204b0 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  NameA((char*)zCo
204c0 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
204d0 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69  zTemp, 0);.    i
204e0 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
204f0 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72       winLogError
20500 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f  (SQLITE_ERROR, o
20510 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
20520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20530 20 20 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e     "GetFullPathN
20540 61 6d 65 41 32 22 2c 20 7a 43 6f 6e 76 65 72 74  ameA2", zConvert
20550 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
20560 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
20570 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
20580 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
20590 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
205a0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
205b0 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20  LPATH;.    }.   
205c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
205d0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a  onverted);.    z
205e0 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  Out = sqlite3_wi
205f0 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
20600 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c  (zTemp);.    sql
20610 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
20620 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
20630 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73  f( zOut ){.    s
20640 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
20650 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
20660 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
20670 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29  ull, "%s", zOut)
20680 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
20690 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65  ee(zOut);.    re
206a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
206b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
206c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
206d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64  _NOMEM;.  }.#end
206e0 69 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  if.}..#ifndef SQ
206f0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
20700 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49  XTENSION./*.** I
20710 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70  nterfaces for op
20720 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  ening a shared l
20730 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20  ibrary, finding 
20740 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  entry points.** 
20750 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72 65  within the share
20760 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63  d library, and c
20770 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72 65  losing the share
20780 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a  d library..*/./*
20790 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
207a0 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
207b0 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
207c0 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
207d0 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
207e0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
207f0 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
20800 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
20810 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
20820 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  winDlOpen(sqlite
20830 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e  3_vfs *pVfs, con
20840 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
20850 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b  me){.  HANDLE h;
20860 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
20870 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
20880 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
20890 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ame);.  UNUSED_P
208a0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
208b0 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
208c0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
208d0 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  n 0;.  }.  if( i
208e0 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
208f0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
20900 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61   h = osLoadPacka
20910 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57  gedLibrary((LPCW
20920 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
20930 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20  0);.#else.    h 
20940 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  = osLoadLibraryW
20950 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
20960 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
20970 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
20980 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
20990 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f   else{.    h = o
209a0 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63  sLoadLibraryA((c
209b0 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
209c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
209d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
209e0 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72  verted);.  retur
209f0 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74  n (void*)h;.}.st
20a00 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45  atic void winDlE
20a10 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
20a20 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
20a30 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
20a40 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
20a50 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 67 65  ETER(pVfs);.  ge
20a60 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73  tLastErrorMsg(os
20a70 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
20a80 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b 0a  nBuf, zBufOut);.
20a90 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a  }.static void (*
20aa0 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  winDlSym(sqlite3
20ab0 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f 69 64 20  _vfs *pVfs,void 
20ac0 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a  *pH,const char *
20ad0 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20  zSym))(void){.  
20ae0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
20af0 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
20b00 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29   (void(*)(void))
20b10 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  osGetProcAddress
20b20 41 28 28 48 41 4e 44 4c 45 29 70 48 2c 20 7a 53  A((HANDLE)pH, zS
20b30 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ym);.}.static vo
20b40 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28 73 71  id winDlClose(sq
20b50 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
20b60 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b   void *pHandle){
20b70 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
20b80 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f 73 46  TER(pVfs);.  osF
20b90 72 65 65 4c 69 62 72 61 72 79 28 28 48 41 4e 44  reeLibrary((HAND
20ba0 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23  LE)pHandle);.}.#
20bb0 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54  else /* if SQLIT
20bc0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
20bd0 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64  NSION is defined
20be0 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77  : */.  #define w
20bf0 69 6e 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64  inDlOpen  0.  #d
20c00 65 66 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72  efine winDlError
20c10 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
20c20 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66  DlSym   0.  #def
20c30 69 6e 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30  ine winDlClose 0
20c40 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
20c50 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75 66  Write up to nBuf
20c60 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
20c70 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e 0a  ness into zBuf..
20c80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
20c90 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69  nRandomness(sqli
20ca0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
20cb0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
20cc0 42 75 66 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  Buf){.  int n = 
20cd0 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  0;.  UNUSED_PARA
20ce0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 23 69 66  METER(pVfs);.#if
20cf0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
20d00 54 45 53 54 29 0a 20 20 6e 20 3d 20 6e 42 75 66  TEST).  n = nBuf
20d10 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  ;.  memset(zBuf,
20d20 20 30 2c 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65   0, nBuf);.#else
20d30 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 53 59  .  if( sizeof(SY
20d40 53 54 45 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d  STEMTIME)<=nBuf-
20d50 6e 20 29 7b 0a 20 20 20 20 53 59 53 54 45 4d 54  n ){.    SYSTEMT
20d60 49 4d 45 20 78 3b 0a 20 20 20 20 6f 73 47 65 74  IME x;.    osGet
20d70 53 79 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a  SystemTime(&x);.
20d80 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
20d90 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  [n], &x, sizeof(
20da0 78 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  x));.    n += si
20db0 7a 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69  zeof(x);.  }.  i
20dc0 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29  f( sizeof(DWORD)
20dd0 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
20de0 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73 47 65  DWORD pid = osGe
20df0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
20e00 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  d();.    memcpy(
20e10 26 7a 42 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20  &zBuf[n], &pid, 
20e20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20  sizeof(pid));.  
20e30 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69    n += sizeof(pi
20e40 64 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  d);.  }.#if SQLI
20e50 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
20e60 28 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f  ( sizeof(ULONGLO
20e70 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  NG)<=nBuf-n ){. 
20e80 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74     ULONGLONG cnt
20e90 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e   = osGetTickCoun
20ea0 74 36 34 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70  t64();.    memcp
20eb0 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74  y(&zBuf[n], &cnt
20ec0 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a  , sizeof(cnt));.
20ed0 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
20ee0 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  cnt);.  }.#else.
20ef0 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57 4f    if( sizeof(DWO
20f00 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  RD)<=nBuf-n ){. 
20f10 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f     DWORD cnt = o
20f20 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b  sGetTickCount();
20f30 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
20f40 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65  f[n], &cnt, size
20f50 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20  of(cnt));.    n 
20f60 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a  += sizeof(cnt);.
20f70 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
20f80 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e   sizeof(LARGE_IN
20f90 54 45 47 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29  TEGER)<=nBuf-n )
20fa0 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45  {.    LARGE_INTE
20fb0 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51 75 65  GER i;.    osQue
20fc0 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
20fd0 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20 6d 65  nter(&i);.    me
20fe0 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
20ff0 69 2c 20 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20  i, sizeof(i));. 
21000 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69     n += sizeof(i
21010 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
21020 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a  return n;.}.../*
21030 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
21040 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
21050 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
21060 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
21070 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
21080 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  nSleep(sqlite3_v
21090 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69  fs *pVfs, int mi
210a0 63 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c 69 74  crosec){.  sqlit
210b0 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 28  e3_win32_sleep((
210c0 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30  microsec+999)/10
210d0 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  00);.  UNUSED_PA
210e0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
210f0 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73   return ((micros
21100 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30  ec+999)/1000)*10
21110 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  00;.}../*.** The
21120 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
21130 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
21140 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
21150 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
21160 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  as.** the number
21170 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   of seconds sinc
21180 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73  e 1970 and is us
21190 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65  ed to set the re
211a0 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  sult of.** sqlit
211b0 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
211c0 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  ) during testing
211d0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
211e0 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
211f0 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
21200 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73   = 0;  /* Fake s
21210 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65  ystem time in se
21220 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
21230 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  . */.#endif../*.
21240 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
21250 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
21260 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
21270 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
21280 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20   into *piNow.** 
21290 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
212a0 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
212b0 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
212c0 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30   times 86_400_00
212d0 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20  0.  In.** other 
212e0 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74  words, write int
212f0 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d  o *piNow the num
21300 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
21310 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75  nds since the Ju
21320 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66  lian.** epoch of
21330 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69   noon in Greenwi
21340 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32  ch on November 2
21350 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f  4, 4714 B.C acco
21360 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  rding to the.** 
21370 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72  proleptic Gregor
21380 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a  ian calendar..**
21390 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
213a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
213b0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
213c0 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69  _ERROR if the ti
213d0 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20  me and date .** 
213e0 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
213f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
21400 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
21410 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  64(sqlite3_vfs *
21420 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e  pVfs, sqlite3_in
21430 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f  t64 *piNow){.  /
21440 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63  * FILETIME struc
21450 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74  ture is a 64-bit
21460 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74   value represent
21470 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
21480 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f  f .     100-nano
21490 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73  second intervals
214a0 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31   since January 1
214b0 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30  , 1601 (= JD 230
214c0 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20  5813.5). .  */. 
214d0 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20   FILETIME ft;.  
214e0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
214f0 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69  ite3_int64 winFi
21500 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33  letimeEpoch = 23
21510 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f  058135*(sqlite3_
21520 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23  int64)8640000;.#
21530 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
21540 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  T.  static const
21550 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75   sqlite3_int64 u
21560 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35  nixEpoch = 24405
21570 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  875*(sqlite3_int
21580 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64  64)8640000;.#end
21590 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74  if.  /* 2^32 - t
215a0 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c  o avoid use of L
215b0 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69  L and warnings i
215c0 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69  n gcc */.  stati
215d0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
215e0 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56 61  int64 max32BitVa
215f0 6c 75 65 20 3d 20 0a 20 20 20 20 20 20 28 73 71  lue = .      (sq
21600 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
21610 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65  000000 + (sqlite
21620 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30  3_int64)20000000
21630 30 30 20 2b 0a 20 20 20 20 20 20 28 73 71 6c 69  00 +.      (sqli
21640 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37  te3_int64)294967
21650 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  296;..#if SQLITE
21660 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54  _OS_WINCE.  SYST
21670 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f  EMTIME time;.  o
21680 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
21690 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53  time);.  /* if S
216a0 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
216b0 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ime() fails, it 
216c0 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f  returns zero. */
216d0 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d  .  if (!osSystem
216e0 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26  TimeToFileTime(&
216f0 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20  time,&ft)){.    
21700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
21710 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  ROR;.  }.#else. 
21720 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
21730 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20  AsFileTime( &ft 
21740 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69  );.#endif..  *pi
21750 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d  Now = winFiletim
21760 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20  eEpoch +.       
21770 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33       ((((sqlite3
21780 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68  _int64)ft.dwHigh
21790 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42  DateTime)*max32B
217a0 69 74 56 61 6c 75 65 29 20 2b 20 0a 20 20 20 20  itValue) + .    
217b0 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
217c0 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c  te3_int64)ft.dwL
217d0 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c  owDateTime)/(sql
217e0 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30  ite3_int64)10000
217f0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
21800 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
21810 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
21820 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d   ){.    *piNow =
21830 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
21840 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72  nt64)sqlite3_cur
21850 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78  rent_time + unix
21860 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69  Epoch;.  }.#endi
21870 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  f.  UNUSED_PARAM
21880 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
21890 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
218a0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  }../*.** Find th
218b0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
218c0 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
218d0 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
218e0 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75   Write the.** cu
218f0 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
21900 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
21910 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  Day number into 
21920 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65  *prNow and.** re
21930 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
21940 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
21950 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
21960 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
21970 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74  c int winCurrent
21980 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
21990 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a   *pVfs, double *
219a0 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63  prNow){.  int rc
219b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
219c0 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43  4 i;.  rc = winC
219d0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
219e0 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28  pVfs, &i);.  if(
219f0 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e   !rc ){.    *prN
21a00 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e  ow = i/86400000.
21a10 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
21a20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
21a30 20 69 64 65 61 20 69 73 20 74 68 61 74 20 74 68   idea is that th
21a40 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  is function work
21a50 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61  s like a combina
21a60 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61  tion of.** GetLa
21a70 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f  stError() and Fo
21a80 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e  rmatMessage() on
21a90 20 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72   Windows (or err
21aa0 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72  no and.** strerr
21ab0 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e  or_r() on Unix).
21ac0 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   After an error 
21ad0 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  is returned by a
21ae0 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  n OS.** function
21af0 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74  , SQLite calls t
21b00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  his function wit
21b10 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20  h zBuf pointing 
21b20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f  to.** a buffer o
21b30 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68  f nBuf bytes. Th
21b40 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c  e OS layer shoul
21b50 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a  d populate the.*
21b60 2a 20 62 75 66 66 65 72 20 77 69 74 68 20 61 20  * buffer with a 
21b70 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55  nul-terminated U
21b80 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72  TF-8 encoded err
21b90 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65  or message.** de
21ba0 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73  scribing the las
21bb0 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61  t IO error to ha
21bc0 76 65 20 6f 63 63 75 72 72 65 64 20 77 69 74 68  ve occurred with
21bd0 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  in the calling.*
21be0 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  * thread..**.** 
21bf0 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  If the error mes
21c00 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67  sage is too larg
21c10 65 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69  e for the suppli
21c20 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74  ed buffer,.** it
21c30 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
21c40 61 74 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e  ated. The return
21c50 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61   value of xGetLa
21c60 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65  stError.** is ze
21c70 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  ro if the error 
21c80 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20  message fits in 
21c90 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e  the buffer, or n
21ca0 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72  on-zero.** other
21cb0 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73  wise (if the mes
21cc0 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74  sage was truncat
21cd0 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f  ed). If non-zero
21ce0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
21cf0 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
21d00 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63  necessary to inc
21d10 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72  lude the nul-ter
21d20 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65  minator characte
21d30 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70  r.** in the outp
21d40 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ut buffer..**.**
21d50 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61   Not supplying a
21d60 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
21d70 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76  will have no adv
21d80 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f  erse effect.** o
21d90 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20  n SQLite. It is 
21da0 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20  fine to have an 
21db0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
21dc0 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74  hat never.** ret
21dd0 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  urns an error me
21de0 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  ssage:.**.**   i
21df0 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  nt xGetLastError
21e00 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
21e10 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
21e20 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20  ar *zBuf){.**   
21e30 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d    assert(zBuf[0]
21e40 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20  =='\0');.**     
21e50 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d  return 0;.**   }
21e60 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69  .**.** However i
21e70 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  f an error messa
21e80 67 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20  ge is supplied, 
21e90 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72  it will be incor
21ea0 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71  porated.** by sq
21eb0 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72  lite into the er
21ec0 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61 69  ror message avai
21ed0 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65  lable to the use
21ee0 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  r using.** sqlit
21ef0 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73  e3_errmsg(), pos
21f00 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20  sibly making IO 
21f10 65 72 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f  errors easier to
21f20 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69   debug..*/.stati
21f30 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74  c int winGetLast
21f40 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
21f50 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
21f60 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
21f70 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
21f80 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
21f90 72 6e 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d  rn getLastErrorM
21fa0 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  sg(osGetLastErro
21fb0 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29  r(), nBuf, zBuf)
21fc0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
21fd0 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74  alize and deinit
21fe0 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61  ialize the opera
21ff0 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65  ting system inte
22000 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rface..*/.int sq
22010 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f  lite3_os_init(vo
22020 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71  id){.  static sq
22030 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73  lite3_vfs winVfs
22040 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20   = {.    3,     
22050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22060 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
22070 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
22080 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c  ,     /* szOsFil
22090 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41 54  e */.    MAX_PAT
220a0 48 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  H,            /*
220b0 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
220c0 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
220d0 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
220e0 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c   */.    "win32",
220f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22100 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  zName */.    0, 
22110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22120 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
22130 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20  .    winOpen,   
22140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
22150 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c  en */.    winDel
22160 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ete,           /
22170 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20  * xDelete */.   
22180 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20   winAccess,     
22190 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73        /* xAccess
221a0 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50   */.    winFullP
221b0 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  athname,     /* 
221c0 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
221d0 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20  .    winDlOpen, 
221e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
221f0 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
22200 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  lError,         
22210 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a   /* xDlError */.
22220 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20      winDlSym,   
22230 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
22240 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43  ym */.    winDlC
22250 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  lose,          /
22260 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20  * xDlClose */.  
22270 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c    winRandomness,
22280 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
22290 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  mness */.    win
222a0 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
222b0 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20    /* xSleep */. 
222c0 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
222d0 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72  e,      /* xCurr
222e0 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77  entTime */.    w
222f0 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  inGetLastError, 
22300 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45      /* xGetLastE
22310 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43  rror */.    winC
22320 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c  urrentTimeInt64,
22330 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
22340 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e  Int64 */.    win
22350 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  SetSystemCall,  
22360 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43    /* xSetSystemC
22370 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  all */.    winGe
22380 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
22390 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c  /* xGetSystemCal
223a0 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74  l */.    winNext
223b0 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a  SystemCall,   /*
223c0 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c   xNextSystemCall
223d0 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 2f 2a 20 44   */.  };..  /* D
223e0 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74  ouble-check that
223f0 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20   the aSyscall[] 
22400 61 72 72 61 79 20 68 61 73 20 62 65 65 6e 20 63  array has been c
22410 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20  onstructed.  ** 
22420 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20  correctly.  See 
22430 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38  ticket [bb3a86e8
22440 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20  90c8e96ab] */.  
22450 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a  assert( ArraySiz
22460 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 37 34 20  e(aSyscall)==74 
22470 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
22480 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a  TE_OMIT_WAL.  /*
22490 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20   get memory map 
224a0 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75  allocation granu
224b0 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73  larity */.  mems
224c0 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20  et(&winSysInfo, 
224d0 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d  0, sizeof(SYSTEM
224e0 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c  _INFO));.#if SQL
224f0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f  ITE_OS_WINRT.  o
22500 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  sGetNativeSystem
22510 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f  Info(&winSysInfo
22520 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74  );.#else.  osGet
22530 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53  SystemInfo(&winS
22540 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a  ysInfo);.#endif.
22550 20 20 61 73 73 65 72 74 28 77 69 6e 53 79 73 49    assert(winSysI
22560 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
22570 47 72 61 6e 75 6c 61 72 69 74 79 20 3e 20 30 29  Granularity > 0)
22580 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
22590 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
225a0 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20 20  (&winVfs, 1);.  
225b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
225c0 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  ; .}..int sqlite
225d0 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20  3_os_end(void){ 
225e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
225f0 49 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70  INRT.  if( sleep
22600 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Obj!=NULL ){.   
22610 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73   osCloseHandle(s
22620 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c  leepObj);.    sl
22630 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20  eepObj = NULL;. 
22640 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
22650 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22660 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
22670 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a              E_OS_WIN */.