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

Artifact ce1f5db8a7bb4d6f2092b1b2cb9631bec54a6320:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43  mmon.h"../*.** C
02a0: 6f 6d 70 69 6c 69 6e 67 20 61 6e 64 20 75 73 69  ompiling and usi
02b0: 6e 67 20 57 41 4c 20 6d 6f 64 65 20 72 65 71 75  ng WAL mode requ
02c0: 69 72 65 73 20 73 65 76 65 72 61 6c 20 41 50 49  ires several API
02d0: 73 20 74 68 61 74 20 61 72 65 20 6f 6e 6c 79 0a  s that are only.
02e0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ** available in 
02f0: 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d  Windows platform
0300: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e  s based on the N
0310: 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66  T kernel..*/.#if
0320: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e   !SQLITE_OS_WINN
0330: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
0340: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 23  LITE_OMIT_WAL).#
0350: 20 65 72 72 6f 72 20 22 57 41 4c 20 6d 6f 64 65   error "WAL mode
0360: 20 72 65 71 75 69 72 65 73 20 73 75 70 70 6f 72   requires suppor
0370: 74 20 66 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f  t from the Windo
0380: 77 73 20 4e 54 20 6b 65 72 6e 65 6c 2c 20 63 6f  ws NT kernel, co
0390: 6d 70 69 6c 65 5c 0a 20 77 69 74 68 20 53 51 4c  mpile\. with SQL
03a0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 2e 22 0a 23  ITE_OMIT_WAL.".#
03b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65  endif../*.** Are
03c0: 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69 6e   most of the Win
03d0: 33 32 20 41 4e 53 49 20 41 50 49 73 20 61 76 61  32 ANSI APIs ava
03e0: 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77 69 74  ilable (i.e. wit
03f0: 68 20 63 65 72 74 61 69 6e 20 65 78 63 65 70 74  h certain except
0400: 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  ions.** based on
0410: 20 74 68 65 20 73 75 62 2d 70 6c 61 74 66 6f 72   the sub-platfor
0420: 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49  m)?.*/.#if !SQLI
0430: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
0440: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
0450: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
0460: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
0470: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72  #endif../*.** Ar
0480: 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69  e most of the Wi
0490: 6e 33 32 20 55 6e 69 63 6f 64 65 20 41 50 49 73  n32 Unicode APIs
04a0: 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e   available (i.e.
04b0: 20 77 69 74 68 20 63 65 72 74 61 69 6e 20 65 78   with certain ex
04c0: 63 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65  ceptions.** base
04d0: 64 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61  d on the sub-pla
04e0: 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 53  tform)?.*/.#if S
04f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
0500: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e  | SQLITE_OS_WINN
0510: 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  T || SQLITE_OS_W
0520: 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53  INRT.#  define S
0530: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0540: 57 49 44 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  WIDE.#endif../*.
0550: 2a 2a 20 44 6f 20 77 65 20 6e 65 65 64 20 74 6f  ** Do we need to
0560: 20 6d 61 6e 75 61 6c 6c 79 20 64 65 66 69 6e 65   manually define
0570: 20 74 68 65 20 57 69 6e 33 32 20 66 69 6c 65 20   the Win32 file 
0580: 6d 61 70 70 69 6e 67 20 41 50 49 73 20 66 6f 72  mapping APIs for
0590: 20 75 73 65 20 77 69 74 68 20 57 41 4c 0a 2a 2a   use with WAL.**
05a0: 20 6d 6f 64 65 20 28 65 2e 67 2e 20 74 68 65 73   mode (e.g. thes
05b0: 65 20 41 50 49 73 20 61 72 65 20 61 76 61 69 6c  e APIs are avail
05c0: 61 62 6c 65 20 69 6e 20 74 68 65 20 57 69 6e 64  able in the Wind
05d0: 6f 77 73 20 43 45 20 53 44 4b 3b 20 68 6f 77 65  ows CE SDK; howe
05e0: 76 65 72 2c 20 74 68 65 79 0a 2a 2a 20 61 72 65  ver, they.** are
05f0: 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
0600: 74 68 65 20 68 65 61 64 65 72 20 66 69 6c 65 29  the header file)
0610: 3f 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ?.*/.#if SQLITE_
0620: 57 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e  WIN32_FILEMAPPIN
0630: 47 5f 41 50 49 20 26 26 20 21 64 65 66 69 6e 65  G_API && !define
0640: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
0650: 4c 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66 20  L)./*.** Two of 
0660: 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  the file mapping
0670: 20 41 50 49 73 20 61 72 65 20 64 69 66 66 65 72   APIs are differ
0680: 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52 54 2e  ent under WinRT.
0690: 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69    Figure out whi
06a0: 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65 65  ch.** set we nee
06b0: 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  d..*/.#if SQLITE
06c0: 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41 53  _OS_WINRT.WINBAS
06d0: 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41  EAPI HANDLE WINA
06e0: 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70  PI CreateFileMap
06f0: 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e 44  pingFromApp(HAND
0700: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
0710: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
0720: 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e  TES, ULONG, ULON
0730: 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a 0a  G64, LPCWSTR);..
0740: 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49  WINBASEAPI LPVOI
0750: 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77  D WINAPI MapView
0760: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 48 41  OfFileFromApp(HA
0770: 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f  NDLE, ULONG, ULO
0780: 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a 23  NG64, SIZE_T);.#
0790: 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64  else.#if defined
07a0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
07b0: 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53 45 41  S_ANSI).WINBASEA
07c0: 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49  PI HANDLE WINAPI
07d0: 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
07e0: 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45  ngA(HANDLE, LPSE
07f0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
0800: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
0810: 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44  RD, DWORD, DWORD
0820: 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64 69  , LPCSTR);.#endi
0830: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
0840: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
0850: 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  SI) */..#if defi
0860: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
0870: 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e 42 41  _HAS_WIDE).WINBA
0880: 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e  SEAPI HANDLE WIN
0890: 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61  API CreateFileMa
08a0: 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20 4c  ppingW(HANDLE, L
08b0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
08c0: 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20  UTES, \.        
08d0: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57  DWORD, DWORD, DW
08e0: 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a 23  ORD, LPCWSTR);.#
08f0: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
0900: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
0910: 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e 42  S_WIDE) */..WINB
0920: 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57 49  ASEAPI LPVOID WI
0930: 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69  NAPI MapViewOfFi
0940: 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52 44  le(HANDLE, DWORD
0950: 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20  , DWORD, DWORD, 
0960: 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66 20  SIZE_T);.#endif 
0970: 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
0980: 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  RT */../*.** Thi
0990: 73 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41  s file mapping A
09a0: 50 49 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  PI is common to 
09b0: 62 6f 74 68 20 57 69 6e 33 32 20 61 6e 64 20 57  both Win32 and W
09c0: 69 6e 52 54 2e 0a 2a 2f 0a 57 49 4e 42 41 53 45  inRT..*/.WINBASE
09d0: 41 50 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20  API BOOL WINAPI 
09e0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
09f0: 4c 50 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66  LPCVOID);.#endif
0a00: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
0a10: 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49  _FILEMAPPING_API
0a20: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0a30: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 2a 2f  ITE_OMIT_WAL) */
0a40: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 20 74 6f  ../*.** Macro to
0a50: 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75   find the minimu
0a60: 6d 20 6f 66 20 74 77 6f 20 6e 75 6d 65 72 69 63  m of two numeric
0a70: 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66 6e   values..*/.#ifn
0a80: 64 65 66 20 4d 49 4e 0a 23 20 64 65 66 69 6e 65  def MIN.# define
0a90: 20 4d 49 4e 28 78 2c 79 29 20 28 28 78 29 3c 28   MIN(x,y) ((x)<(
0aa0: 79 29 3f 28 78 29 3a 28 79 29 29 0a 23 65 6e 64  y)?(x):(y)).#end
0ab0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  if../*.** Some M
0ac0: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
0ad0: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
0ae0: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
0af0: 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  def INVALID_FILE
0b00: 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65  _ATTRIBUTES.# de
0b10: 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c  fine INVALID_FIL
0b20: 45 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44  E_ATTRIBUTES ((D
0b30: 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64 69 66  WORD)-1) .#endif
0b40: 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46  ..#ifndef FILE_F
0b50: 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  LAG_MASK.# defin
0b60: 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b  e FILE_FLAG_MASK
0b70: 20 20 20 20 20 20 20 20 20 20 28 30 78 46 46 33            (0xFF3
0b80: 43 30 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23  C0000).#endif..#
0b90: 69 66 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52  ifndef FILE_ATTR
0ba0: 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66  IBUTE_MASK.# def
0bb0: 69 6e 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55  ine FILE_ATTRIBU
0bc0: 54 45 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30  TE_MASK     (0x0
0bd0: 30 30 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a  003FFF7).#endif.
0be0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0bf0: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77  OMIT_WAL./* Forw
0c00: 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a  ard references *
0c10: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0c20: 20 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20   winShm winShm; 
0c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
0c40: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
0c50: 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79  red-memory */.ty
0c60: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
0c70: 53 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f  ShmNode winShmNo
0c80: 64 65 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f  de;   /* A regio
0c90: 6e 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n of shared-memo
0ca0: 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry */.#endif../*
0cb0: 0a 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20  .** WinCE lacks 
0cc0: 6e 61 74 69 76 65 20 73 75 70 70 6f 72 74 20 66  native support f
0cd0: 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  or file locking 
0ce0: 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 66 61  so we have to fa
0cf0: 6b 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f  ke it.** with so
0d00: 6d 65 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f  me code of our o
0d10: 77 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  wn..*/.#if SQLIT
0d20: 45 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64  E_OS_WINCE.typed
0d30: 65 66 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c  ef struct winceL
0d40: 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61  ock {.  int nRea
0d50: 64 65 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  ders;       /* N
0d60: 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65 72 20  umber of reader 
0d70: 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a  locks obtained *
0d80: 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e  /.  BOOL bPendin
0d90: 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63  g;      /* Indic
0da0: 61 74 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c  ates a pending l
0db0: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
0dc0: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
0dd0: 62 52 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f  bReserved;     /
0de0: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 72 65  * Indicates a re
0df0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20  served lock has 
0e00: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
0e10: 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69  .  BOOL bExclusi
0e20: 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  ve;    /* Indica
0e30: 74 65 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  tes an exclusive
0e40: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
0e50: 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e  btained */.} win
0e60: 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a  ceLock;.#endif..
0e70: 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c  /*.** The winFil
0e80: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  e structure is a
0e90: 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c   subclass of sql
0ea0: 69 74 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69  ite3_file* speci
0eb0: 66 69 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32  fic to the win32
0ec0: 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20  .** portability 
0ed0: 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  layer..*/.typede
0ee0: 66 20 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65  f struct winFile
0ef0: 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74   winFile;.struct
0f00: 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e   winFile {.  con
0f10: 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
0f20: 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20  thods *pMethod; 
0f30: 2f 2a 2a 2a 20 4d 75 73 74 20 62 65 20 66 69 72  /*** Must be fir
0f40: 73 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65  st ***/.  sqlite
0f50: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
0f60: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 75 73 65    /* The VFS use
0f70: 64 20 74 6f 20 6f 70 65 6e 20 74 68 69 73 20 66  d to open this f
0f80: 69 6c 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ile */.  HANDLE 
0f90: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0fa0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
0fb0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c  ccessing the fil
0fc0: 65 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79  e */.  u8 lockty
0fd0: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
0fe0: 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63  * Type of lock c
0ff0: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e  urrently held on
1000: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1010: 73 68 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b  short sharedLock
1020: 42 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f  Byte;   /* Rando
1030: 6d 6c 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20  mly chosen byte 
1040: 75 73 65 64 20 61 73 20 61 20 73 68 61 72 65 64  used as a shared
1050: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74   lock */.  u8 ct
1060: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  rlFlags;        
1070: 20 20 20 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65     /* Flags.  Se
1080: 65 20 57 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f  e WINFILE_* belo
1090: 77 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  w */.  DWORD las
10a0: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f  tErrno;        /
10b0: 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
10c0: 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
10d0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23  t I/O error */.#
10e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10f0: 49 54 5f 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20  IT_WAL.  winShm 
1100: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
1110: 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20   /* Instance of 
1120: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e  shared memory on
1130: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65   this file */.#e
1140: 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 63 68 61  ndif.  const cha
1150: 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 2f  r *zPath;      /
1160: 2a 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  * Full pathname 
1170: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  of this file */.
1180: 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20    int szChunk;  
1190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75            /* Chu
11a0: 6e 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67 75 72  nk size configur
11b0: 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e  ed by FCNTL_CHUN
11c0: 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51  K_SIZE */.#if SQ
11d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11e0: 4c 50 57 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e  LPWSTR zDeleteOn
11f0: 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  Close;  /* Name 
1200: 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74  of file to delet
1210: 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a  e when closing *
1220: 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65  /.  HANDLE hMute
1230: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  x;          /* M
1240: 75 74 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e  utex used to con
1250: 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73  trol access to s
1260: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a  hared lock */  .
1270: 20 20 48 41 4e 44 4c 45 20 68 53 68 61 72 65 64    HANDLE hShared
1280: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61  ;         /* Sha
1290: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
12a0: 6e 74 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  nt used for lock
12b0: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f  ing */.  winceLo
12c0: 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20  ck local;       
12d0: 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e   /* Locks obtain
12e0: 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 61  ed by this insta
12f0: 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a  nce of winFile *
1300: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73  /.  winceLock *s
1310: 68 61 72 65 64 3b 20 20 20 20 20 20 2f 2a 20 47  hared;      /* G
1320: 6c 6f 62 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  lobal shared loc
1330: 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  k memory for the
1340: 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66   file  */.#endif
1350: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  .};../*.** Allow
1360: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69  ed values for wi
1370: 6e 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a  nFile.ctrlFlags.
1380: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
1390: 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20  LE_PERSIST_WAL  
13a0: 20 20 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72     0x04   /* Per
13b0: 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65  sistent WAL mode
13c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46   */.#define WINF
13d0: 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20  ILE_PSOW        
13e0: 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51      0x10   /* SQ
13f0: 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1400: 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a  SAFE_OVERWRITE *
1410: 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a  /../*. * The siz
1420: 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
1430: 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  used by sqlite3_
1440: 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75  win32_write_debu
1450: 67 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  g().. */.#ifndef
1460: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
1470: 47 5f 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65  G_BUF_SIZE.#  de
1480: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
1490: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20  2_DBG_BUF_SIZE  
14a0: 20 28 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a   ((int)(4096-siz
14b0: 65 6f 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e  eof(DWORD))).#en
14c0: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76  dif../*. * The v
14d0: 61 6c 75 65 20 75 73 65 64 20 77 69 74 68 20 73  alue used with s
14e0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
14f0: 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20  _directory() to 
1500: 73 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20  specify that. * 
1510: 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
1520: 72 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61  ry should be cha
1530: 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  nged.. */.#ifnde
1540: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  f SQLITE_WIN32_D
1550: 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  ATA_DIRECTORY_TY
1560: 50 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  PE.#  define SQL
1570: 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44  ITE_WIN32_DATA_D
1580: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28 31  IRECTORY_TYPE (1
1590: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
15a0: 54 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77  The value used w
15b0: 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  ith sqlite3_win3
15c0: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
15d0: 29 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61  ) to specify tha
15e0: 74 0a 20 2a 20 74 68 65 20 74 65 6d 70 6f 72 61  t. * the tempora
15f0: 72 79 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f  ry directory sho
1600: 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  uld be changed..
1610: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1620: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
1630: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20  RECTORY_TYPE.#  
1640: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
1650: 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f  N32_TEMP_DIRECTO
1660: 52 59 5f 54 59 50 45 20 28 32 29 0a 23 65 6e 64  RY_TYPE (2).#end
1670: 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d  if../*. * If com
1680: 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
1690: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f  E_WIN32_MALLOC o
16a0: 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69  n Windows, we wi
16b0: 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61  ll use the. * va
16c0: 72 69 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20  rious Win32 API 
16d0: 68 65 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69  heap functions i
16e0: 6e 73 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77  nstead of our ow
16f0: 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  n.. */.#ifdef SQ
1700: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
1710: 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73  C../*. * If this
1720: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e   is non-zero, an
1730: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
1740: 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 62  ill be created b
1750: 79 20 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e  y the native Win
1760: 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20  32. * allocator 
1770: 73 75 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72  subsystem; other
1780: 77 69 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c  wise, the defaul
1790: 74 20 70 72 6f 63 65 73 73 20 68 65 61 70 20 77  t process heap w
17a0: 69 6c 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68  ill be used.  Th
17b0: 69 73 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61  is. * setting ha
17c0: 73 20 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e  s no effect when
17d0: 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57   compiling for W
17e0: 69 6e 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c  inRT.  By defaul
17f0: 74 2c 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c  t, this is enabl
1800: 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f  ed. * and an iso
1810: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20  lated heap will 
1820: 62 65 20 63 72 65 61 74 65 64 20 74 6f 20 73 74  be created to st
1830: 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65  ore all allocate
1840: 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a  d data.. *. ****
1850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41  **********. * WA
18a0: 52 4e 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70  RNING: It is imp
18b0: 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74  ortant to note t
18c0: 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 73 65  hat when this se
18d0: 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72  tting is non-zer
18e0: 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20  o and the. *    
18f0: 20 20 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74        winMemShut
1900: 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  down function is
1910: 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79   called (e.g. by
1920: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75   the sqlite3_shu
1930: 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20  tdown. *        
1940: 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c    function), all
1950: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 61   data that was a
1960: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74  llocated using t
1970: 68 65 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70  he isolated heap
1980: 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20   will. *        
1990: 20 20 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64    be freed immed
19a0: 69 61 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61  iately and any a
19b0: 74 74 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73  ttempt to access
19c0: 20 61 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65   any of that fre
19d0: 65 64 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64  ed. *          d
19e0: 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20  ata will almost 
19f0: 63 65 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74  certainly result
1a00: 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65   in an immediate
1a10: 20 61 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f   access violatio
1a20: 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.. ************
1a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a70: 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  **. */.#ifndef S
1a80: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
1a90: 5f 43 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e  _CREATE.#  defin
1aa0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
1ab0: 45 41 50 5f 43 52 45 41 54 45 20 20 20 20 28 54  EAP_CREATE    (T
1ac0: 52 55 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  RUE).#endif../*.
1ad0: 20 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73   * The initial s
1ae0: 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ize of the Win32
1af0: 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20  -specific heap. 
1b00: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
1b10: 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66  be zero.. */.#if
1b20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
1b30: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
1b40: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
1b50: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
1b60: 54 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45 5f  T_SIZE ((SQLITE_
1b70: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
1b80: 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20  ZE) * \.        
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1bb0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
1bc0: 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 34  AGE_SIZE) + 4194
1bd0: 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  304).#endif../*.
1be0: 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73   * The maximum s
1bf0: 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ize of the Win32
1c00: 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20  -specific heap. 
1c10: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
1c20: 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66  be zero.. */.#if
1c30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
1c40: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a  2_HEAP_MAX_SIZE.
1c50: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
1c60: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
1c70: 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69 66  SIZE  (0).#endif
1c80: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72  ../*. * The extr
1c90: 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69  a flags to use i
1ca0: 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57  n calls to the W
1cb0: 69 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e 20  in32 heap APIs. 
1cc0: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
1cd0: 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74  be. * zero for t
1ce0: 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76  he default behav
1cf0: 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ior.. */.#ifndef
1d00: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
1d10: 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69  AP_FLAGS.#  defi
1d20: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
1d30: 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20 28  HEAP_FLAGS     (
1d40: 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0).#endif../*.**
1d50: 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61 20   The winMemData 
1d60: 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65 73  structure stores
1d70: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71   information req
1d80: 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69 6e  uired by the Win
1d90: 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 73  32-specific.** s
1da0: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
1db0: 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ds implementatio
1dc0: 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  n..*/.typedef st
1dd0: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
1de0: 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72 75  winMemData;.stru
1df0: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b 0a  ct winMemData {.
1e00: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1e10: 20 75 33 32 20 6d 61 67 69 63 3b 20 20 20 20 2f   u32 magic;    /
1e20: 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74  * Magic number t
1e30: 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75  o detect structu
1e40: 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a  re corruption. *
1e50: 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44 4c  /.#endif.  HANDL
1e60: 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65 20  E hHeap; /* The 
1e70: 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68 65  handle to our he
1e80: 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f  ap. */.  BOOL bO
1e90: 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65 20  wned;  /* Do we 
1ea0: 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69 2e  own the heap (i.
1eb0: 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f 6e  e. destroy it on
1ec0: 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a 7d   shutdown)? */.}
1ed0: 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
1ee0: 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d  G.#define WINMEM
1ef0: 5f 4d 41 47 49 43 20 20 20 20 20 30 78 34 32 62  _MAGIC     0x42b
1f00: 32 38 33 30 62 0a 23 65 6e 64 69 66 0a 0a 73 74  2830b.#endif..st
1f10: 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d  atic struct winM
1f20: 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64  emData win_mem_d
1f30: 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20  ata = {.#ifndef 
1f40: 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f  NDEBUG.  WINMEM_
1f50: 4d 41 47 49 43 2c 0a 23 65 6e 64 69 66 0a 20 20  MAGIC,.#endif.  
1f60: 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 7d 3b 0a 0a  NULL, FALSE.};..
1f70: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
1f80: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73  define winMemAss
1f90: 65 72 74 4d 61 67 69 63 28 29 20 61 73 73 65 72  ertMagic() asser
1fa0: 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e  t( win_mem_data.
1fb0: 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  magic==WINMEM_MA
1fc0: 47 49 43 20 29 0a 23 65 6c 73 65 0a 23 64 65 66  GIC ).#else.#def
1fd0: 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ine winMemAssert
1fe0: 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a  Magic().#endif..
1ff0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65  #define winMemGe
2000: 74 48 65 61 70 28 29 20 77 69 6e 5f 6d 65 6d 5f  tHeap() win_mem_
2010: 64 61 74 61 2e 68 48 65 61 70 0a 0a 73 74 61 74  data.hHeap..stat
2020: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d  ic void *winMemM
2030: 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73  alloc(int nBytes
2040: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
2050: 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a  inMemFree(void *
2060: 70 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20  pPrior);.static 
2070: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c  void *winMemReal
2080: 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  loc(void *pPrior
2090: 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  , int nBytes);.s
20a0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
20b0: 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73  Size(void *p);.s
20c0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
20d0: 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a  Roundup(int n);.
20e0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
20f0: 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70  mInit(void *pApp
2100: 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f  Data);.static vo
2110: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77  id winMemShutdow
2120: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  n(void *pAppData
2130: 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  );..const sqlite
2140: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73  3_mem_methods *s
2150: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
2160: 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20  2(void);.#endif 
2170: 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
2180: 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  MALLOC */../*.**
2190: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
21a0: 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d  ariable is (norm
21b0: 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61  ally) set once a
21c0: 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73  nd never changes
21d0: 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20  .** thereafter. 
21e0: 20 49 74 20 72 65 63 6f 72 64 73 20 77 68 65 74   It records whet
21f0: 68 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e  her the operatin
2200: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
2210: 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a  x.** or WinNT..*
2220: 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74  *.** 0:   Operat
2230: 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f  ing system unkno
2240: 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72  wn..** 1:   Oper
2250: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
2260: 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f  Win9x..** 2:   O
2270: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
2280: 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20  is WinNT..**.** 
2290: 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69  In order to faci
22a0: 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f  litate testing o
22b0: 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d  n a WinNT system
22c0: 2c 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75  , the test fixtu
22d0: 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c  re.** can manual
22e0: 6c 79 20 73 65 74 20 74 68 69 73 20 76 61 6c 75  ly set this valu
22f0: 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74  e to 1 to emulat
2300: 65 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72  e Win98 behavior
2310: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2320: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
2330: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b  te3_os_type = 0;
2340: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e  .#else.static in
2350: 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  t sqlite3_os_typ
2360: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 0;.#endif..#
2370: 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23  ifndef SYSCALL.#
2380: 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c    define SYSCALL
2390: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
23a0: 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  _ptr.#endif../*.
23b0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
23c0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
23d0: 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20  e on Windows CE 
23e0: 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23  or WinRT.. */..#
23f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2400: 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
2410: 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20  WINRT.#  define 
2420: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
2430: 49 28 29 20 20 20 20 20 20 20 31 0a 23 65 6e 64  I()       1.#end
2440: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73  if../*.** Many s
2450: 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20  ystem calls are 
2460: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
2470: 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63   pointer-to-func
2480: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a  tions so that.**
2490: 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65   they may be ove
24a0: 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69  rridden at runti
24b0: 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  me to facilitate
24c0: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
24d0: 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69   during.** testi
24e0: 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e  ng and sandboxin
24f0: 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  g.  The followin
2500: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68  g array holds th
2510: 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e  e names and poin
2520: 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f  ters.** to all o
2530: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
2540: 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  em calls..*/.sta
2550: 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73  tic struct win_s
2560: 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74  yscall {.  const
2570: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
2580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2590: 20 6f 66 20 74 68 65 20 73 79 74 65 6d 20 63 61   of the sytem ca
25a0: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
25b0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72  syscall_ptr pCur
25c0: 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74  rent; /* Current
25d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
25e0: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
25f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2600: 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20  tr pDefault; /* 
2610: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f  Default value */
2620: 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20  .} aSyscall[] = 
2630: 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
2640: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
2650: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
2660: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22  AreFileApisANSI"
2670: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
2680: 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73 41 4e  LL)AreFileApisAN
2690: 53 49 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  SI,         0 },
26a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72 65 46  .#else.  { "AreF
26b0: 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20  ileApisANSI",   
26c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
26d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
26f0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41  dif..#ifndef osA
2700: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 0a 23  reFileApisANSI.#
2710: 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65  define osAreFile
2720: 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28  ApisANSI ((BOOL(
2730: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
2740: 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72  Syscall[0].pCurr
2750: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
2760: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
2770: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
2780: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2790: 45 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65  E).  { "CharLowe
27a0: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
27b0: 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 4c    (SYSCALL)CharL
27c0: 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20 20 20  owerW,          
27d0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
27e0: 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c   { "CharLowerW",
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
2800: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
2830: 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65 72  fine osCharLower
2840: 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50  W ((LPWSTR(WINAP
2850: 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79 73  I*)(LPWSTR))aSys
2860: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
2870: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
2880: 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65  _WINCE && define
2890: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
28a0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68  AS_WIDE).  { "Ch
28b0: 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20 20  arUpperW",      
28c0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
28d0: 29 43 68 61 72 55 70 70 65 72 57 2c 20 20 20 20  )CharUpperW,    
28e0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
28f0: 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 55 70  else.  { "CharUp
2900: 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  perW",          
2910: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
2940: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61  f..#define osCha
2950: 72 55 70 70 65 72 57 20 28 28 4c 50 57 53 54 52  rUpperW ((LPWSTR
2960: 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52  (WINAPI*)(LPWSTR
2970: 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43  ))aSyscall[2].pC
2980: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c  urrent)..  { "Cl
2990: 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20 20 20 20  oseHandle",     
29a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
29b0: 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20  )CloseHandle,   
29c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
29d0: 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48  #define osCloseH
29e0: 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  andle ((BOOL(WIN
29f0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
2a00: 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65  yscall[3].pCurre
2a10: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
2a20: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2a30: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43 72 65  S_ANSI).  { "Cre
2a40: 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  ateFileA",      
2a50: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2a60: 43 72 65 61 74 65 46 69 6c 65 41 2c 20 20 20 20  CreateFileA,    
2a70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2a80: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
2a90: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
2aa0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2ad0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
2ae0: 74 65 46 69 6c 65 41 20 28 28 48 41 4e 44 4c 45  teFileA ((HANDLE
2af0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
2b00: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
2b10: 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49          LPSECURI
2b20: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57  TY_ATTRIBUTES,DW
2b30: 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45  ORD,DWORD,HANDLE
2b40: 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43  ))aSyscall[4].pC
2b50: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
2b60: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
2b70: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2b80: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
2b90: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57    { "CreateFileW
2ba0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
2bb0: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
2bc0: 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  leW,            
2bd0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2be0: 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20  "CreateFileW",  
2bf0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
2c00: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2c20: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2c30: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 20  e osCreateFileW 
2c40: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
2c50: 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c  )(LPCWSTR,DWORD,
2c60: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
2c70: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
2c80: 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f  IBUTES,DWORD,DWO
2c90: 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63  RD,HANDLE))aSysc
2ca0: 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29  all[5].pCurrent)
2cb0: 0a 0a 23 69 66 20 28 21 53 51 4c 49 54 45 5f 4f  ..#if (!SQLITE_O
2cc0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
2cd0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2ce0: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a 20  HAS_ANSI) && \. 
2cf0: 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28         !defined(
2d00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
2d10: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
2d20: 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20  eMappingA",     
2d30: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
2d40: 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20 20 20  FileMappingA,   
2d50: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
2d60: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
2d70: 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59  pingA",      (SY
2d80: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2da0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
2db0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
2dc0: 4d 61 70 70 69 6e 67 41 20 28 28 48 41 4e 44 4c  MappingA ((HANDL
2dd0: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  E(WINAPI*)(HANDL
2de0: 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  E,LPSECURITY_ATT
2df0: 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20  RIBUTES, \.     
2e00: 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44     DWORD,DWORD,D
2e10: 57 4f 52 44 2c 4c 50 43 53 54 52 29 29 61 53 79  WORD,LPCSTR))aSy
2e20: 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e  scall[6].pCurren
2e30: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
2e40: 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c  S_WINCE || (!SQL
2e50: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
2e60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2e70: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26  IN32_HAS_WIDE) &
2e80: 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66  & \.        !def
2e90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2ea0: 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65 61  _WAL)).  { "Crea
2eb0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c  teFileMappingW",
2ec0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
2ed0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
2ee0: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
2ef0: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
2f00: 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20  leMappingW",    
2f10: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2f40: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
2f50: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28  eFileMappingW ((
2f60: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
2f70: 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54  HANDLE,LPSECURIT
2f80: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a  Y_ATTRIBUTES, \.
2f90: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57          DWORD,DW
2fa0: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54  ORD,DWORD,LPCWST
2fb0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70  R))aSyscall[7].p
2fc0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
2fd0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
2fe0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
2ff0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3000: 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65  .  { "CreateMute
3010: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xW",            
3020: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d  (SYSCALL)CreateM
3030: 75 74 65 78 57 2c 20 20 20 20 20 20 20 20 20 20  utexW,          
3040: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3050: 20 22 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c   "CreateMutexW",
3060: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3070: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3090: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
30a0: 6e 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78  ne osCreateMutex
30b0: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
30c0: 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41  I*)(LPSECURITY_A
30d0: 54 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20  TTRIBUTES,BOOL, 
30e0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53 54  \.        LPCWST
30f0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70  R))aSyscall[8].p
3100: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3110: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3120: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
3130: 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20   "DeleteFileA", 
3140: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3150: 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41  CALL)DeleteFileA
3160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3170: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65  },.#else.  { "De
3180: 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  leteFileA",     
3190: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
31a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
31b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
31c0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
31d0: 73 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42  sDeleteFileA ((B
31e0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
31f0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  STR))aSyscall[9]
3200: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3210: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3220: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
3230: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22   { "DeleteFileW"
3240: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
3250: 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c  YSCALL)DeleteFil
3260: 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eW,             
3270: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3280: 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20  DeleteFileW",   
3290: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
32a0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
32c0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
32d0: 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28   osDeleteFileW (
32e0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
32f0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
3300: 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [10].pCurrent)..
3310: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
3320: 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  NCE.  { "FileTim
3330: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
3340: 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65  ", (SYSCALL)File
3350: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
3360: 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ime, 0 },.#else.
3370: 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c    { "FileTimeToL
3380: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28  ocalFileTime", (
3390: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
33c0: 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65  efine osFileTime
33d0: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20  ToLocalFileTime 
33e0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
33f0: 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c  CONST FILETIME*,
3400: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c   \.        LPFIL
3410: 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  ETIME))aSyscall[
3420: 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  11].pCurrent)..#
3430: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
3440: 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  CE.  { "FileTime
3450: 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  ToSystemTime",  
3460: 20 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54    (SYSCALL)FileT
3470: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c  imeToSystemTime,
3480: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3490: 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79   { "FileTimeToSy
34a0: 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53  stemTime",    (S
34b0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
34e0: 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54  fine osFileTimeT
34f0: 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f  oSystemTime ((BO
3500: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53  OL(WINAPI*)(CONS
3510: 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20  T FILETIME*, \. 
3520: 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54         LPSYSTEMT
3530: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32  IME))aSyscall[12
3540: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3550: 20 22 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65   "FlushFileBuffe
3560: 72 73 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  rs",        (SYS
3570: 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75  CALL)FlushFileBu
3580: 66 66 65 72 73 2c 20 20 20 20 20 20 20 20 30 20  ffers,        0 
3590: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c  },..#define osFl
35a0: 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 20 28  ushFileBuffers (
35b0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
35c0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
35d0: 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  13].pCurrent)..#
35e0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
35f0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
3600: 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  ).  { "FormatMes
3610: 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20  sageA",         
3620: 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74   (SYSCALL)Format
3630: 4d 65 73 73 61 67 65 41 2c 20 20 20 20 20 20 20  MessageA,       
3640: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3650: 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  { "FormatMessage
3660: 41 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  A",          (SY
3670: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3690: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
36a0: 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  ine osFormatMess
36b0: 61 67 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e  ageA ((DWORD(WIN
36c0: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56  API*)(DWORD,LPCV
36d0: 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  OID,DWORD,DWORD,
36e0: 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  LPSTR, \.       
36f0: 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29   DWORD,va_list*)
3700: 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43  )aSyscall[14].pC
3710: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3720: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3730: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
3740: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22  "FormatMessageW"
3750: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
3760: 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67  ALL)FormatMessag
3770: 65 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  eW,          0 }
3780: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72  ,.#else.  { "For
3790: 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20  matMessageW",   
37a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
37b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
37c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
37d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
37e0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28  FormatMessageW (
37f0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3800: 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57  DWORD,LPCVOID,DW
3810: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52  ORD,DWORD,LPWSTR
3820: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
3830: 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73  D,va_list*))aSys
3840: 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e  call[15].pCurren
3850: 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t)..#if !defined
3860: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41  (SQLITE_OMIT_LOA
3870: 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b  D_EXTENSION).  {
3880: 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20   "FreeLibrary", 
3890: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
38a0: 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79  CALL)FreeLibrary
38b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
38c0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72  },.#else.  { "Fr
38d0: 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  eeLibrary",     
38e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
38f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3900: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3910: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3920: 73 46 72 65 65 4c 69 62 72 61 72 79 20 28 28 42  sFreeLibrary ((B
3930: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f  OOL(WINAPI*)(HMO
3940: 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  DULE))aSyscall[1
3950: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  6].pCurrent)..  
3960: 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f  { "GetCurrentPro
3970: 63 65 73 73 49 64 22 2c 20 20 20 20 20 28 53 59  cessId",     (SY
3980: 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74  SCALL)GetCurrent
3990: 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30  ProcessId,     0
39a0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
39b0: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
39c0: 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  Id ((DWORD(WINAP
39d0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
39e0: 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[17].pCurrent)
39f0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
3a00: 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65  _WINCE && define
3a10: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3a20: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
3a30: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 22  tDiskFreeSpaceA"
3a40: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
3a50: 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  )GetDiskFreeSpac
3a60: 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  eA,       0 },.#
3a70: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73  else.  { "GetDis
3a80: 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 20 20  kFreeSpaceA",   
3a90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ab0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3ac0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3ad0: 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 20 28  DiskFreeSpaceA (
3ae0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
3af0: 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50  PCSTR,LPDWORD,LP
3b00: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c  DWORD,LPDWORD, \
3b10: 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44  .        LPDWORD
3b20: 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70  ))aSyscall[18].p
3b30: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
3b40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
3b50: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
3b60: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
3b70: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3b80: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73  IDE).  { "GetDis
3b90: 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20  kFreeSpaceW",   
3ba0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
3bb0: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20  DiskFreeSpaceW, 
3bc0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3bd0: 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65  .  { "GetDiskFre
3be0: 65 53 70 61 63 65 57 22 2c 20 20 20 20 20 20 20  eSpaceW",       
3bf0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3c20: 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b  define osGetDisk
3c30: 46 72 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f  FreeSpaceW ((BOO
3c40: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  L(WINAPI*)(LPCWS
3c50: 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f  TR,LPDWORD,LPDWO
3c60: 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20  RD,LPDWORD, \.  
3c70: 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61        LPDWORD))a
3c80: 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72  Syscall[19].pCur
3c90: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3ca0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3cb0: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47  HAS_ANSI).  { "G
3cc0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3cd0: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
3ce0: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
3cf0: 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tesA,      0 },.
3d00: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
3d10: 6c 65 41 74 74 72 69 62 75 74 65 73 41 22 2c 20  leAttributesA", 
3d20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3d50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
3d60: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
3d70: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
3d80: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
3d90: 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[20].pCurrent)
3da0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
3db0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
3dc0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3dd0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
3de0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
3df0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
3e00: 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  )GetFileAttribut
3e10: 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  esW,      0 },.#
3e20: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
3e30: 65 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20  eAttributesW",  
3e40: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3e70: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3e80: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 20  FileAttributesW 
3e90: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
3ea0: 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  (LPCWSTR))aSysca
3eb0: 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[21].pCurrent)
3ec0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
3ed0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3ee0: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c  IDE).  { "GetFil
3ef0: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c  eAttributesExW",
3f00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
3f10: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
3f20: 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  W,    0 },.#else
3f30: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
3f40: 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20  ributesExW",    
3f50: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f70: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3f80: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
3f90: 41 74 74 72 69 62 75 74 65 73 45 78 57 20 28 28  AttributesExW ((
3fa0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
3fb0: 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58  CWSTR,GET_FILEEX
3fc0: 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a  _INFO_LEVELS, \.
3fd0: 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29          LPVOID))
3fe0: 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75  aSyscall[22].pCu
3ff0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4000: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
4010: 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20   "GetFileSize", 
4020: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4030: 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65  CALL)GetFileSize
4040: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
4050: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4060: 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20  tFileSize",     
4070: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4080: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4090: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
40a0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
40b0: 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44  sGetFileSize ((D
40c0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
40d0: 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53  NDLE,LPDWORD))aS
40e0: 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72  yscall[23].pCurr
40f0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4100: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
4110: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4120: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
4130: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
4140: 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eA",        (SYS
4150: 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68  CALL)GetFullPath
4160: 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20  NameA,        0 
4170: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4180: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c  tFullPathNameA",
4190: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
41a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
41b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
41c0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
41d0: 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
41e0: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
41f0: 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c  *)(LPCSTR,DWORD,
4200: 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  LPSTR, \.       
4210: 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c   LPSTR*))aSyscal
4220: 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[24].pCurrent).
4230: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4240: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
4250: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
4260: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4270: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4280: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
4290: 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  W",        (SYSC
42a0: 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e  ALL)GetFullPathN
42b0: 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d  ameW,        0 }
42c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
42d0: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20  FullPathNameW", 
42e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
42f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4300: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4310: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4320: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
4330: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
4340: 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c  )(LPCWSTR,DWORD,
4350: 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  LPWSTR, \.      
4360: 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63    LPWSTR*))aSysc
4370: 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74  all[25].pCurrent
4380: 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45  )..  { "GetLastE
4390: 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20  rror",          
43a0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61    (SYSCALL)GetLa
43b0: 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  stError,        
43c0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
43d0: 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  e osGetLastError
43e0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
43f0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
4400: 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [26].pCurrent)..
4410: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
4420: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
4430: 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c  TENSION).#if SQL
4440: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
4450: 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41 64 64  * The GetProcAdd
4460: 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20  ressA() routine 
4470: 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
4480: 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e  e on Windows CE.
4490: 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63   */.  { "GetProc
44a0: 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20  AddressA",      
44b0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50     (SYSCALL)GetP
44c0: 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20 20  rocAddressA,    
44d0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
44e0: 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57    /* All other W
44f0: 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73  indows platforms
4500: 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63 41   expect GetProcA
4510: 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65  ddress() to take
4520: 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74  .  ** an ANSI st
4530: 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ring regardless 
4540: 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20  of the _UNICODE 
4550: 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22  setting */.  { "
4560: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22  GetProcAddressA"
4570: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
4580: 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73  LL)GetProcAddres
4590: 73 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  s,          0 },
45a0: 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20  .#endif.#else.  
45b0: 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73  { "GetProcAddres
45c0: 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  sA",         (SY
45d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
45f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4600: 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64  ine osGetProcAdd
4610: 72 65 73 73 41 20 28 28 46 41 52 50 52 4f 43 28  ressA ((FARPROC(
4620: 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45  WINAPI*)(HMODULE
4630: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53  , \.        LPCS
4640: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d  TR))aSyscall[27]
4650: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4660: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
4670: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49  .  { "GetSystemI
4680: 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20  nfo",           
4690: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
46a0: 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  emInfo,         
46b0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
46c0: 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22   "GetSystemInfo"
46d0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
46e0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4700: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4710: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e  ne osGetSystemIn
4720: 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  fo ((VOID(WINAPI
4730: 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f  *)(LPSYSTEM_INFO
4740: 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70  ))aSyscall[28].p
4750: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
4760: 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  etSystemTime",  
4770: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4780: 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c  L)GetSystemTime,
4790: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
47a0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79  .#define osGetSy
47b0: 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28  stemTime ((VOID(
47c0: 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45  WINAPI*)(LPSYSTE
47d0: 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  MTIME))aSyscall[
47e0: 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  29].pCurrent)..#
47f0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4800: 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74  NCE.  { "GetSyst
4810: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
4820: 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53  ", (SYSCALL)GetS
4830: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
4840: 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ime, 0 },.#else.
4850: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69    { "GetSystemTi
4860: 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28  meAsFileTime", (
4870: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
48a0: 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65  efine osGetSyste
48b0: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20  mTimeAsFileTime 
48c0: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
48d0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c   \.        LPFIL
48e0: 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  ETIME))aSyscall[
48f0: 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  30].pCurrent)..#
4900: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4910: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
4920: 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  ).  { "GetTempPa
4930: 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  thA",           
4940: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d   (SYSCALL)GetTem
4950: 70 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20  pPathA,         
4960: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4970: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22  { "GetTempPathA"
4980: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
4990: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
49b0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
49c0: 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74  ine osGetTempPat
49d0: 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  hA ((DWORD(WINAP
49e0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29  I*)(DWORD,LPSTR)
49f0: 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43  )aSyscall[31].pC
4a00: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4a10: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
4a20: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4a30: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4a40: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
4a50: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
4a60: 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50  SYSCALL)GetTempP
4a70: 61 74 68 57 2c 20 20 20 20 20 20 20 20 20 20 20  athW,           
4a80: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4a90: 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20  "GetTempPathW", 
4aa0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4ab0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4ad0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4ae0: 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57  e osGetTempPathW
4af0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
4b00: 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29  )(DWORD,LPWSTR))
4b10: 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75  aSyscall[32].pCu
4b20: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4b30: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
4b40: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c   "GetTickCount",
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4b60: 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e  CALL)GetTickCoun
4b70: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  t,            0 
4b80: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4b90: 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20  tTickCount",    
4ba0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4bb0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4bc0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4bd0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4be0: 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28  sGetTickCount ((
4bf0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56  DWORD(WINAPI*)(V
4c00: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33  OID))aSyscall[33
4c10: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4c20: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4c30: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
4c40: 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45    { "GetVersionE
4c50: 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  xA",           (
4c60: 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69  SYSCALL)GetVersi
4c70: 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20 20  onExA,          
4c80: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4c90: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c  "GetVersionExA",
4ca0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4cb0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4cd0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4ce0: 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78  e osGetVersionEx
4cf0: 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  A ((BOOL(WINAPI*
4d00: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  )( \.        LPO
4d10: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61  SVERSIONINFOA))a
4d20: 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72  Syscall[34].pCur
4d30: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
4d40: 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20  Alloc",         
4d50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
4d60: 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20  eapAlloc,       
4d70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
4d80: 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f  efine osHeapAllo
4d90: 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  c ((LPVOID(WINAP
4da0: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
4db0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
4dc0: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d  _T))aSyscall[35]
4dd0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4de0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
4df0: 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74 65  .  { "HeapCreate
4e00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4e10: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65  (SYSCALL)HeapCre
4e20: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
4e30: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4e40: 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20   "HeapCreate",  
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4e60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4e80: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4e90: 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65 20  ne osHeapCreate 
4ea0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
4eb0: 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20  )(DWORD,SIZE_T, 
4ec0: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
4ed0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70  ))aSyscall[36].p
4ee0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4ef0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
4f00: 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79 22   { "HeapDestroy"
4f10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4f20: 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74 72  YSCALL)HeapDestr
4f30: 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oy,             
4f40: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4f50: 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20  HeapDestroy",   
4f60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4f70: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4f90: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4fa0: 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20 28   osHeapDestroy (
4fb0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
4fc0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
4fd0: 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  37].pCurrent).. 
4fe0: 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20 20   { "HeapFree",  
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
5000: 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c  YSCALL)HeapFree,
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5030: 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28  HeapFree ((BOOL(
5040: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5050: 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53  DWORD,LPVOID))aS
5060: 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72  yscall[38].pCurr
5070: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52  ent)..  { "HeapR
5080: 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20  eAlloc",        
5090: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
50a0: 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20  apReAlloc,      
50b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
50c0: 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c  fine osHeapReAll
50d0: 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  oc ((LPVOID(WINA
50e0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
50f0: 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20  D,LPVOID, \.    
5100: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
5110: 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e  call[39].pCurren
5120: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a  t)..  { "HeapSiz
5130: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5140: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5150: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
5160: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5170: 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28  ne osHeapSize ((
5180: 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28  SIZE_T(WINAPI*)(
5190: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
51a0: 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29          LPCVOID)
51b0: 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43  )aSyscall[40].pC
51c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
51d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
51e0: 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65 22  { "HeapValidate"
51f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5200: 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61  SCALL)HeapValida
5210: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  te,            0
5220: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
5230: 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20  eapValidate",   
5240: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5250: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5260: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5270: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5280: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20 28  osHeapValidate (
5290: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
52a0: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20  ANDLE,DWORD, \. 
52b0: 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29         LPCVOID))
52c0: 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75  aSyscall[41].pCu
52d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
52e0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
52f0: 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64  _HAS_ANSI) && !d
5300: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5310: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
5320: 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  N).  { "LoadLibr
5330: 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20  aryA",          
5340: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c    (SYSCALL)LoadL
5350: 69 62 72 61 72 79 41 2c 20 20 20 20 20 20 20 20  ibraryA,        
5360: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5370: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41   { "LoadLibraryA
5380: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5390: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
53c0: 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61  fine osLoadLibra
53d0: 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49  ryA ((HMODULE(WI
53e0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
53f0: 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72  Syscall[42].pCur
5400: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5410: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
5420: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5430: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26  N32_HAS_WIDE) &&
5440: 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69   \.        !defi
5450: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5460: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
5470: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
5480: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
5490: 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72  SYSCALL)LoadLibr
54a0: 61 72 79 57 2c 20 20 20 20 20 20 20 20 20 20 20  aryW,           
54b0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
54c0: 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20  "LoadLibraryW", 
54d0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
54e0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5500: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5510: 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  e osLoadLibraryW
5520: 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50   ((HMODULE(WINAP
5530: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
5540: 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65  scall[43].pCurre
5550: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5560: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c  _OS_WINRT.  { "L
5570: 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20  ocalFree",      
5580: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5590: 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20  L)LocalFree,    
55a0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
55b0: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61 6c  #else.  { "Local
55c0: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
55d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5600: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
5610: 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c  calFree ((HLOCAL
5620: 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c  (WINAPI*)(HLOCAL
5630: 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70  ))aSyscall[44].p
5640: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5650: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
5660: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
5670: 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  RT.  { "LockFile
5680: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5690: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46    (SYSCALL)LockF
56a0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
56b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
56c0: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
56e0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0 },.#endif..#if
5710: 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a  ndef osLockFile.
5720: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69  #define osLockFi
5730: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
5740: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
5750: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
5760: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
5770: 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72  yscall[45].pCurr
5780: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
5790: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
57a0: 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45  E.  { "LockFileE
57b0: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  x",             
57c0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69   (SYSCALL)LockFi
57d0: 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20  leEx,           
57e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
57f0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  { "LockFileEx", 
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5810: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5830: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
5840: 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78  def osLockFileEx
5850: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46  .#define osLockF
5860: 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  ileEx ((BOOL(WIN
5870: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
5880: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  RD,DWORD,DWORD,D
5890: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
58a0: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
58b0: 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72  yscall[46].pCurr
58c0: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
58d0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
58e0: 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f   || (!SQLITE_OS_
58f0: 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
5900: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
5910: 4c 29 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77  L)).  { "MapView
5920: 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  OfFile",        
5930: 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56     (SYSCALL)MapV
5940: 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20  iewOfFile,      
5950: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5960: 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69    { "MapViewOfFi
5970: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  le",           (
5980: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
59b0: 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f  efine osMapViewO
59c0: 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28 57  fFile ((LPVOID(W
59d0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
59e0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
59f0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
5a00: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d  _T))aSyscall[47]
5a10: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5a20: 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  "MultiByteToWide
5a30: 43 68 61 72 22 2c 20 20 20 20 20 28 53 59 53 43  Char",     (SYSC
5a40: 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f 57  ALL)MultiByteToW
5a50: 69 64 65 43 68 61 72 2c 20 20 20 20 20 30 20 7d  ideChar,     0 }
5a60: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c  ,..#define osMul
5a70: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
5a80: 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28   ((int(WINAPI*)(
5a90: 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54  UINT,DWORD,LPCST
5aa0: 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a  R,int,LPWSTR, \.
5ab0: 20 20 20 20 20 20 20 20 69 6e 74 29 29 61 53 79          int))aSy
5ac0: 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65  scall[48].pCurre
5ad0: 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79 50  nt)..  { "QueryP
5ae0: 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
5af0: 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 65  r", (SYSCALL)Que
5b00: 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
5b10: 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66  nter, 0 },..#def
5b20: 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66 6f  ine osQueryPerfo
5b30: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 28  rmanceCounter ((
5b40: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c  BOOL(WINAPI*)( \
5b50: 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f 49  .        LARGE_I
5b60: 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63 61 6c  NTEGER*))aSyscal
5b70: 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[49].pCurrent).
5b80: 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22 2c  .  { "ReadFile",
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69 6c  (SYSCALL)ReadFil
5bb0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
5bc0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5bd0: 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f 4f  osReadFile ((BOO
5be0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
5bf0: 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c  E,LPVOID,DWORD,L
5c00: 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  PDWORD, \.      
5c10: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
5c20: 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75  aSyscall[50].pCu
5c30: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74  rrent)..  { "Set
5c40: 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  EndOfFile",     
5c50: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5c60: 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20  SetEndOfFile,   
5c70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
5c80: 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f  define osSetEndO
5c90: 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  fFile ((BOOL(WIN
5ca0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
5cb0: 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72  yscall[51].pCurr
5cc0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5cd0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
5ce0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c  SetFilePointer",
5cf0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5d00: 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  LL)SetFilePointe
5d10: 72 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  r,          0 },
5d20: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46  .#else.  { "SetF
5d30: 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20  ilePointer",    
5d40: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5d50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5d60: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5d70: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53  dif..#define osS
5d80: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 28  etFilePointer ((
5d90: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48  DWORD(WINAPI*)(H
5da0: 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47  ANDLE,LONG,PLONG
5db0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
5dc0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e  D))aSyscall[52].
5dd0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5de0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
5df0: 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20    { "Sleep",    
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5e10: 53 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20  SYSCALL)Sleep,  
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e30: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5e40: 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20  "Sleep",        
5e50: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5e60: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5e80: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5e90: 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f 49 44  e osSleep ((VOID
5ea0: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 29  (WINAPI*)(DWORD)
5eb0: 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43  )aSyscall[53].pC
5ec0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79  urrent)..  { "Sy
5ed0: 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
5ee0: 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  me",    (SYSCALL
5ef0: 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c  )SystemTimeToFil
5f00: 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a  eTime,    0 },..
5f10: 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74 65 6d  #define osSystem
5f20: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20 28  TimeToFileTime (
5f30: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43  (BOOL(WINAPI*)(C
5f40: 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d 45 2a  ONST SYSTEMTIME*
5f50: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  , \.        LPFI
5f60: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
5f70: 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [54].pCurrent)..
5f80: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5f90: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
5fa0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55 6e  OS_WINRT.  { "Un
5fb0: 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  lockFile",      
5fc0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5fd0: 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20  )UnlockFile,    
5fe0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5ff0: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  else.  { "Unlock
6000: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
6010: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6030: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6040: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e 6c  f..#ifndef osUnl
6050: 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20  ockFile.#define 
6060: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42  osUnlockFile ((B
6070: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6080: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
6090: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
60a0: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
60b0: 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  [55].pCurrent).#
60c0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49  endif..#if !SQLI
60d0: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20  TE_OS_WINCE.  { 
60e0: 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  "UnlockFileEx", 
60f0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6100: 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  ALL)UnlockFileEx
6110: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
6120: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c  ,.#else.  { "Unl
6130: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
6140: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6150: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6160: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6170: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6180: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42  UnlockFileEx ((B
6190: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
61a0: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
61b0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
61c0: 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61   LPOVERLAPPED))a
61d0: 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72  Syscall[56].pCur
61e0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
61f0: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21 64  E_OS_WINCE || !d
6200: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6210: 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 55 6e 6d  IT_WAL).  { "Unm
6220: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
6230: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6240: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  UnmapViewOfFile,
6250: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6260: 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69  lse.  { "UnmapVi
6270: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
6280: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
62b0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61  ..#define osUnma
62c0: 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f  pViewOfFile ((BO
62d0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56  OL(WINAPI*)(LPCV
62e0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37  OID))aSyscall[57
62f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6300: 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74   "WideCharToMult
6310: 69 42 79 74 65 22 2c 20 20 20 20 20 28 53 59 53  iByte",     (SYS
6320: 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d  CALL)WideCharToM
6330: 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30 20  ultiByte,     0 
6340: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69  },..#define osWi
6350: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
6360: 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  e ((int(WINAPI*)
6370: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57  (UINT,DWORD,LPCW
6380: 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e  STR,int,LPSTR,in
6390: 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  t, \.        LPC
63a0: 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73  STR,LPBOOL))aSys
63b0: 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e  call[58].pCurren
63c0: 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69  t)..  { "WriteFi
63d0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
63e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74     (SYSCALL)Writ
63f0: 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  eFile,          
6400: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6410: 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28  ne osWriteFile (
6420: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6430: 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57  ANDLE,LPCVOID,DW
6440: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
6450: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
6460: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39  PED))aSyscall[59
6470: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6480: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
6490: 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e  .  { "CreateEven
64a0: 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  tExW",          
64b0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 45  (SYSCALL)CreateE
64c0: 76 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20 20  ventExW,        
64d0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
64e0: 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57   "CreateEventExW
64f0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
6500: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6520: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6530: 6e 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74  ne osCreateEvent
6540: 45 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ExW ((HANDLE(WIN
6550: 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59  API*)(LPSECURITY
6560: 5f 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43 57  _ATTRIBUTES,LPCW
6570: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
6580: 57 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79 73  WORD,DWORD))aSys
6590: 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e  call[60].pCurren
65a0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
65b0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61  OS_WINRT.  { "Wa
65c0: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
65d0: 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  t",     (SYSCALL
65e0: 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  )WaitForSingleOb
65f0: 6a 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a 23  ject,     0 },.#
6600: 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f  else.  { "WaitFo
6610: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20  rSingleObject", 
6620: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6650: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69  f..#define osWai
6660: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
6670: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
6680: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
6690: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
66a0: 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74  all[61].pCurrent
66b0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
66c0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 74  _WINRT.  { "Wait
66d0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
66e0: 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 57  x",   (SYSCALL)W
66f0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
6700: 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65 6c  ctEx,   0 },.#el
6710: 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53  se.  { "WaitForS
6720: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20  ingleObjectEx", 
6730: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6750: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6760: 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46  .#define osWaitF
6770: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
6780: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
6790: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
67a0: 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29 29  \.        BOOL))
67b0: 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75  aSyscall[62].pCu
67c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
67d0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
67e0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  "SetFilePointerE
67f0: 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  x",        (SYSC
6800: 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74  ALL)SetFilePoint
6810: 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20 7d  erEx,        0 }
6820: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74  ,.#else.  { "Set
6830: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20  FilePointerEx", 
6840: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6850: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6860: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6870: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6880: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
6890: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
68a0: 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e  (HANDLE,LARGE_IN
68b0: 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20 20  TEGER, \.       
68c0: 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c   PLARGE_INTEGER,
68d0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
68e0: 36 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  63].pCurrent)..#
68f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
6900: 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49  RT.  { "GetFileI
6910: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
6920: 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29  leEx", (SYSCALL)
6930: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
6940: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30 20  onByHandleEx, 0 
6950: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
6960: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
6970: 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59  ByHandleEx", (SY
6980: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6990: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
69a0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
69b0: 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  sGetFileInformat
69c0: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28 28  ionByHandleEx ((
69d0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
69e0: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
69f0: 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e  FILE_INFO_BY_HAN
6a00: 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44  DLE_CLASS,LPVOID
6a10: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
6a20: 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [64].pCurrent)..
6a30: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
6a40: 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
6a50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
6a60: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46  .  { "MapViewOfF
6a70: 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20  ileFromApp",    
6a80: 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77  (SYSCALL)MapView
6a90: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 2c 20 20  OfFileFromApp,  
6aa0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6ab0: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46   "MapViewOfFileF
6ac0: 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53  romApp",    (SYS
6ad0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6af0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6b00: 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69  ne osMapViewOfFi
6b10: 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c 50 56 4f  leFromApp ((LPVO
6b20: 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  ID(WINAPI*)(HAND
6b30: 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34  LE,ULONG,ULONG64
6b40: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
6b50: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d  _T))aSyscall[65]
6b60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6b70: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6b80: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32    { "CreateFile2
6b90: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
6ba0: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
6bb0: 6c 65 32 2c 20 20 20 20 20 20 20 20 20 20 20 20  le2,            
6bc0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6bd0: 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20  "CreateFile2",  
6be0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6bf0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6c10: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6c20: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32 20  e osCreateFile2 
6c30: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
6c40: 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c  )(LPCWSTR,DWORD,
6c50: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
6c60: 20 20 20 20 20 20 20 4c 50 43 52 45 41 54 45 46         LPCREATEF
6c70: 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41  ILE2_EXTENDED_PA
6c80: 52 41 4d 45 54 45 52 53 29 29 61 53 79 73 63 61  RAMETERS))aSysca
6c90: 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[66].pCurrent)
6ca0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
6cb0: 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
6cc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
6cd0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
6ce0: 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c  { "LoadPackagedL
6cf0: 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 59  ibrary",     (SY
6d00: 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 67  SCALL)LoadPackag
6d10: 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20 20 30  edLibrary,     0
6d20: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
6d30: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
6d40: 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ry",     (SYSCAL
6d50: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6d60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6d70: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6d80: 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69  osLoadPackagedLi
6d90: 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c 45 28  brary ((HMODULE(
6da0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
6db0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
6dc0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e  D))aSyscall[67].
6dd0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
6de0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6df0: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
6e00: 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  64",          (S
6e10: 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f  YSCALL)GetTickCo
6e20: 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20 20 20  unt64,          
6e30: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6e40: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c  GetTickCount64",
6e50: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6e60: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6e80: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6e90: 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36   osGetTickCount6
6ea0: 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49  4 ((ULONGLONG(WI
6eb0: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
6ec0: 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65  scall[68].pCurre
6ed0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
6ee0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65  OS_WINRT.  { "Ge
6ef0: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
6f00: 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  o",     (SYSCALL
6f10: 29 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  )GetNativeSystem
6f20: 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a 23  Info,     0 },.#
6f30: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e 61 74  else.  { "GetNat
6f40: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  iveSystemInfo", 
6f50: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f70: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6f80: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
6f90: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
6fa0: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
6fb0: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59  ( \.        LPSY
6fc0: 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63  STEM_INFO))aSysc
6fd0: 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74  all[69].pCurrent
6fe0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
6ff0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
7000: 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74 70 75  ANSI).  { "Outpu
7010: 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20  tDebugStringA", 
7020: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75       (SYSCALL)Ou
7030: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
7040: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
7050: 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  e.  { "OutputDeb
7060: 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20  ugStringA",     
7070: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
70a0: 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74  #define osOutput
70b0: 44 65 62 75 67 53 74 72 69 6e 67 41 20 28 28 56  DebugStringA ((V
70c0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OID(WINAPI*)(LPC
70d0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 30  STR))aSyscall[70
70e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
70f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
7100: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
7110: 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67    { "OutputDebug
7120: 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28  StringW",      (
7130: 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65  SYSCALL)OutputDe
7140: 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20 20 20  bugStringW,     
7150: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7160: 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  "OutputDebugStri
7170: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
7180: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
71a0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
71b0: 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53  e osOutputDebugS
71c0: 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28 57 49  tringW ((VOID(WI
71d0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
71e0: 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75  aSyscall[71].pCu
71f0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
7200: 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20 20 20  ProcessHeap",   
7210: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7220: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 2c 20  GetProcessHeap, 
7230: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
7240: 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63  define osGetProc
7250: 65 73 73 48 65 61 70 20 28 28 48 41 4e 44 4c 45  essHeap ((HANDLE
7260: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
7270: 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75  aSyscall[72].pCu
7280: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7290: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
72a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
72b0: 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43 72  MIT_WAL).  { "Cr
72c0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
72d0: 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c  romApp", (SYSCAL
72e0: 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  L)CreateFileMapp
72f0: 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c  ingFromApp, 0 },
7300: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
7310: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
7320: 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29  mApp", (SYSCALL)
7330: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7340: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
7350: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
7360: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
7370: 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c 45  FromApp ((HANDLE
7380: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7390: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
73a0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
73b0: 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c  S,ULONG,ULONG64,
73c0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
73d0: 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[73].pCurrent).
73e0: 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68  .}; /* End of th
73f0: 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  e overrideable s
7400: 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a  ystem calls */..
7410: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
7420: 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  e xSetSystemCall
7430: 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c  () method of sql
7440: 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c  ite3_vfs for all
7450: 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33   of the.** "win3
7460: 32 22 20 56 46 53 65 73 2e 20 20 52 65 74 75 72  2" VFSes.  Retur
7470: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e  n SQLITE_OK opon
7480: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70   successfully up
7490: 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79  dating the.** sy
74a0: 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65  stem call pointe
74b0: 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54  r, or SQLITE_NOT
74c0: 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20 69  FOUND if there i
74d0: 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c  s no configurabl
74e0: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
74f0: 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f   named zName..*/
7500: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
7510: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
7520: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
7530: 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a  tUsed,        /*
7540: 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72   The VFS pointer
7550: 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  .  Not used */. 
7560: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
7570: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  me,            /
7580: 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d  * Name of system
7590: 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64   call to overrid
75a0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
75b0: 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46  yscall_ptr pNewF
75c0: 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  unc  /* Pointer 
75d0: 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61  to new system ca
75e0: 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20  ll value */.){. 
75f0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
7600: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
7610: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20  TE_NOTFOUND;..  
7620: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
7630: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  (pNotUsed);.  if
7640: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
7650: 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65    /* If no zName
7660: 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f   is given, resto
7670: 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61  re all system ca
7680: 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66  lls to their def
7690: 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74  ault.    ** sett
76a0: 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ings and return 
76b0: 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20  NULL.    */.    
76c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
76d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
76e0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
76f0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
7700: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
7710: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
7720: 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  .pDefault ){.   
7730: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
7740: 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73  .pCurrent = aSys
7750: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
7760: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7770: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
7780: 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63  If zName is spec
7790: 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f  ified, operate o
77a0: 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73  n only the one s
77b0: 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a  ystem call.    *
77c0: 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20  * specified..   
77d0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
77e0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
77f0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
7800: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
7810: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
7820: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
7830: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
7840: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73          if( aSys
7850: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
7860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7870: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
7880: 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c  fault = aSyscall
7890: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
78a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
78b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
78c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
78d0: 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75  Func==0 ) pNewFu
78e0: 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nc = aSyscall[i]
78f0: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
7900: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
7910: 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75  Current = pNewFu
7920: 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  nc;.        brea
7930: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
7940: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
7950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7960: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  n the value of a
7970: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
7980: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
7990: 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ame is not a.** 
79a0: 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65  recognized syste
79b0: 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55  m call name.  NU
79c0: 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  LL is also retur
79d0: 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65  ned if the syste
79e0: 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72  m call.** is cur
79f0: 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64  rently undefined
7a00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
7a10: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
7a20: 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
7a30: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
7a40: 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e  *pNotUsed,.  con
7a50: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
7a60: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
7a70: 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
7a80: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
7a90: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
7aa0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
7ab0: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
7ac0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
7ad0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
7ae0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
7af0: 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
7b00: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
7b10: 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrent;.  }.  ret
7b20: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7b30: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
7b40: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
7b50: 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a  tem call after z
7b60: 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d  Name.  If zName=
7b70: 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65  =NULL.** then re
7b80: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
7b90: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
7ba0: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
7bb0: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a  NULL if zName.**
7bc0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73   is the last sys
7bd0: 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a  tem call or if z
7be0: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Name is not the 
7bf0: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a  name of a valid.
7c00: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  ** system call..
7c10: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
7c20: 63 68 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73  char *winNextSys
7c30: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
7c40: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
7c50: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
7c60: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
7c70: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
7c80: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
7c90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7ca0: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
7cb0: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
7cc0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
7cd0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
7ce0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
7cf0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
7d00: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
7d10: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
7d20: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
7d30: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
7d40: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
7d50: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
7d60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
7d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
7d80: 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73  function outputs
7d90: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 28   the specified (
7da0: 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20  ANSI) string to 
7db0: 74 68 65 20 57 69 6e 33 32 20 64 65 62 75 67 67  the Win32 debugg
7dc0: 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61  er.** (if availa
7dd0: 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73  ble)..*/..void s
7de0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69  qlite3_win32_wri
7df0: 74 65 5f 64 65 62 75 67 28 63 68 61 72 20 2a 7a  te_debug(char *z
7e00: 42 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a  Buf, int nBuf){.
7e10: 20 20 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53    char zDbgBuf[S
7e20: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
7e30: 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  BUF_SIZE];.  int
7e40: 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66   nMin = MIN(nBuf
7e50: 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  , (SQLITE_WIN32_
7e60: 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31  DBG_BUF_SIZE - 1
7e70: 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65  )); /* may be ne
7e80: 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28  gative. */.  if(
7e90: 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20   nMin<-1 ) nMin 
7ea0: 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67  = -1; /* all neg
7eb0: 61 74 69 76 65 20 76 61 6c 75 65 73 20 62 65 63  ative values bec
7ec0: 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73  ome -1. */.  ass
7ed0: 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c  ert( nMin==-1 ||
7ee0: 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e   nMin==0 || nMin
7ef0: 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42  <SQLITE_WIN32_DB
7f00: 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69  G_BUF_SIZE );.#i
7f10: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
7f20: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
7f30: 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b  .  if( nMin>0 ){
7f40: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67  .    memset(zDbg
7f50: 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57  Buf, 0, SQLITE_W
7f60: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
7f70: 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  E);.    memcpy(z
7f80: 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d  DbgBuf, zBuf, nM
7f90: 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75  in);.    osOutpu
7fa0: 74 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 44  tDebugStringA(zD
7fb0: 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  bgBuf);.  }else{
7fc0: 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62  .    osOutputDeb
7fd0: 75 67 53 74 72 69 6e 67 41 28 7a 42 75 66 29 3b  ugStringA(zBuf);
7fe0: 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e  .  }.#elif defin
7ff0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
8000: 48 41 53 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73  HAS_WIDE).  mems
8010: 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53  et(zDbgBuf, 0, S
8020: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
8030: 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20  BUF_SIZE);.  if 
8040: 28 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  ( osMultiByteToW
8050: 69 64 65 43 68 61 72 28 0a 20 20 20 20 20 20 20  ideChar(.       
8060: 20 20 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73     osAreFileApis
8070: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
8080: 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a  : CP_OEMCP, 0, z
8090: 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  Buf,.          n
80a0: 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a 44 62  Min, (LPWSTR)zDb
80b0: 67 42 75 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e  gBuf, SQLITE_WIN
80c0: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f  32_DBG_BUF_SIZE/
80d0: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3c 3d  sizeof(WCHAR))<=
80e0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
80f0: 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44  .  }.  osOutputD
8100: 65 62 75 67 53 74 72 69 6e 67 57 28 28 4c 50 43  ebugStringW((LPC
8110: 57 53 54 52 29 7a 44 62 67 42 75 66 29 3b 0a 23  WSTR)zDbgBuf);.#
8120: 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e  else.  if( nMin>
8130: 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
8140: 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49  zDbgBuf, 0, SQLI
8150: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
8160: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63  _SIZE);.    memc
8170: 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66  py(zDbgBuf, zBuf
8180: 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72  , nMin);.    fpr
8190: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
81a0: 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d  ", zDbgBuf);.  }
81b0: 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74  else{.    fprint
81c0: 66 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20  f(stderr, "%s", 
81d0: 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  zBuf);.  }.#endi
81e0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  f.}../*.** The f
81f0: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
8200: 20 73 75 73 70 65 6e 64 73 20 74 68 65 20 63 75   suspends the cu
8210: 72 72 65 6e 74 20 74 68 72 65 61 64 20 66 6f 72  rrent thread for
8220: 20 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20   at least ms.** 
8230: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54  milliseconds.  T
8240: 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
8250: 74 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 53  t to the Win32 S
8260: 6c 65 65 70 28 29 20 69 6e 74 65 72 66 61 63 65  leep() interface
8270: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
8280: 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20  OS_WINRT.static 
8290: 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20  HANDLE sleepObj 
82a0: 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a  = NULL;.#endif..
82b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e  void sqlite3_win
82c0: 33 32 5f 73 6c 65 65 70 28 44 57 4f 52 44 20 6d  32_sleep(DWORD m
82d0: 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69  illiseconds){.#i
82e0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
82f0: 54 0a 20 20 69 66 20 28 20 73 6c 65 65 70 4f 62  T.  if ( sleepOb
8300: 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73  j==NULL ){.    s
8310: 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61  leepObj = osCrea
8320: 74 65 45 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c  teEventExW(NULL,
8330: 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56   NULL, CREATE_EV
8340: 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54  ENT_MANUAL_RESET
8350: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a    SYNCHRONIZE);.
8380: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 6c    }.  assert( sl
8390: 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a  eepObj!=NULL );.
83a0: 20 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c    osWaitForSingl
83b0: 65 4f 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f  eObjectEx(sleepO
83c0: 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  bj, milliseconds
83d0: 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a  , FALSE);.#else.
83e0: 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73    osSleep(millis
83f0: 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a  econds);.#endif.
8400: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8410: 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20  true (non-zero) 
8420: 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e  if we are runnin
8430: 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57  g under WinNT, W
8440: 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20  in2K, WinXP,.** 
8450: 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75 72  or WinCE.  Retur
8460: 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66  n false (zero) f
8470: 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c  or Win95, Win98,
8480: 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a   or WinME..**.**
8490: 20 48 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65   Here is an inte
84a0: 72 65 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74  resting observat
84b0: 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e  ion:  Win95, Win
84c0: 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61  98, and WinME la
84d0: 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69  ck.** the LockFi
84e0: 6c 65 45 78 28 29 20 41 50 49 2e 20 20 42 75 74  leEx() API.  But
84f0: 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74   we can still st
8500: 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67  atically link ag
8510: 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50  ainst that.** AP
8520: 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20  I as long as we 
8530: 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 68  don't call it wh
8540: 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35  en running Win95
8550: 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20  /98/ME.  A call 
8560: 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  to.** this routi
8570: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
8580: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 68  termine if the h
8590: 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38 2f  ost is Win95/98/
85a0: 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32  ME or.** WinNT/2
85b0: 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65 20  K/XP so that we 
85c0: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65  will know whethe
85d0: 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e 20  r or not we can 
85e0: 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74  safely call.** t
85f0: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
8600: 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  API..*/.#if SQLI
8610: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
8620: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23  QLITE_OS_WINRT.#
8630: 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29 20 20   define isNT()  
8640: 28 31 29 0a 23 65 6c 69 66 20 21 64 65 66 69 6e  (1).#elif !defin
8650: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
8660: 48 41 53 5f 57 49 44 45 29 0a 23 20 64 65 66 69  HAS_WIDE).# defi
8670: 6e 65 20 69 73 4e 54 28 29 20 20 28 30 29 0a 23  ne isNT()  (0).#
8680: 65 6c 73 65 0a 20 20 73 74 61 74 69 63 20 69 6e  else.  static in
8690: 74 20 69 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20  t isNT(void){.  
86a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 73    if( sqlite3_os
86b0: 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _type==0 ){.    
86c0: 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41    OSVERSIONINFOA
86d0: 20 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49   sInfo;.      sI
86e0: 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49  nfo.dwOSVersionI
86f0: 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66  nfoSize = sizeof
8700: 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 6f  (sInfo);.      o
8710: 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 28 26  sGetVersionExA(&
8720: 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  sInfo);.      sq
8730: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20  lite3_os_type = 
8740: 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d  sInfo.dwPlatform
8750: 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d  Id==VER_PLATFORM
8760: 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20  _WIN32_NT ? 2 : 
8770: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  1;.    }.    ret
8780: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  urn sqlite3_os_t
8790: 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64  ype==2;.  }.#end
87a0: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
87b0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f  E_WIN32_MALLOC./
87c0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
87d0: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a  ytes of memory..
87e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
87f0: 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74  winMemMalloc(int
8800: 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44   nBytes){.  HAND
8810: 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64  LE hHeap;.  void
8820: 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73   *p;..  winMemAs
8830: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
8840: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
8850: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
8860: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
8870: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
8880: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
8890: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
88a0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
88b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
88c0: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
88d0: 41 54 45 29 0a 20 20 61 73 73 65 72 74 20 28 20  ATE).  assert ( 
88e0: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
88f0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
8900: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
8910: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
8920: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e   assert( nBytes>
8930: 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65  =0 );.  p = osHe
8940: 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53  apAlloc(hHeap, S
8950: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
8960: 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29  _FLAGS, (SIZE_T)
8970: 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 21  nBytes);.  if( !
8980: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
8990: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
89a0: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
89b0: 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65 73  apAlloc %u bytes
89c0: 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c   (%d), heap=%p",
89d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
89e0: 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61   nBytes, osGetLa
89f0: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
8a00: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20  *)hHeap);.  }.  
8a10: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
8a20: 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a  ** Free memory..
8a30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
8a40: 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a  inMemFree(void *
8a50: 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44 4c  pPrior){.  HANDL
8a60: 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d  E hHeap;..  winM
8a70: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
8a80: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
8a90: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
8aa0: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
8ab0: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
8ac0: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
8ad0: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
8ae0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
8af0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
8b00: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
8b10: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
8b20: 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  t ( osHeapValida
8b30: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
8b40: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
8b50: 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65  S, pPrior) );.#e
8b60: 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 72 69  ndif.  if( !pPri
8b70: 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  or ) return; /* 
8b80: 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20  Passing NULL to 
8b90: 48 65 61 70 46 72 65 65 20 69 73 20 75 6e 64 65  HeapFree is unde
8ba0: 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  fined. */.  if( 
8bb0: 21 6f 73 48 65 61 70 46 72 65 65 28 68 48 65 61  !osHeapFree(hHea
8bc0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
8bd0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
8be0: 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  or) ){.    sqlit
8bf0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
8c00: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
8c10: 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25  HeapFree block %
8c20: 70 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22  p (%d), heap=%p"
8c30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8c40: 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c    pPrior, osGetL
8c50: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
8c60: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d  d*)hHeap);.  }.}
8c70: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
8c80: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78  he size of an ex
8c90: 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c  isting memory al
8ca0: 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
8cb0: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52  ic void *winMemR
8cc0: 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72  ealloc(void *pPr
8cd0: 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29  ior, int nBytes)
8ce0: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
8cf0: 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20  ;.  void *p;..  
8d00: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
8d10: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
8d20: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
8d30: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
8d40: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8d50: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
8d60: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
8d70: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
8d80: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
8d90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
8da0: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
8db0: 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61  ssert ( osHeapVa
8dc0: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
8dd0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
8de0: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
8df0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
8e00: 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a  t( nBytes>=0 );.
8e10: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b    if( !pPrior ){
8e20: 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41  .    p = osHeapA
8e30: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
8e40: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
8e50: 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  AGS, (SIZE_T)nBy
8e60: 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tes);.  }else{. 
8e70: 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41     p = osHeapReA
8e80: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
8e90: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
8ea0: 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49  AGS, pPrior, (SI
8eb0: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
8ec0: 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  }.  if( !p ){.  
8ed0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
8ee0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
8ef0: 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74  led to %s %u byt
8f00: 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  es (%d), heap=%p
8f10: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
8f20: 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61     pPrior ? "Hea
8f30: 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61  pReAlloc" : "Hea
8f40: 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c  pAlloc", nBytes,
8f50: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
8f60: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
8f70: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
8f80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8f90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8fa0: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  n the size of an
8fb0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c   outstanding all
8fc0: 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65  ocation, in byte
8fd0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
8fe0: 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64   winMemSize(void
8ff0: 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68   *p){.  HANDLE h
9000: 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e  Heap;.  SIZE_T n
9010: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
9020: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
9030: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
9040: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
9050: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
9060: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
9070: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
9080: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
9090: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
90a0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
90b0: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
90c0: 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48  ).  assert ( osH
90d0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
90e0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
90f0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
9100: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ) );.#endif.  if
9110: 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ( !p ) return 0;
9120: 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a  .  n = osHeapSiz
9130: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
9140: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
9150: 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28  , p);.  if( n==(
9160: 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20  SIZE_T)-1 ){.   
9170: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
9180: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
9190: 65 64 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62  ed to HeapSize b
91a0: 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c 20 68 65  lock %p (%d), he
91b0: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
91c0: 20 20 20 20 20 20 20 20 70 2c 20 6f 73 47 65 74          p, osGet
91d0: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
91e0: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20  id*)hHeap);.    
91f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
9200: 72 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d  return (int)n;.}
9210: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70  ../*.** Round up
9220: 20 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 20   a request size 
9230: 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69  to the next vali
9240: 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  d allocation siz
9250: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
9260: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69   winMemRoundup(i
9270: 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20  nt n){.  return 
9280: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  n;.}../*.** Init
9290: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
92a0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
92b0: 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69  t winMemInit(voi
92c0: 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20  d *pAppData){.  
92d0: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e  winMemData *pWin
92e0: 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65  MemData = (winMe
92f0: 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61  mData *)pAppData
9300: 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  ;..  if( !pWinMe
9310: 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 53  mData ) return S
9320: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61  QLITE_ERROR;.  a
9330: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
9340: 74 61 2d 3e 6d 61 67 69 63 3d 3d 57 49 4e 4d 45  ta->magic==WINME
9350: 4d 5f 4d 41 47 49 43 20 29 3b 0a 0a 23 69 66 20  M_MAGIC );..#if 
9360: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
9370: 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   && SQLITE_WIN32
9380: 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20 20 69  _HEAP_CREATE.  i
9390: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  f( !pWinMemData-
93a0: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 70 57  >hHeap ){.    pW
93b0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
93c0: 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74 65 28   = osHeapCreate(
93d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
93e0: 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20  P_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 53                 S
9410: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
9420: 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a 20 20 20 20  _INIT_SIZE,.    
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9450: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48    SQLITE_WIN32_H
9460: 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a 20  EAP_MAX_SIZE);. 
9470: 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44     if( !pWinMemD
9480: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
9490: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
94a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20  SQLITE_NOMEM,.  
94b0: 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20          "failed 
94c0: 74 6f 20 48 65 61 70 43 72 65 61 74 65 20 28 25  to HeapCreate (%
94d0: 64 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69 6e  d), flags=%u, in
94e0: 69 74 53 69 7a 65 3d 25 75 2c 20 6d 61 78 53 69  itSize=%u, maxSi
94f0: 7a 65 3d 25 75 22 2c 0a 20 20 20 20 20 20 20 20  ze=%u",.        
9500: 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
9510: 28 29 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  (), SQLITE_WIN32
9520: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20  _HEAP_FLAGS,.   
9530: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
9540: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49  N32_HEAP_INIT_SI
9550: 5a 45 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ZE, SQLITE_WIN32
9560: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29 3b  _HEAP_MAX_SIZE);
9570: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9580: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
9590: 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74  }.    pWinMemDat
95a0: 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55 45  a->bOwned = TRUE
95b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  ;.    assert( pW
95c0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
95d0: 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  d );.  }.#else. 
95e0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
95f0: 65 61 70 20 3d 20 6f 73 47 65 74 50 72 6f 63 65  eap = osGetProce
9600: 73 73 48 65 61 70 28 29 3b 0a 20 20 69 66 28 20  ssHeap();.  if( 
9610: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
9620: 65 61 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eap ){.    sqlit
9630: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
9640: 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 22 66 61  MEM,.        "fa
9650: 69 6c 65 64 20 74 6f 20 47 65 74 50 72 6f 63 65  iled to GetProce
9660: 73 73 48 65 61 70 20 28 25 64 29 22 2c 20 6f 73  ssHeap (%d)", os
9670: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b  GetLastError());
9680: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9690: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
96a0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
96b0: 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 61  ned = FALSE;.  a
96c0: 73 73 65 72 74 28 20 21 70 57 69 6e 4d 65 6d 44  ssert( !pWinMemD
96d0: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 23  ata->bOwned );.#
96e0: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
96f0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
9700: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
9710: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
9720: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
9730: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
9740: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
9750: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
9760: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
9770: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
9780: 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c  ssert( osHeapVal
9790: 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74  idate(pWinMemDat
97a0: 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45  a->hHeap, SQLITE
97b0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
97c0: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
97d0: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
97e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
97f0: 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  Deinitialize thi
9800: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
9810: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53  tic void winMemS
9820: 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41  hutdown(void *pA
9830: 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65  ppData){.  winMe
9840: 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61  mData *pWinMemDa
9850: 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61  ta = (winMemData
9860: 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20   *)pAppData;..  
9870: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
9880: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
9890: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
98a0: 65 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eap ){.    asser
98b0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
98c0: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
98d0: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
98e0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
98f0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
9900: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
9910: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 20  OC_VALIDATE).   
9920: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
9930: 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44  alidate(pWinMemD
9940: 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49  ata->hHeap, SQLI
9950: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
9960: 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65  AGS, NULL) );.#e
9970: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 57 69  ndif.    if( pWi
9980: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
9990: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f   ){.      if( !o
99a0: 73 48 65 61 70 44 65 73 74 72 6f 79 28 70 57 69  sHeapDestroy(pWi
99b0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29  nMemData->hHeap)
99c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
99d0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
99e0: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
99f0: 20 48 65 61 70 44 65 73 74 72 6f 79 20 28 25 64   HeapDestroy (%d
9a00: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a20: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
9a30: 29 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65  ), (void*)pWinMe
9a40: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20  mData->hHeap);. 
9a50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69       }.      pWi
9a60: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
9a70: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
9a80: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
9a90: 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20  >hHeap = NULL;. 
9aa0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75   }.}../*.** Popu
9ab0: 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76  late the low-lev
9ac0: 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  el memory alloca
9ad0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f  tion function po
9ae0: 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c  inters in.** sql
9af0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
9b00: 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73  .m with pointers
9b10: 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73   to the routines
9b20: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54   in this file. T
9b30: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  he.** arguments 
9b40: 73 70 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63  specify the bloc
9b50: 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d  k of memory to m
9b60: 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  anage..**.** Thi
9b70: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
9b80: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
9b90: 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e  te3_config(), an
9ba0: 64 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69  d therefore.** i
9bb0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
9bc0: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 20  o be threadsafe 
9bd0: 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a  (it is not)..*/.
9be0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
9bf0: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
9c00: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
9c10: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
9c20: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
9c30: 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65  methods winMemMe
9c40: 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69  thods = {.    wi
9c50: 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20  nMemMalloc,.    
9c60: 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20  winMemFree,.    
9c70: 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20  winMemRealloc,. 
9c80: 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20     winMemSize,. 
9c90: 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70     winMemRoundup
9ca0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74  ,.    winMemInit
9cb0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74  ,.    winMemShut
9cc0: 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d  down,.    &win_m
9cd0: 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72  em_data.  };.  r
9ce0: 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74  eturn &winMemMet
9cf0: 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71  hods;.}..void sq
9d00: 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75  lite3MemSetDefau
9d10: 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  lt(void){.  sqli
9d20: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
9d30: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c  E_CONFIG_MALLOC,
9d40: 20 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69   sqlite3MemGetWi
9d50: 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  n32());.}.#endif
9d60: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
9d70: 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a  _MALLOC */../*.*
9d80: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
9d90: 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72  8 string to Micr
9da0: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55  osoft Unicode (U
9db0: 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20  TF-16?). .**.** 
9dc0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
9dd0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
9de0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
9df0: 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74  om malloc..*/.st
9e00: 61 74 69 63 20 4c 50 57 53 54 52 20 75 74 66 38  atic LPWSTR utf8
9e10: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
9e20: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
9e30: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20  {.  int nChar;. 
9e40: 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c   LPWSTR zWideFil
9e50: 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20  ename;..  nChar 
9e60: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
9e70: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
9e80: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
9e90: 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69  1, NULL, 0);.  i
9ea0: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
9eb0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
9ec0: 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  .  zWideFilename
9ed0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
9ee0: 5a 65 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65  Zero( nChar*size
9ef0: 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  of(zWideFilename
9f00: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57  [0]) );.  if( zW
9f10: 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ideFilename==0 )
9f20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
9f30: 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73    }.  nChar = os
9f40: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
9f50: 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
9f60: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  zFilename, -1, z
9f70: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  WideFilename,.  
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 43                nC
9fa0: 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61  har);.  if( nCha
9fb0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
9fc0: 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69  te3_free(zWideFi
9fd0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69  lename);.    zWi
9fe0: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a  deFilename = 0;.
9ff0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69    }.  return zWi
a000: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  deFilename;.}../
a010: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63  *.** Convert Mic
a020: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74  rosoft Unicode t
a030: 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
a040: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
a050: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 0a 2a  rned string is.*
a060: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
a070: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
a080: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
a090: 20 2a 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28   *unicodeToUtf8(
a0a0: 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c  LPCWSTR zWideFil
a0b0: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
a0c0: 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  yte;.  char *zFi
a0d0: 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65  lename;..  nByte
a0e0: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
a0f0: 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38  ultiByte(CP_UTF8
a100: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
a110: 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  me, -1, 0, 0, 0,
a120: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
a130: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74   == 0 ){.    ret
a140: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
a150: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
a160: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
a170: 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  e );.  if( zFile
a180: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
a190: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
a1a0: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
a1b0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f  rToMultiByte(CP_
a1c0: 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69  UTF8, 0, zWideFi
a1d0: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c  lename, -1, zFil
a1e0: 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20  ename, nByte,.  
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
a210: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
a220: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c   == 0 ){.    sql
a230: 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e  ite3_free(zFilen
a240: 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  ame);.    zFilen
a250: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
a260: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b  eturn zFilename;
a270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
a280: 74 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67  t an ANSI string
a290: 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e   to Microsoft Un
a2a0: 69 63 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e 20  icode, based on 
a2b0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63  the.** current c
a2c0: 6f 64 65 70 61 67 65 20 73 65 74 74 69 6e 67 73  odepage settings
a2d0: 20 66 6f 72 20 66 69 6c 65 20 61 70 69 73 2e 0a   for file apis..
a2e0: 2a 2a 20 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  ** .** Space to 
a2f0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
a300: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
a310: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
a320: 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a  ite3_malloc..*/.
a330: 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 6d 62  static LPWSTR mb
a340: 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73  csToUnicode(cons
a350: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
a360: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
a370: 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 46  .  LPWSTR zMbcsF
a380: 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63  ilename;.  int c
a390: 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46  odepage = osAreF
a3a0: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20  ileApisANSI() ? 
a3b0: 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43  CP_ACP : CP_OEMC
a3c0: 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  P;..  nByte = os
a3d0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
a3e0: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
a3f0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
a400: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  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 30 29 2a 73 69 7a 65 6f 66 28        0)*sizeof(
a430: 57 43 48 41 52 29 3b 0a 20 20 69 66 28 20 6e 42  WCHAR);.  if( nB
a440: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  yte==0 ){.    re
a450: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  turn 0;.  }.  zM
a460: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71  bcsFilename = sq
a470: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
a480: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d   nByte*sizeof(zM
a490: 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20  bcsFilename[0]) 
a4a0: 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69  );.  if( zMbcsFi
a4b0: 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  lename==0 ){.   
a4c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a4d0: 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69   nByte = osMulti
a4e0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63  ByteToWideChar(c
a4f0: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c  odepage, 0, zFil
a500: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73  ename, -1, zMbcs
a510: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
a520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a530: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 29            nByte)
a540: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30  ;.  if( nByte==0
a550: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
a560: 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61  free(zMbcsFilena
a570: 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69  me);.    zMbcsFi
a580: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
a590: 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69    return zMbcsFi
a5a0: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
a5b0: 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f   Convert Microso
a5c0: 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75  ft Unicode to mu
a5d0: 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74  lti-byte charact
a5e0: 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64  er string, based
a5f0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27   on the.** user'
a600: 73 20 41 4e 53 49 20 63 6f 64 65 70 61 67 65 2e  s ANSI codepage.
a610: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
a620: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
a630: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
a640: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
a650: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
a660: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75  /.static char *u
a670: 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43  nicodeToMbcs(LPC
a680: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61  WSTR zWideFilena
a690: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  me){.  int nByte
a6a0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  ;.  char *zFilen
a6b0: 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70  ame;.  int codep
a6c0: 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41  age = osAreFileA
a6d0: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
a6e0: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a  CP : CP_OEMCP;..
a6f0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
a700: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
a710: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69  codepage, 0, zWi
a720: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
a730: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69  0, 0, 0, 0);.  i
a740: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
a750: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a760: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d   }.  zFilename =
a770: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
a780: 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  ro( nByte );.  i
a790: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
a7a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
a7b0: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
a7c0: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
a7d0: 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30  Byte(codepage, 0
a7e0: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
a7f0: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a   -1, zFilename,.
a800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a820: 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20  nByte, 0, 0);.  
a830: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
a840: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
a850: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
a860: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
a870: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
a880: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
a890: 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69  ** Convert multi
a8a0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
a8b0: 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20  tring to UTF-8. 
a8c0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
a8d0: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73  he.** returned s
a8e0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
a8f0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
a900: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72  alloc()..*/.char
a910: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
a920: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e  mbcs_to_utf8(con
a930: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
a940: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  me){.  char *zFi
a950: 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 4c 50  lenameUtf8;.  LP
a960: 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a  WSTR zTmpWide;..
a970: 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 6d 62 63    zTmpWide = mbc
a980: 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  sToUnicode(zFile
a990: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d  name);.  if( zTm
a9a0: 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pWide==0 ){.    
a9b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a9c0: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20  zFilenameUtf8 = 
a9d0: 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54  unicodeToUtf8(zT
a9e0: 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74  mpWide);.  sqlit
a9f0: 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65  e3_free(zTmpWide
aa00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c  );.  return zFil
aa10: 65 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a  enameUtf8;.}../*
aa20: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54 46 2d  .** Convert UTF-
aa30: 38 20 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63  8 to multibyte c
aa40: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e  haracter string.
aa50: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
aa60: 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64  the .** returned
aa70: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
aa80: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
aa90: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68  _malloc()..*/.ch
aaa0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33  ar *sqlite3_win3
aab0: 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63  2_utf8_to_mbcs(c
aac0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
aad0: 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  name){.  char *z
aae0: 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20  FilenameMbcs;.  
aaf0: 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b  LPWSTR zTmpWide;
ab00: 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 75  ..  zTmpWide = u
ab10: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
ab20: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
ab30: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
ab40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ab50: 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20    zFilenameMbcs 
ab60: 3d 20 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28  = unicodeToMbcs(
ab70: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c  zTmpWide);.  sql
ab80: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69  ite3_free(zTmpWi
ab90: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46  de);.  return zF
aba0: 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a  ilenameMbcs;.}..
abb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
abc0: 69 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61 74  ion sets the dat
abd0: 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 74  a directory or t
abe0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
abf0: 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a  ectory based on.
ac00: 2a 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64 20  ** the provided 
ac10: 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20  arguments.  The 
ac20: 74 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d 75  type argument mu
ac30: 73 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65 72  st be 1 in order
ac40: 20 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20 64   to set the.** d
ac50: 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72  ata directory or
ac60: 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73   2 in order to s
ac70: 65 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  et the temporary
ac80: 20 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68 65   directory.  The
ac90: 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d   zValue.** argum
aca0: 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
acb0: 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
acc0: 20 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72 65   to use.  The re
acd0: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20  turn value will 
ace0: 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  be.** SQLITE_OK 
acf0: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
ad00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
ad10: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
ad20: 79 28 44 57 4f 52 44 20 74 79 70 65 2c 20 4c 50  y(DWORD type, LP
ad30: 43 57 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20  CWSTR zValue){. 
ad40: 20 63 68 61 72 20 2a 2a 70 70 44 69 72 65 63 74   char **ppDirect
ad50: 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ory = 0;.#ifndef
ad60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ad70: 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72 63 20 3d  OINIT.  int rc =
ad80: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
ad90: 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
ada0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
adb0: 64 69 66 0a 20 20 69 66 28 20 74 79 70 65 3d 3d  dif.  if( type==
adc0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
add0: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
ade0: 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74   ){.    ppDirect
adf0: 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 64  ory = &sqlite3_d
ae00: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  ata_directory;. 
ae10: 20 7d 65 6c 73 65 20 69 66 28 20 74 79 70 65 3d   }else if( type=
ae20: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45  =SQLITE_WIN32_TE
ae30: 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  MP_DIRECTORY_TYP
ae40: 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63  E ){.    ppDirec
ae50: 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f  tory = &sqlite3_
ae60: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
ae70: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
ae80: 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 74 79  pDirectory || ty
ae90: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
aea0: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
aeb0: 54 59 50 45 0a 20 20 20 20 20 20 20 20 20 20 7c  TYPE.          |
aec0: 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  | type==SQLITE_W
aed0: 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54  IN32_TEMP_DIRECT
aee0: 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20  ORY_TYPE.  );.  
aef0: 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65 63  assert( !ppDirec
af00: 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d  tory || sqlite3M
af10: 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 2a  emdebugHasType(*
af20: 70 70 44 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d  ppDirectory, MEM
af30: 54 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20 20  TYPE_HEAP) );.  
af40: 69 66 28 20 70 70 44 69 72 65 63 74 6f 72 79 20  if( ppDirectory 
af50: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61  ){.    char *zVa
af60: 6c 75 65 55 74 66 38 20 3d 20 30 3b 0a 20 20 20  lueUtf8 = 0;.   
af70: 20 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20 7a   if( zValue && z
af80: 56 61 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20  Value[0] ){.    
af90: 20 20 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 75    zValueUtf8 = u
afa0: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61  nicodeToUtf8(zVa
afb0: 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28  lue);.      if (
afc0: 20 7a 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29   zValueUtf8==0 )
afd0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
afe0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
aff0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b000: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70   sqlite3_free(*p
b010: 70 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  pDirectory);.   
b020: 20 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20   *ppDirectory = 
b030: 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20 20 20 20  zValueUtf8;.    
b040: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b050: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
b060: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
b070: 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  /*.** The return
b080: 20 76 61 6c 75 65 20 6f 66 20 67 65 74 4c 61 73   value of getLas
b090: 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20  tErrorMsg.** is 
b0a0: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
b0b0: 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69  r message fits i
b0c0: 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72  n the buffer, or
b0d0: 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68   non-zero.** oth
b0e0: 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d  erwise (if the m
b0f0: 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63  essage was trunc
b100: 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ated)..*/.static
b110: 20 69 6e 74 20 67 65 74 4c 61 73 74 45 72 72 6f   int getLastErro
b120: 72 4d 73 67 28 44 57 4f 52 44 20 6c 61 73 74 45  rMsg(DWORD lastE
b130: 72 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 2c 20  rrno, int nBuf, 
b140: 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f  char *zBuf){.  /
b150: 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  * FormatMessage 
b160: 72 65 74 75 72 6e 73 20 30 20 6f 6e 20 66 61 69  returns 0 on fai
b170: 6c 75 72 65 2e 20 20 4f 74 68 65 72 77 69 73 65  lure.  Otherwise
b180: 20 69 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73   it.  ** returns
b190: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 54   the number of T
b1a0: 43 48 41 52 73 20 77 72 69 74 74 65 6e 20 74 6f  CHARs written to
b1b0: 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a   the output.  **
b1c0: 20 62 75 66 66 65 72 2c 20 65 78 63 6c 75 64 69   buffer, excludi
b1d0: 6e 67 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  ng the terminati
b1e0: 6e 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20  ng null char..  
b1f0: 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 4c 65 6e  */.  DWORD dwLen
b200: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f   = 0;.  char *zO
b210: 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69  ut = 0;..  if( i
b220: 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
b230: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
b240: 20 57 43 48 41 52 20 7a 54 65 6d 70 57 69 64 65   WCHAR zTempWide
b250: 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 20 2f 2a  [MAX_PATH+1]; /*
b260: 20 4e 4f 54 45 3a 20 53 6f 6d 65 77 68 61 74 20   NOTE: Somewhat 
b270: 61 72 62 69 74 72 61 72 79 2e 20 2a 2f 0a 20 20  arbitrary. */.  
b280: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
b290: 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41  atMessageW(FORMA
b2a0: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
b2b0: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
b2e0: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
b2f0: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b310: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b330: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b350: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b370: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d              zTem
b380: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
b390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3a0: 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 0a 20 20      MAX_PATH,.  
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23             0);.#
b3d0: 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54 52 20  else.    LPWSTR 
b3e0: 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c  zTempWide = NULL
b3f0: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
b400: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46  FormatMessageW(F
b410: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
b420: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
b430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
b450: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
b460: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
b490: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
b4a0: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4e0: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
b4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
b510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
b530: 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64  PWSTR) &zTempWid
b540: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b580: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  0);.#endif.    i
b590: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
b5a0: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
b5b0: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
b5c0: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
b5d0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
b5e0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
b5f0: 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ();.      zOut =
b600: 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a   unicodeToUtf8(z
b610: 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 20  TempWide);.     
b620: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
b630: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20 21  nMalloc();.#if !
b640: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
b650: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
b660: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
b670: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
b680: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
b690: 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28      osLocalFree(
b6a0: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e 64  zTempWide);.#end
b6b0: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  if.    }.  }.#if
b6c0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
b6d0: 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
b6e0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
b6f0: 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77  p = NULL;.    dw
b700: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
b710: 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45  ssageA(FORMAT_ME
b720: 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42  SSAGE_ALLOCATE_B
b730: 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20  UFFER |.        
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b750: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
b760: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
b770: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
b790: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
b7a0: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7c0: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
b7d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
b7f0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b830: 20 20 20 20 20 20 28 4c 50 53 54 52 29 20 26 7a        (LPSTR) &z
b840: 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Temp,.          
b850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b860: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64     0);.    if( d
b890: 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20  wLen > 0 ){.    
b8a0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20    /* allocate a 
b8b0: 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65  buffer and conve
b8c0: 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20  rt to UTF8 */.  
b8d0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
b8e0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
b8f0: 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c        zOut = sql
b900: 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
b910: 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a  to_utf8(zTemp);.
b920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
b930: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
b940: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
b950: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
b960: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
b970: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
b980: 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28      osLocalFree(
b990: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  zTemp);.    }.  
b9a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 30  }.#endif.  if( 0
b9b0: 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20   == dwLen ){.   
b9c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
b9d0: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f  f(nBuf, zBuf, "O
b9e0: 73 45 72 72 6f 72 20 30 78 25 78 20 28 25 75 29  sError 0x%x (%u)
b9f0: 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61  ", lastErrno, la
ba00: 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73  stErrno);.  }els
ba10: 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 61  e{.    /* copy a
ba20: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66   maximum of nBuf
ba30: 20 63 68 61 72 73 20 74 6f 20 6f 75 74 70 75 74   chars to output
ba40: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73   buffer */.    s
ba50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
ba60: 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 22  nBuf, zBuf, "%s"
ba70: 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20  , zOut);.    /* 
ba80: 66 72 65 65 20 74 68 65 20 55 54 46 38 20 62 75  free the UTF8 bu
ba90: 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ffer */.    sqli
baa0: 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
bab0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
bac0: 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  }../*.**.** This
bad0: 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c   function - winL
bae0: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 20  ogErrorAtLine() 
baf0: 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63  - is only ever c
bb00: 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61  alled via the ma
bb10: 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72  cro.** winLogErr
bb20: 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  or()..**.** This
bb30: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
bb40: 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72  ked after an err
bb50: 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20  or occurs in an 
bb60: 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  OS function..** 
bb70: 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67  It logs a messag
bb80: 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  e using sqlite3_
bb90: 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67  log() containing
bba0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
bbb0: 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63  ue of.** error c
bbc0: 6f 64 65 20 61 6e 64 2c 20 69 66 20 70 6f 73 73  ode and, if poss
bbd0: 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d  ible, the human-
bbe0: 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c  readable equival
bbf0: 65 6e 74 20 66 72 6f 6d 20 0a 2a 2a 20 46 6f 72  ent from .** For
bc00: 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  matMessage..**.*
bc10: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
bc20: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
bc30: 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20  he macro should 
bc40: 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  be the error cod
bc50: 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62  e that.** will b
bc60: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  e returned to SQ
bc70: 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54  Lite (e.g. SQLIT
bc80: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
bc90: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29  SQLITE_CANTOPEN)
bca0: 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75  . .** The two su
bcb0: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
bcc0: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ts should be the
bcd0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20   name of the OS 
bce0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
bcf0: 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68 65 20   failed and the 
bd00: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
bd10: 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20  system path, if 
bd20: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
bd30: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c  winLogError(a,b,
bd40: 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45 72 72  c,d)   winLogErr
bd50: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64  orAtLine(a,b,c,d
bd60: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69  ,__LINE__).stati
bd70: 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f  c int winLogErro
bd80: 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65  rAtLine(.  int e
bd90: 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20  rrcode,         
bda0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
bdb0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
bdc0: 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
bdd0: 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  rrno,           
bde0: 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61       /* Win32 la
bdf0: 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f  st error */.  co
be00: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be20: 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63   Name of OS func
be30: 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64  tion that failed
be40: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
be50: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
be60: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61        /* File pa
be70: 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  th associated wi
be80: 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e  th error */.  in
be90: 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20  t iLine         
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
beb0: 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d   Source line num
bec0: 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20  ber where error 
bed0: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20  occurred */.){. 
bee0: 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b   char zMsg[500];
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64 61 62   /* Human readab
bf10: 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20 2a 2f  le error text */
bf20: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
bf50: 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d  er */..  zMsg[0]
bf60: 20 3d 20 30 3b 0a 20 20 67 65 74 4c 61 73 74 45   = 0;.  getLastE
bf70: 72 72 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e  rrorMsg(lastErrn
bf80: 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c  o, sizeof(zMsg),
bf90: 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74   zMsg);.  assert
bfa0: 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54  ( errcode!=SQLIT
bfb0: 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50  E_OK );.  if( zP
bfc0: 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d  ath==0 ) zPath =
bfd0: 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   "";.  for(i=0; 
bfe0: 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b  zMsg[i] && zMsg[
bff0: 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67  i]!='\r' && zMsg
c000: 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b  [i]!='\n'; i++){
c010: 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b  }.  zMsg[i] = 0;
c020: 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65  .  sqlite3_log(e
c030: 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f  rrcode,.      "o
c040: 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28 25 64 29  s_win.c:%d: (%d)
c050: 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20   %s(%s) - %s",. 
c060: 20 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74       iLine, last
c070: 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50  Errno, zFunc, zP
c080: 61 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a  ath, zMsg.  );..
c090: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65    return errcode
c0a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e  ;.}../*.** The n
c0b0: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
c0c0: 68 61 74 20 61 20 52 65 61 64 46 69 6c 65 28 29  hat a ReadFile()
c0d0: 2c 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61  , WriteFile(), a
c0e0: 6e 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a  nd DeleteFile().
c0f0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69  ** will be retri
c100: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c  ed following a l
c110: 6f 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70  ocking error - p
c120: 72 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20 62  robably caused b
c130: 79 20 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20  y .** antivirus 
c140: 73 6f 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20  software.  Also 
c150: 74 68 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61  the initial dela
c160: 79 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  y before the fir
c170: 73 74 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65  st retry..** The
c180: 20 64 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73   delay increases
c190: 20 6c 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65   linearly with e
c1a0: 61 63 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69  ach retry..*/.#i
c1b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
c1c0: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23  32_IOERR_RETRY.#
c1d0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
c1e0: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
c1f0: 20 31 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64   10.#endif.#ifnd
c200: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
c210: 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
c220: 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  Y.# define SQLIT
c230: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
c240: 54 52 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e  TRY_DELAY 25.#en
c250: 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77  dif.static int w
c260: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20 3d  in32IoerrRetry =
c270: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
c280: 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61 74 69  ERR_RETRY;.stati
c290: 63 20 69 6e 74 20 77 69 6e 33 32 49 6f 65 72 72  c int win32Ioerr
c2a0: 52 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c  RetryDelay = SQL
c2b0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
c2c0: 52 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a  RETRY_DELAY;../*
c2d0: 0a 2a 2a 20 49 66 20 61 20 52 65 61 64 46 69 6c  .** If a ReadFil
c2e0: 65 28 29 20 6f 72 20 57 72 69 74 65 46 69 6c 65  e() or WriteFile
c2f0: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
c300: 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75   invoke this rou
c310: 74 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69  tine.** to see i
c320: 66 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72  f it should be r
c330: 65 74 72 69 65 64 2e 20 20 52 65 74 75 72 6e 20  etried.  Return 
c340: 54 52 55 45 20 74 6f 20 72 65 74 72 79 2e 20 20  TRUE to retry.  
c350: 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
c360: 74 6f 20 67 69 76 65 20 75 70 20 77 69 74 68 20  to give up with 
c370: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  an error..*/.sta
c380: 74 69 63 20 69 6e 74 20 72 65 74 72 79 49 6f 65  tic int retryIoe
c390: 72 72 28 69 6e 74 20 2a 70 6e 52 65 74 72 79 2c  rr(int *pnRetry,
c3a0: 20 44 57 4f 52 44 20 2a 70 45 72 72 6f 72 29 7b   DWORD *pError){
c3b0: 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47  .  DWORD e = osG
c3c0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
c3d0: 20 69 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77   if( *pnRetry>=w
c3e0: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20 29  in32IoerrRetry )
c3f0: 7b 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f 72  {.    if( pError
c400: 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f   ){.      *pErro
c410: 72 20 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20 20  r = e;.    }.   
c420: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
c430: 20 69 66 28 20 65 3d 3d 45 52 52 4f 52 5f 41 43   if( e==ERROR_AC
c440: 43 45 53 53 5f 44 45 4e 49 45 44 20 7c 7c 0a 20  CESS_DENIED ||. 
c450: 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f       e==ERROR_LO
c460: 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0a  CK_VIOLATION ||.
c470: 20 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 53        e==ERROR_S
c480: 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e  HARING_VIOLATION
c490: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c4a0: 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 33  win32_sleep(win3
c4b0: 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  2IoerrRetryDelay
c4c0: 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a  *(1+*pnRetry));.
c4d0: 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a      ++*pnRetry;.
c4e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
c4f0: 7d 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20 29  }.  if( pError )
c500: 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20  {.    *pError = 
c510: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
c520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20  0;.}../*.** Log 
c530: 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72  a I/O error retr
c540: 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74  y episode..*/.st
c550: 61 74 69 63 20 76 6f 69 64 20 6c 6f 67 49 6f 65  atic void logIoe
c560: 72 72 28 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a  rr(int nRetry){.
c570: 20 20 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a    if( nRetry ){.
c580: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
c590: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 0a 20  SQLITE_IOERR, . 
c5a0: 20 20 20 20 20 22 64 65 6c 61 79 65 64 20 25 64       "delayed %d
c5b0: 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72  ms for lock/shar
c5c0: 69 6e 67 20 63 6f 6e 66 6c 69 63 74 22 2c 0a 20  ing conflict",. 
c5d0: 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52       win32IoerrR
c5e0: 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79  etryDelay*nRetry
c5f0: 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 0a 20 20  *(nRetry+1)/2.  
c600: 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20    );.  }.}..#if 
c610: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
c620: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
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 0a 2a 2a 20 54 68  **********.** Th
c670: 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61  is section conta
c680: 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69 6e  ins code for Win
c690: 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 2f 2a 0a 2a  CE only..*/./*.*
c6a0: 2a 20 57 69 6e 64 6f 77 73 20 43 45 20 64 6f 65  * Windows CE doe
c6b0: 73 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63  s not have a loc
c6c0: 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f  altime() functio
c6d0: 6e 2e 20 20 53 6f 20 63 72 65 61 74 65 20 61 0a  n.  So create a.
c6e0: 2a 2a 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a  ** substitute..*
c6f0: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65  /.#include <time
c700: 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f  .h>.struct tm *_
c710: 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65  _cdecl localtime
c720: 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74  (const time_t *t
c730: 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  ).{.  static str
c740: 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45  uct tm y;.  FILE
c750: 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20  TIME uTm, lTm;. 
c760: 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b   SYSTEMTIME pTm;
c770: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
c780: 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74   t64;.  t64 = *t
c790: 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b  ;.  t64 = (t64 +
c7a0: 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 30   11644473600)*10
c7b0: 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77  000000;.  uTm.dw
c7c0: 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44  LowDateTime = (D
c7d0: 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46 46  WORD)(t64 & 0xFF
c7e0: 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64  FFFFFF);.  uTm.d
c7f0: 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28  wHighDateTime= (
c800: 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32  DWORD)(t64 >> 32
c810: 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54  );.  osFileTimeT
c820: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26  oLocalFileTime(&
c830: 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46  uTm,&lTm);.  osF
c840: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
c850: 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a  ime(&lTm,&pTm);.
c860: 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54    y.tm_year = pT
c870: 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a  m.wYear - 1900;.
c880: 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d    y.tm_mon = pTm
c890: 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79  .wMonth - 1;.  y
c8a0: 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77  .tm_wday = pTm.w
c8b0: 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74  DayOfWeek;.  y.t
c8c0: 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61  m_mday = pTm.wDa
c8d0: 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d  y;.  y.tm_hour =
c8e0: 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e   pTm.wHour;.  y.
c8f0: 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69  tm_min = pTm.wMi
c900: 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63  nute;.  y.tm_sec
c910: 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a   = pTm.wSecond;.
c920: 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 0a    return &y;.}..
c930: 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54  #define HANDLE_T
c940: 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69  O_WINFILE(a) (wi
c950: 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29  nFile*)&((char*)
c960: 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f  a)[-(int)offseto
c970: 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f  f(winFile,h)]../
c980: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c  *.** Acquire a l
c990: 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c  ock on the handl
c9a0: 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  e h.*/.static vo
c9b0: 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  id winceMutexAcq
c9c0: 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a  uire(HANDLE h){.
c9d0: 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a     DWORD dwErr;.
c9e0: 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45     do {.     dwE
c9f0: 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69  rr = osWaitForSi
ca00: 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e  ngleObject(h, IN
ca10: 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68  FINITE);.   } wh
ca20: 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57 41  ile (dwErr != WA
ca30: 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64  IT_OBJECT_0 && d
ca40: 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41  wErr != WAIT_ABA
ca50: 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a  NDONED);.}./*.**
ca60: 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20   Release a lock 
ca70: 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e 63  acquired by winc
ca80: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29 0a  eMutexAcquire().
ca90: 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65  */.#define wince
caa0: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29 20  MutexRelease(h) 
cab0: 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a  ReleaseMutex(h).
cac0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
cad0: 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72  e mutex and shar
cae0: 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66  ed memory used f
caf0: 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68  or locking in th
cb00: 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  e file.** descri
cb10: 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74  ptor pFile.*/.st
cb20: 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 43  atic BOOL winceC
cb30: 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20  reateLock(const 
cb40: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
cb50: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29   winFile *pFile)
cb60: 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b  {.  LPWSTR zTok;
cb70: 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b  .  LPWSTR zName;
cb80: 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d 20  .  BOOL bInit = 
cb90: 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d  TRUE;..  zName =
cba0: 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a   utf8ToUnicode(z
cbb0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
cbc0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
cbd0: 20 2f 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72   /* out of memor
cbe0: 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
cbf0: 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  FALSE;.  }..  /*
cc00: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
cc10: 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a  local lockdata *
cc20: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c  /.  memset(&pFil
cc30: 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a  e->local, 0, siz
cc40: 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  eof(pFile->local
cc50: 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63  ));..  /* Replac
cc60: 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65  e the backslashe
cc70: 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e  s from the filen
cc80: 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73  ame and lowercas
cc90: 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72  e it.  ** to der
cca0: 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65  ive a mutex name
ccb0: 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73  . */.  zTok = os
ccc0: 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65  CharLowerW(zName
ccd0: 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b  );.  for (;*zTok
cce0: 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66  ;zTok++){.    if
ccf0: 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29   (*zTok == '\\')
cd00: 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20   *zTok = '_';.  
cd10: 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f  }..  /* Create/o
cd20: 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75  pen the named mu
cd30: 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e  tex */.  pFile->
cd40: 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74  hMutex = osCreat
cd50: 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41  eMutexW(NULL, FA
cd60: 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  LSE, zName);.  i
cd70: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
cd80: 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  x){.    pFile->l
cd90: 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
cda0: 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
cdb0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
cdc0: 49 54 45 5f 45 52 52 4f 52 2c 20 70 46 69 6c 65  ITE_ERROR, pFile
cdd0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69  ->lastErrno, "wi
cde0: 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c  nceCreateLock1",
cdf0: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
ce00: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
ce10: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
ce20: 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f   FALSE;.  }..  /
ce30: 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75  * Acquire the mu
ce40: 74 65 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  tex before conti
ce50: 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65  nuing */.  wince
ce60: 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
ce70: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a  le->hMutex);.  .
ce80: 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e    /* Since the n
ce90: 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75  ames of named mu
cea0: 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65  texes, semaphore
ceb0: 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73  s, file mappings
cec0: 20 65 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63   etc are .  ** c
ced0: 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74  ase-sensitive, t
cee0: 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
cef0: 20 74 68 61 74 20 62 79 20 75 70 70 65 72 63 61   that by upperca
cf00: 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e  sing the mutex n
cf10: 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69  ame.  ** and usi
cf20: 6e 67 20 74 68 61 74 20 61 73 20 74 68 65 20 73  ng that as the s
cf30: 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e  hared filemappin
cf40: 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f  g name..  */.  o
cf50: 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d  sCharUpperW(zNam
cf60: 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68  e);.  pFile->hSh
cf70: 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46  ared = osCreateF
cf80: 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41  ileMappingW(INVA
cf90: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
cfa0: 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfd0: 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
cfe0: 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
cff0: 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ock),.          
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
d020: 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65  ame);  ..  /* Se
d030: 74 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e  t a flag that in
d040: 64 69 63 61 74 65 73 20 77 65 27 72 65 20 74 68  dicates we're th
d050: 65 20 66 69 72 73 74 20 74 6f 20 63 72 65 61 74  e first to creat
d060: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20  e the memory so 
d070: 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65  it .  ** must be
d080: 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65   zero-initialize
d090: 64 20 2a 2f 0a 20 20 69 66 20 28 6f 73 47 65 74  d */.  if (osGet
d0a0: 4c 61 73 74 45 72 72 6f 72 28 29 20 3d 3d 20 45  LastError() == E
d0b0: 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49  RROR_ALREADY_EXI
d0c0: 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20  STS){.    bInit 
d0d0: 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20  = FALSE;.  }..  
d0e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61  sqlite3_free(zNa
d0f0: 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  me);..  /* If we
d100: 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61   succeeded in ma
d110: 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  king the shared 
d120: 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d  memory handle, m
d130: 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 20 28  ap it. */.  if (
d140: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 7b  pFile->hShared){
d150: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72  .    pFile->shar
d160: 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a  ed = (winceLock*
d170: 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  )osMapViewOfFile
d180: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c  (pFile->hShared,
d190: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 46   .             F
d1a0: 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c  ILE_MAP_READ|FIL
d1b0: 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20  E_MAP_WRITE, 0, 
d1c0: 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
d1d0: 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66  ock));.    /* If
d1e0: 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c   mapping failed,
d1f0: 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65   close the share
d200: 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20  d memory handle 
d210: 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a  and erase it */.
d220: 20 20 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e      if (!pFile->
d230: 73 68 61 72 65 64 29 7b 0a 20 20 20 20 20 20 70  shared){.      p
d240: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
d250: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
d260: 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67  ();.      winLog
d270: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52  Error(SQLITE_ERR
d280: 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  OR, pFile->lastE
d290: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
d2a0: 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
d2b0: 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61  eLock2", zFilena
d2c0: 6d 65 29 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f  me);.      osClo
d2d0: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
d2e0: 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  hShared);.      
d2f0: 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d  pFile->hShared =
d300: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d   NULL;.    }.  }
d310: 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64  ..  /* If shared
d320: 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f   memory could no
d330: 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 68  t be created, th
d340: 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74  en close the mut
d350: 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20  ex and fail */. 
d360: 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 53 68 61   if (pFile->hSha
d370: 72 65 64 20 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20  red == NULL){.  
d380: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
d390: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
d3a0: 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48  x);.    osCloseH
d3b0: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75  andle(pFile->hMu
d3c0: 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  tex);.    pFile-
d3d0: 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  >hMutex = NULL;.
d3e0: 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45      return FALSE
d3f0: 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e  ;.  }.  .  /* In
d400: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61  itialize the sha
d410: 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65  red memory if we
d420: 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20  're supposed to 
d430: 2a 2f 0a 20 20 69 66 20 28 62 49 6e 69 74 29 20  */.  if (bInit) 
d440: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69  {.    memset(pFi
d450: 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73  le->shared, 0, s
d460: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
d470: 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d  );.  }..  winceM
d480: 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
d490: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
d4a0: 74 75 72 6e 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a  turn TRUE;.}../*
d4b0: 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20  .** Destroy the 
d4c0: 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20  part of winFile 
d4d0: 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20  that deals with 
d4e0: 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73  wince locks.*/.s
d4f0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65  tatic void wince
d500: 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46  DestroyLock(winF
d510: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
d520: 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  f (pFile->hMutex
d530: 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72  ){.    /* Acquir
d540: 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  e the mutex */. 
d550: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71     winceMutexAcq
d560: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
d570: 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ex);..    /* The
d580: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
d590: 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c  s should probabl
d5a0: 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75  y assert in debu
d5b0: 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79  g mode, but they
d5c0: 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63  .       are to c
d5d0: 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61  leanup in case a
d5e0: 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65  ny locks remaine
d5f0: 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66  d open */.    if
d600: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
d610: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
d620: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
d630: 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20  Readers --;.    
d640: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
d650: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
d660: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
d670: 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
d680: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  d = FALSE;.    }
d690: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
d6a0: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b  local.bPending){
d6b0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
d6c0: 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d  ared->bPending =
d6d0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
d6e0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
d6f0: 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a  al.bExclusive){.
d700: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
d710: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
d720: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a  = FALSE;.    }..
d730: 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65      /* De-refere
d740: 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75  nce and close ou
d750: 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68  r copy of the sh
d760: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
d770: 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61  le */.    osUnma
d780: 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c  pViewOfFile(pFil
d790: 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20  e->shared);.    
d7a0: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
d7b0: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a  ile->hShared);..
d7c0: 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68      /* Done with
d7d0: 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
d7e0: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
d7f0: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
d800: 78 29 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c  x);    .    osCl
d810: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
d820: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
d830: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
d840: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a  LL;.  }.}../* .*
d850: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
d860: 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46  ion of the LockF
d870: 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e  ile() API of Win
d880: 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73  dows for CE.*/.s
d890: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
d8a0: 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  LockFile(.  LPHA
d8b0: 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
d8c0: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
d8d0: 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
d8e0: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
d8f0: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
d900: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c  fBytesToLockLow,
d910: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
d920: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67  OfBytesToLockHig
d930: 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
d940: 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
d950: 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
d960: 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
d970: 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
d980: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
d990: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
d9a0: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
d9b0: 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
d9c0: 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a  tesToLockHigh);.
d9d0: 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
d9e0: 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
d9f0: 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
da00: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
da10: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61  Mutex);..  /* Wa
da20: 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69  nting an exclusi
da30: 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66  ve lock? */.  if
da40: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
da50: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
da60: 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20  ED_FIRST.       
da70: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
da80: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  sToLockLow == (D
da90: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
daa0: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
dab0: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
dac0: 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65  rs == 0 && pFile
dad0: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
dae0: 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
daf0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
db00: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54  ->bExclusive = T
db10: 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c  RUE;.       pFil
db20: 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
db30: 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
db40: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
db50: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
db60: 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f  /* Want a read-o
db70: 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  nly lock? */.  e
db80: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
db90: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
dba0: 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26  D)SHARED_FIRST &
dbb0: 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75  &.           nNu
dbc0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
dbd0: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
dbe0: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
dbf0: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d  d->bExclusive ==
dc00: 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   0){.      pFile
dc10: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
dc20: 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70   ++;.      if (p
dc30: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
dc40: 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20  ders == 1){.    
dc50: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
dc60: 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  d->nReaders ++;.
dc70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
dc80: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
dc90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
dca0: 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  nt a pending loc
dcb0: 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
dcc0: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
dcd0: 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49   == (DWORD)PENDI
dce0: 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d 62  NG_BYTE && nNumb
dcf0: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
dd00: 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a  ow == 1){.    /*
dd10: 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c   If no pending l
dd20: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71  ock has been acq
dd30: 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75  uired, then acqu
dd40: 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ire it */.    if
dd50: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
dd60: 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20  >bPending == 0) 
dd70: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
dd80: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
dd90: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
dda0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
ddb0: 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
ddc0: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
ddd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
dde0: 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76 65  * Want a reserve
ddf0: 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  d lock? */.  els
de00: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
de10: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
de20: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26  RESERVED_BYTE &&
de30: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
de40: 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  oLockLow == 1){.
de50: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
de60: 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64  hared->bReserved
de70: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
de80: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
de90: 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
dea0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
deb0: 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 54  al.bReserved = T
dec0: 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  RUE;.      bRetu
ded0: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
dee0: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
def0: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
df00: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
df10: 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  rn bReturn;.}../
df20: 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e  *.** An implemen
df30: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 55 6e  tation of the Un
df40: 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f 66 20  lockFile API of 
df50: 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a  Windows for CE.*
df60: 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  /.static BOOL wi
df70: 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20  nceUnlockFile(. 
df80: 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
df90: 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
dfa0: 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  OffsetLow,.  DWO
dfb0: 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48  RD dwFileOffsetH
dfc0: 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  igh,.  DWORD nNu
dfd0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
dfe0: 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  ockLow,.  DWORD 
dff0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
e000: 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20  UnlockHigh.){.  
e010: 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
e020: 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49   HANDLE_TO_WINFI
e030: 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f  LE(phFile);.  BO
e040: 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c  OL bReturn = FAL
e050: 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  SE;..  UNUSED_PA
e060: 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66  RAMETER(dwFileOf
e070: 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55  fsetHigh);.  UNU
e080: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e  SED_PARAMETER(nN
e090: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
e0a0: 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69 66  lockHigh);..  if
e0b0: 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78   (!pFile->hMutex
e0c0: 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20  ) return TRUE;. 
e0d0: 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
e0e0: 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
e0f0: 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69  );..  /* Releasi
e100: 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  ng a reader lock
e110: 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65   or an exclusive
e120: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20 28 64   lock */.  if (d
e130: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
e140: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
e150: 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a 20 44  FIRST){.    /* D
e160: 69 64 20 77 65 20 68 61 76 65 20 61 6e 20 65 78  id we have an ex
e170: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f  clusive lock? */
e180: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
e190: 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
e1a0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
e1b0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
e1c0: 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  UnlockLow == (DW
e1d0: 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29  ORD)SHARED_SIZE)
e1e0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
e1f0: 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20  ocal.bExclusive 
e200: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
e210: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
e220: 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45  xclusive = FALSE
e230: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
e240: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 0a 20  = TRUE;.    }.. 
e250: 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a 75 73     /* Did we jus
e260: 74 20 68 61 76 65 20 61 20 72 65 61 64 65 72 20  t have a reader 
e270: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65 6c 73  lock? */.    els
e280: 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63  e if (pFile->loc
e290: 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20  al.nReaders){.  
e2a0: 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62      assert(nNumb
e2b0: 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
e2c0: 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  kLow == (DWORD)S
e2d0: 48 41 52 45 44 5f 53 49 5a 45 20 7c 7c 20 6e 4e  HARED_SIZE || nN
e2e0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
e2f0: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20  lockLow == 1);. 
e300: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
e310: 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  l.nReaders --;. 
e320: 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e       if (pFile->
e330: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d  local.nReaders =
e340: 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  = 0).      {.   
e350: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
e360: 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  ed->nReaders --;
e370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
e380: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
e390: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
e3a0: 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69  eleasing a pendi
e3b0: 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73  ng lock */.  els
e3c0: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
e3d0: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
e3e0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26 26 20  PENDING_BYTE && 
e3f0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
e400: 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  UnlockLow == 1){
e410: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
e420: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b  local.bPending){
e430: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
e440: 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46  cal.bPending = F
e450: 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
e460: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
e470: 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ing = FALSE;.   
e480: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
e490: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  E;.    }.  }.  /
e4a0: 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65  * Releasing a re
e4b0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20  served lock */. 
e4c0: 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
e4d0: 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
e4e0: 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54  ORD)RESERVED_BYT
e4f0: 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79  E && nNumberOfBy
e500: 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
e510: 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46  = 1){.    if (pF
e520: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
e530: 72 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46  rved) {.      pF
e540: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
e550: 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
e560: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
e570: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46  d->bReserved = F
e580: 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74  ALSE;.      bRet
e590: 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
e5a0: 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  }.  }..  winceMu
e5b0: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
e5c0: 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
e5d0: 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f  urn bReturn;.}./
e5e0: 2a 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  *.** End of the 
e5f0: 73 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72  special code for
e600: 20 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a   wince.*********
e610: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e620: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e650: 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ****/.#endif /* 
e660: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
e670: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61  */../*.** Lock a
e680: 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f   file region..*/
e690: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
e6a0: 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  LockFile(.  LPHA
e6b0: 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
e6c0: 57 4f 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57  WORD flags,.  DW
e6d0: 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20  ORD offsetLow,. 
e6e0: 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67   DWORD offsetHig
e6f0: 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  h,.  DWORD numBy
e700: 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  tesLow,.  DWORD 
e710: 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a  numBytesHigh.){.
e720: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
e730: 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f  NCE.  /*.  ** NO
e740: 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69  TE: Windows CE i
e750: 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72  s handled differ
e760: 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69  ently here due i
e770: 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57  ts lack of the W
e780: 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20  in32.  **       
e790: 41 50 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20  API LockFile..  
e7a0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63  */.  return winc
e7b0: 65 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65  eLockFile(phFile
e7c0: 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
e7d0: 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20  setHigh,.       
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7f0: 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d  numBytesLow, num
e800: 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73  BytesHigh);.#els
e810: 65 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  e.  if( isNT() )
e820: 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  {.    OVERLAPPED
e830: 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65   ovlp;.    memse
e840: 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65  t(&ovlp, 0, size
e850: 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b  of(OVERLAPPED));
e860: 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
e870: 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20   = offsetLow;.  
e880: 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67    ovlp.OffsetHig
e890: 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a  h = offsetHigh;.
e8a0: 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63      return osLoc
e8b0: 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c  kFileEx(*phFile,
e8c0: 20 66 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79   flags, 0, numBy
e8d0: 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
e8e0: 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20  High, &ovlp);.  
e8f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
e900: 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68  n osLockFile(*ph
e910: 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
e920: 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
e930: 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e950: 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
e960: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
e970: 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  ** Unlock a file
e980: 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61   region.. */.sta
e990: 74 69 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f  tic BOOL winUnlo
e9a0: 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
e9b0: 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
e9c0: 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  RD offsetLow,.  
e9d0: 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68  DWORD offsetHigh
e9e0: 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
e9f0: 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  esLow,.  DWORD n
ea00: 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23  umBytesHigh.){.#
ea10: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
ea20: 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54  CE.  /*.  ** NOT
ea30: 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73  E: Windows CE is
ea40: 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
ea50: 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74  ntly here due it
ea60: 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69  s lack of the Wi
ea70: 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41  n32.  **       A
ea80: 50 49 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20  PI UnlockFile.. 
ea90: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e   */.  return win
eaa0: 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46  ceUnlockFile(phF
eab0: 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20  ile, offsetLow, 
eac0: 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20  offsetHigh,.    
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eae0: 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77       numBytesLow
eaf0: 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b  , numBytesHigh);
eb00: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 69 73 4e  .#else.  if( isN
eb10: 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c  T() ){.    OVERL
eb20: 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20  APPED ovlp;.    
eb30: 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c  memset(&ovlp, 0,
eb40: 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50   sizeof(OVERLAPP
eb50: 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  ED));.    ovlp.O
eb60: 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f  ffset = offsetLo
eb70: 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  w;.    ovlp.Offs
eb80: 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48  etHigh = offsetH
eb90: 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  igh;.    return 
eba0: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a  osUnlockFileEx(*
ebb0: 70 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79  phFile, 0, numBy
ebc0: 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
ebd0: 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20  High, &ovlp);.  
ebe0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
ebf0: 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a  n osUnlockFile(*
ec00: 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f  phFile, offsetLo
ec10: 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e  w, offsetHigh, n
ec20: 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20  umBytesLow,.    
ec30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec40: 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68      numBytesHigh
ec50: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
ec60: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
ec70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ec90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
ecb0: 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75  ** The next grou
ecc0: 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d  p of routines im
ecd0: 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20  plement the I/O 
ece0: 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66 69 65  methods specifie
ecf0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69  d.** by the sqli
ed00: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
ed10: 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  bject..*********
ed20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed60: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f  *****/../*.** So
ed70: 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d  me Microsoft com
ed80: 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73  pilers lack this
ed90: 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a   definition..*/.
eda0: 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f  #ifndef INVALID_
edb0: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
edc0: 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49  .# define INVALI
edd0: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
ede0: 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23  ER ((DWORD)-1).#
edf0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
ee00: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  e the current po
ee10: 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  sition of the fi
ee20: 6c 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64  le handle passed
ee30: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a   as the first .*
ee40: 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66  * argument to of
ee50: 66 73 65 74 20 69 4f 66 66 73 65 74 20 77 69 74  fset iOffset wit
ee60: 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66  hin the file. If
ee70: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
ee80: 75 72 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72  urn 0. .** Other
ee90: 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d  wise, set pFile-
eea0: 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72  >lastErrno and r
eeb0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
eec0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
eed0: 65 6b 57 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c  ekWinFile(winFil
eee0: 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
eef0: 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29  3_int64 iOffset)
ef00: 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
ef10: 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70  _WINRT.  LONG up
ef20: 70 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20  perBits;        
ef30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74           /* Most
ef40: 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66   sig. 32 bits of
ef50: 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20   new offset */. 
ef60: 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b   LONG lowerBits;
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef80: 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33   /* Least sig. 3
ef90: 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66  2 bits of new of
efa0: 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20  fset */.  DWORD 
efb0: 64 77 52 65 74 3b 20 20 20 20 20 20 20 20 20 20  dwRet;          
efc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
efd0: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ue returned by S
efe0: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20  etFilePointer() 
eff0: 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
f000: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
f010: 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
f020: 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73  turned by GetLas
f030: 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 75  tError() */..  u
f040: 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47  pperBits = (LONG
f050: 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20  )((iOffset>>32) 
f060: 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  & 0x7fffffff);. 
f070: 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f   lowerBits = (LO
f080: 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20 30 78  NG)(iOffset & 0x
f090: 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a  ffffffff);..  /*
f0a0: 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20   API oddity: If 
f0b0: 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46  successful, SetF
f0c0: 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74  ilePointer() ret
f0d0: 75 72 6e 73 20 61 20 64 77 6f 72 64 20 0a 20 20  urns a dword .  
f0e0: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
f0f0: 65 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20  e lower 32-bits 
f100: 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d  of the new file-
f110: 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69  offset. Or, if i
f120: 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74  t fails,.  ** it
f130: 20 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44   returns INVALID
f140: 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
f150: 52 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72  R. However accor
f160: 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20  ding to MSDN, . 
f170: 20 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f   ** INVALID_SET_
f180: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79  FILE_POINTER may
f190: 20 61 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64   also be a valid
f1a0: 20 6e 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20   new offset. So 
f1b0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
f1c0: 2a 2a 20 77 68 65 74 68 65 72 20 61 6e 20 65 72  ** whether an er
f1d0: 72 6f 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79  ror has actually
f1e0: 20 6f 63 63 75 72 65 64 2c 20 69 74 20 69 73 20   occured, it is 
f1f0: 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74  also necessary t
f200: 6f 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74  o call .  ** Get
f210: 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a  LastError()..  *
f220: 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65  /.  dwRet = osSe
f230: 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69  tFilePointer(pFi
f240: 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73  le->h, lowerBits
f250: 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49  , &upperBits, FI
f260: 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66  LE_BEGIN);..  if
f270: 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49  ( (dwRet==INVALI
f280: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
f290: 45 52 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61  ER.      && ((la
f2a0: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
f2b0: 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f  astError())!=NO_
f2c0: 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70  ERROR)) ){.    p
f2d0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f2e0: 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
f2f0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
f300: 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20  ITE_IOERR_SEEK, 
f310: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f320: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
f330: 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46  seekWinFile", pF
f340: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
f350: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
f360: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73    return 0;.#els
f370: 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65  e.  /*.  ** Same
f380: 20 61 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70   as above, excep
f390: 74 20 74 68 61 74 20 74 68 69 73 20 69 6d 70 6c  t that this impl
f3a0: 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73  ementation works
f3b0: 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f   for WinRT..  */
f3c0: 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45  ..  LARGE_INTEGE
f3d0: 52 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  R x;            
f3e0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
f3f0: 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ffset */.  BOOL 
f400: 62 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  bRet;           
f410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
f420: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
f430: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
f440: 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50  () */..  x.QuadP
f450: 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20  art = iOffset;. 
f460: 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c   bRet = osSetFil
f470: 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65  ePointerEx(pFile
f480: 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f  ->h, x, 0, FILE_
f490: 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62  BEGIN);..  if(!b
f4a0: 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  Ret){.    pFile-
f4b0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
f4c0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
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: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ndif.}../*.** Cl
f560: 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  ose a file..**.*
f570: 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64  * It is reported
f580: 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74   that an attempt
f590: 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64   to close a hand
f5a0: 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d  le might sometim
f5b0: 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69  es.** fail.  Thi
f5c0: 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72 65  s is a very unre
f5d0: 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c  asonable result,
f5e0: 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73 20   but Windows is 
f5f0: 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72  notorious.** for
f600: 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61   being unreasona
f610: 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20  ble so I do not 
f620: 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d 69  doubt that it mi
f630: 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a  ght happen.  If.
f640: 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69  ** the close fai
f650: 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72  ls, we pause for
f660: 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64   100 millisecond
f670: 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e  s and try again.
f680: 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20    As.** many as 
f690: 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
f6a0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f   attempts to clo
f6b0: 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72  se the handle ar
f6c0: 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a  e made before.**
f6d0: 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72   giving up and r
f6e0: 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
f6f0: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58  r..*/.#define MX
f700: 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33  _CLOSE_ATTEMPT 3
f710: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
f720: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
f730: 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63  e *id){.  int rc
f740: 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e  , cnt = 0;.  win
f750: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
f760: 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61  inFile*)id;..  a
f770: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
f780: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f790: 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74  MIT_WAL.  assert
f7a0: 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30  ( pFile->pShm==0
f7b0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54   );.#endif.  OST
f7c0: 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c  RACE(("CLOSE %d\
f7d0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
f7e0: 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f    do{.    rc = o
f7f0: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
f800: 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53  le->h);.    /* S
f810: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
f820: 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f  rc=0; cnt=MX_CLO
f830: 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a  SE_ATTEMPT; ); *
f840: 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  /.  }while( rc==
f850: 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f  0 && ++cnt < MX_
f860: 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26  CLOSE_ATTEMPT &&
f870: 20 28 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   (sqlite3_win32_
f880: 73 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20 29  sleep(100), 1) )
f890: 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
f8a0: 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49  WINCE.#define WI
f8b0: 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54  NCE_DELETION_ATT
f8c0: 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65 44  EMPTS 3.  winceD
f8d0: 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c 65  estroyLock(pFile
f8e0: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
f8f0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29  zDeleteOnClose )
f900: 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
f910: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20  0;.    while(.  
f920: 20 20 20 20 20 20 20 20 20 6f 73 44 65 6c 65 74           osDelet
f930: 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44  eFileW(pFile->zD
f940: 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30  eleteOnClose)==0
f950: 0a 20 20 20 20 20 20 20 20 26 26 20 6f 73 47 65  .        && osGe
f960: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
f970: 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
f980: 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66  nClose)!=0xfffff
f990: 66 66 66 20 0a 20 20 20 20 20 20 20 20 26 26 20  fff .        && 
f9a0: 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45  cnt++ < WINCE_DE
f9b0: 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a  LETION_ATTEMPTS.
f9c0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
f9d0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
f9e0: 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74  p(100);  /* Wait
f9f0: 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65   a little before
fa00: 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f   trying again */
fa10: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
fa20: 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a  e3_free(pFile->z
fa30: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a  DeleteOnClose);.
fa40: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54    }.#endif.  OST
fa50: 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 64 20  RACE(("CLOSE %d 
fa60: 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
fa70: 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61   rc ? "ok" : "fa
fa80: 69 6c 65 64 22 29 29 3b 0a 20 20 69 66 28 20 72  iled"));.  if( r
fa90: 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
faa0: 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20  h = NULL;.  }.  
fab0: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
fac0: 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53  .  return rc ? S
fad0: 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
fae0: 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72       : winLogErr
faf0: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
fb00: 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74  CLOSE, osGetLast
fb10: 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
fb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb30: 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70     "winClose", p
fb40: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a  File->zPath);.}.
fb50: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
fb60: 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
fb70: 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
fb80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
fb90: 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
fba0: 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
fbb0: 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
fbc0: 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
fbd0: 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
fbe0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
fbf0: 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  inRead(.  sqlite
fc00: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
fc10: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
fc20: 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76  read from */.  v
fc30: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
fc40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
fc50: 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20  te content into 
fc60: 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
fc70: 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
fc90: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
fca0: 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69  o read */.  sqli
fcb0: 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
fcc0: 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
fcd0: 72 65 61 64 69 6e 67 20 61 74 20 74 68 69 73 20  reading at this 
fce0: 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66  offset */.){.#if
fcf0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
fd00: 45 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f  E.  OVERLAPPED o
fd10: 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20  verlapped;      
fd20: 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65      /* The offse
fd30: 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20  t for ReadFile. 
fd40: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46  */.#endif.  winF
fd50: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
fd60: 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66  nFile*)id;  /* f
fd70: 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
fd80: 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20  DWORD nRead;    
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fda0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
fdb0: 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
fdc0: 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20   from file */.  
fdd0: 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
fde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdf0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
fe00: 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  rys */..  assert
fe10: 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d  ( id!=0 );.  Sim
fe20: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
fe30: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
fe40: 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43  _READ);.  OSTRAC
fe50: 45 28 28 22 52 45 41 44 20 25 64 20 6c 6f 63 6b  E(("READ %d lock
fe60: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
fe70: 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
fe80: 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  e));..#if SQLITE
fe90: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20  _OS_WINCE.  if( 
fea0: 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c  seekWinFile(pFil
feb0: 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20  e, offset) ){.  
fec0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fed0: 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  FULL;.  }.  whil
fee0: 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70  e( !osReadFile(p
fef0: 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61  File->h, pBuf, a
ff00: 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29  mt, &nRead, 0) )
ff10: 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74  {.#else.  memset
ff20: 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c  (&overlapped, 0,
ff30: 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50   sizeof(OVERLAPP
ff40: 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70  ED));.  overlapp
ff50: 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e  ed.Offset = (LON
ff60: 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66  G)(offset & 0xff
ff70: 66 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c  ffffff);.  overl
ff80: 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
ff90: 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
ffa0: 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
ffb0: 66 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  fff);.  while( !
ffc0: 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65  osReadFile(pFile
ffd0: 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
ffe0: 26 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70  &nRead, &overlap
fff0: 70 65 64 29 20 26 26 0a 20 20 20 20 20 20 20 20  ped) &&.        
10000 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
10010 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  )!=ERROR_HANDLE_
10020 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20  EOF ){.#endif.  
10030 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
10040 6f 3b 0a 20 20 20 20 69 66 28 20 72 65 74 72 79  o;.    if( retry
10050 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26  Ioerr(&nRetry, &
10060 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e  lastErrno) ) con
10070 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c 65  tinue;.    pFile
10080 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
10090 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74  stErrno;.    ret
100a0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
100b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
100c0 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  D, pFile->lastEr
100d0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
100e0 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69    "winRead", pFi
100f0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
10100 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72    logIoerr(nRetr
10110 79 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c  y);.  if( nRead<
10120 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20  (DWORD)amt ){.  
10130 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74    /* Unread part
10140 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
10150 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c  must be zero-fil
10160 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  led */.    memse
10170 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  t(&((char*)pBuf)
10180 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d  [nRead], 0, amt-
10190 6e 52 65 61 64 29 3b 0a 20 20 20 20 72 65 74 75  nRead);.    retu
101a0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
101b0 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
101c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
101d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  _OK;.}../*.** Wr
101e0 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
101f0 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
10200 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
10210 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
10220 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
10230 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
10240 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
10250 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65 28  ic int winWrite(
10260 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
10270 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *id,            
10280 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72     /* File to wr
10290 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f  ite into */.  co
102a0 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
102c0 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 65   The bytes to be
102d0 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
102e0 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10300 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
10310 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73   to write */.  s
10320 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
10330 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  set            /
10340 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  * Offset into th
10350 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20  e file to begin 
10360 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b  writing at */.){
10370 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
10380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10390 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65 72     /* True if er
103a0 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 2c  ror has occured,
103b0 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20   else false */. 
103c0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
103d0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20  = (winFile*)id; 
103e0 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
103f0 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20  */.  int nRetry 
10400 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10410 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10420 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20  f retries */..  
10430 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
10440 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
10450 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
10460 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
10470 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29  ITE_IOERR_WRITE)
10480 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  ;.  SimulateDisk
10490 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e  fullError(return
104a0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a   SQLITE_FULL);..
104b0 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
104c0 45 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  E %d lock=%d\n",
104d0 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
104e0 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23  ->locktype));..#
104f0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
10500 43 45 0a 20 20 72 63 20 3d 20 73 65 65 6b 57 69  CE.  rc = seekWi
10510 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66  nFile(pFile, off
10520 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
10530 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23  0 ){.#else.  {.#
10540 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54  endif.#if !SQLIT
10550 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 4f  E_OS_WINCE.    O
10560 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61  VERLAPPED overla
10570 70 70 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  pped;        /* 
10580 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 57  The offset for W
10590 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e  riteFile. */.#en
105a0 64 69 66 0a 20 20 20 20 75 38 20 2a 61 52 65 6d  dif.    u8 *aRem
105b0 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20   = (u8 *)pBuf;  
105c0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65        /* Data ye
105d0 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  t to be written 
105e0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20  */.    int nRem 
105f0 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20  = amt;          
10600 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10610 66 20 62 79 74 65 73 20 79 65 74 20 74 6f 20 62  f bytes yet to b
10620 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  e written */.   
10630 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20   DWORD nWrite;  
10640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10650 2a 20 42 79 74 65 73 20 77 72 69 74 74 65 6e 20  * Bytes written 
10660 62 79 20 65 61 63 68 20 57 72 69 74 65 46 69 6c  by each WriteFil
10670 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20  e() call */.    
10680 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20  DWORD lastErrno 
10690 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a  = NO_ERROR;   /*
106a0 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
106b0 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  by GetLastError(
106c0 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54  ) */..#if !SQLIT
106d0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 6d  E_OS_WINCE.    m
106e0 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65  emset(&overlappe
106f0 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  d, 0, sizeof(OVE
10700 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
10710 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
10720 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
10730 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
10740 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
10750 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e  ffsetHigh = (LON
10760 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  G)((offset>>32) 
10770 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23  & 0x7fffffff);.#
10780 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65  endif..    while
10790 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20  ( nRem>0 ){.#if 
107a0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
107b0 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69        if( !osWri
107c0 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  teFile(pFile->h,
107d0 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57   aRem, nRem, &nW
107e0 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73  rite, 0) ){.#els
107f0 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57  e.      if( !osW
10800 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e  riteFile(pFile->
10810 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26  h, aRem, nRem, &
10820 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c 61 70  nWrite, &overlap
10830 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20  ped) ){.#endif. 
10840 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
10850 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26  Ioerr(&nRetry, &
10860 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e  lastErrno) ) con
10870 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 62  tinue;.        b
10880 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
10890 20 20 20 20 61 73 73 65 72 74 28 20 6e 57 72 69      assert( nWri
108a0 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3c  te==0 || nWrite<
108b0 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 3b 0a  =(DWORD)nRem );.
108c0 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65        if( nWrite
108d0 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3e 28 44  ==0 || nWrite>(D
108e0 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a 20 20 20  WORD)nRem ){.   
108f0 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
10900 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
10910 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
10920 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21 53  ;.      }.#if !S
10930 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
10940 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
10950 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f 76 65  Write;.      ove
10960 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d  rlapped.Offset =
10970 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26   (LONG)(offset &
10980 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
10990 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
109a0 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e  ffsetHigh = (LON
109b0 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  G)((offset>>32) 
109c0 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23  & 0x7fffffff);.#
109d0 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52 65 6d  endif.      aRem
109e0 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20   += nWrite;.    
109f0 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65    nRem -= nWrite
10a00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10a10 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRem>0 ){.      
10a20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
10a30 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
10a40 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
10a50 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20  }.  }..  if( rc 
10a60 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28 20 70  ){.    if(   ( p
10a70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
10a80 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49  =ERROR_HANDLE_DI
10a90 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20 20  SK_FULL ).      
10aa0 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73   || ( pFile->las
10ab0 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49  tErrno==ERROR_DI
10ac0 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20  SK_FULL )){.    
10ad0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10ae0 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  FULL;.    }.    
10af0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
10b00 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
10b10 57 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61  WRITE, pFile->la
10b20 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
10b30 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 22        "winWrite"
10b40 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
10b50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f  .  }else{.    lo
10b60 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a  gIoerr(nRetry);.
10b70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
10b80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10b90 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65   Truncate an ope
10ba0 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63  n file to a spec
10bb0 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74  ified size.*/.st
10bc0 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e  atic int winTrun
10bd0 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
10be0 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
10bf0 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77  nt64 nByte){.  w
10c00 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
10c10 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
10c20 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62  * File handle ob
10c30 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
10c40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
10c50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
10c60 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69  urn code for thi
10c70 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20  s function */.. 
10c80 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
10c90 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  ;..  OSTRACE(("T
10ca0 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c 64 5c  RUNCATE %d %lld\
10cb0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42  n", pFile->h, nB
10cc0 79 74 65 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74  yte));.  Simulat
10cd0 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
10ce0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
10cf0 4e 43 41 54 45 29 3b 0a 0a 20 20 2f 2a 20 49 66  NCATE);..  /* If
10d00 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f   the user has co
10d10 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b  nfigured a chunk
10d20 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66  -size for this f
10d30 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68  ile, truncate th
10d40 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74  e.  ** file so t
10d50 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20  hat it consists 
10d60 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  of an integer nu
10d70 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28  mber of chunks (
10d80 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63  i.e. the.  ** ac
10d90 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61  tual file size a
10da0 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69  fter the operati
10db0 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72  on may be larger
10dc0 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
10dd0 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a  ted.  ** size)..
10de0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
10df0 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  ->szChunk>0 ){. 
10e00 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79     nByte = ((nBy
10e10 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68  te + pFile->szCh
10e20 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e  unk - 1)/pFile->
10e30 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65  szChunk) * pFile
10e40 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a  ->szChunk;.  }..
10e50 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c    /* SetEndOfFil
10e60 65 28 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d  e() returns non-
10e70 7a 65 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73  zero when succes
10e80 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68  sful, or zero wh
10e90 65 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a  en it fails. */.
10ea0 20 20 69 66 28 20 73 65 65 6b 57 69 6e 46 69 6c    if( seekWinFil
10eb0 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20  e(pFile, nByte) 
10ec0 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  ){.    rc = winL
10ed0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
10ee0 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70  OERR_TRUNCATE, p
10ef0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
10f00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77  .             "w
10f10 69 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46  inTruncate1", pF
10f20 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
10f30 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73 53 65  else if( 0==osSe
10f40 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65  tEndOfFile(pFile
10f50 2d 3e 68 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  ->h) ){.    pFil
10f60 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
10f70 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
10f80 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
10f90 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
10fa0 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
10fb0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
10fd0 54 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c  Truncate2", pFil
10fe0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a  e->zPath);.  }..
10ff0 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e    OSTRACE(("TRUN
11000 43 41 54 45 20 25 64 20 25 6c 6c 64 20 25 73 5c  CATE %d %lld %s\
11010 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42  n", pFile->h, nB
11020 79 74 65 2c 20 72 63 20 3f 20 22 66 61 69 6c 65  yte, rc ? "faile
11030 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72  d" : "ok"));.  r
11040 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
11050 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
11060 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
11070 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
11080 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
11090 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
110a0 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
110b0 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
110c0 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
110d0 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
110e0 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
110f0 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
11100 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
11110 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
11120 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
11130 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
11140 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
11150 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
11160 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
11170 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   disk..*/.static
11180 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c   int winSync(sql
11190 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
111a0 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64  nt flags){.#ifnd
111b0 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
111c0 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64  C.  /*.  ** Used
111d0 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54   only when SQLIT
111e0 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74  E_NO_SYNC is not
111f0 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a   defined..   */.
11200 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69    BOOL rc;.#endi
11210 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
11220 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e  DEBUG) || !defin
11230 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ed(SQLITE_NO_SYN
11240 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66  C) || \.    (def
11250 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
11260 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
11270 49 54 45 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a  ITE_DEBUG)).  /*
11280 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20  .  ** Used when 
11290 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
112a0 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e  s not defined an
112b0 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 28  d by the assert(
112c0 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53  ) and/or.  ** OS
112d0 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a  TRACE() macros..
112e0 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20     */.  winFile 
112f0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
11300 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55  e*)id;.#else.  U
11310 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
11320 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  id);.#endif..  a
11330 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
11340 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
11350 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
11360 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
11370 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
11380 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
11390 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
113a0 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
113b0 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
113c0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
113d0 4c 0a 20 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  L.  );..  OSTRAC
113e0 45 28 28 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b  E(("SYNC %d lock
113f0 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
11400 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
11410 65 29 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20  e));..  /* Unix 
11420 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65  cannot, but some
11430 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74   systems may ret
11440 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
11450 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a  from here. This.
11460 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20    ** line is to 
11470 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20  test that doing 
11480 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  so does not caus
11490 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a  e any problems..
114a0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44    */.  SimulateD
114b0 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65  iskfullError( re
114c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
114d0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
114e0 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55 53 45  ITE_TEST.  UNUSE
114f0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67  D_PARAMETER(flag
11500 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  s);.#else.  if( 
11510 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
11520 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29  LITE_SYNC_FULL )
11530 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75  {.    sqlite3_fu
11540 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
11550 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 79    }.  sqlite3_sy
11560 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
11570 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
11580 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
11590 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
115a0 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
115b0 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
115c0 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
115d0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
115e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
115f0 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f  ;.#else.  rc = o
11600 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72  sFlushFileBuffer
11610 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53  s(pFile->h);.  S
11620 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
11630 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69 66  rc=FALSE );.  if
11640 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
11650 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11660 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
11670 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
11680 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
11690 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
116a0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
116b0 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65  ERR_FSYNC, pFile
116c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
116d0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 79            "winSy
116e0 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  nc", pFile->zPat
116f0 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  h);.  }.#endif.}
11700 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
11710 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
11720 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
11730 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
11740 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  int winFileSize(
11750 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11760 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
11770 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46 69  *pSize){.  winFi
11780 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
11790 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
117a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
117b0 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
117c0 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
117d0 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
117e0 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29  ITE_IOERR_FSTAT)
117f0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
11800 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20 46 49  WINRT.  {.    FI
11810 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49 4e 46 4f  LE_STANDARD_INFO
11820 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 6f   info;.    if( o
11830 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  sGetFileInformat
11840 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 28 70 46  ionByHandleEx(pF
11850 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53 74 61 6e  ile->h, FileStan
11860 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20 20 20 20  dardInfo,.      
11870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
11890 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
118a0 6f 29 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 53  o)) ){.      *pS
118b0 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66  ize = info.EndOf
118c0 46 69 6c 65 2e 51 75 61 64 50 61 72 74 3b 0a 20  File.QuadPart;. 
118d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
118e0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
118f0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
11900 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r();.      rc = 
11910 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
11920 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20  TE_IOERR_FSTAT, 
11930 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11940 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11950 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c           "winFil
11960 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  eSize", pFile->z
11970 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
11980 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44  .#else.  {.    D
11990 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 3b 0a  WORD upperBits;.
119a0 20 20 20 20 44 57 4f 52 44 20 6c 6f 77 65 72 42      DWORD lowerB
119b0 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c  its;.    DWORD l
119c0 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c  astErrno;..    l
119d0 6f 77 65 72 42 69 74 73 20 3d 20 6f 73 47 65 74  owerBits = osGet
119e0 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e  FileSize(pFile->
119f0 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a  h, &upperBits);.
11a00 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28      *pSize = (((
11a10 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 75 70  sqlite3_int64)up
11a20 70 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20  perBits)<<32) + 
11a30 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 69  lowerBits;.    i
11a40 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20  f(   (lowerBits 
11a50 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  == INVALID_FILE_
11a60 53 49 5a 45 29 0a 20 20 20 20 20 20 20 26 26 20  SIZE).       && 
11a70 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
11a80 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
11a90 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20  =NO_ERROR) ){.  
11aa0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
11ab0 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
11ac0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
11ad0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
11ae0 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69  IOERR_FSTAT, pFi
11af0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
11b00 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
11b10 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65  FileSize", pFile
11b20 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
11b30 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
11b40 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11b50 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
11b60 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e  MMEDIATELY is un
11b70 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20  defined on some 
11b80 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e  Windows systems.
11b90 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b  .*/.#ifndef LOCK
11ba0 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
11bb0 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c  ATELY.# define L
11bc0 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
11bd0 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69  EDIATELY 1.#endi
11be0 66 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46  f..#ifndef LOCKF
11bf0 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ILE_EXCLUSIVE_LO
11c00 43 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b  CK.# define LOCK
11c10 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
11c20 4f 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OCK 2.#endif../*
11c30 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 6c 79  .** Historically
11c40 2c 20 53 51 4c 69 74 65 20 68 61 73 20 75 73 65  , SQLite has use
11c50 64 20 62 6f 74 68 20 74 68 65 20 4c 6f 63 6b 46  d both the LockF
11c60 69 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65  ile and LockFile
11c70 45 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a  Ex functions..**
11c80 20 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b 46 69   When the LockFi
11c90 6c 65 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  le function was 
11ca0 75 73 65 64 2c 20 69 74 20 77 61 73 20 61 6c 77  used, it was alw
11cb0 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 20  ays expected to 
11cc0 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  fail.** immediat
11cd0 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ely if the lock 
11ce0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f 62 74  could not be obt
11cf0 61 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20 69 74  ained.  Also, it
11d00 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65 64   always expected
11d10 20 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20 61 6e   to.** obtain an
11d20 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
11d30 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 61 72    These flags ar
11d40 65 20 75 73 65 64 20 77 69 74 68 20 74 68 65 20  e used with the 
11d50 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74  LockFileEx funct
11d60 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66 6c 65  ion.** and refle
11d70 63 74 20 74 68 6f 73 65 20 65 78 70 65 63 74 61  ct those expecta
11d80 74 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f 72 65  tions; therefore
11d90 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20 6e 6f  , they should no
11da0 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f  t be changed..*/
11db0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11dc0 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 0a 23  LOCKFILE_FLAGS.#
11dd0 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c   define SQLITE_L
11de0 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20 20 20  OCKFILE_FLAGS   
11df0 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49  (LOCKFILE_FAIL_I
11e00 4d 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c 0a 20  MMEDIATELY | \. 
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e30 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
11e40 49 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69 66  IVE_LOCK).#endif
11e50 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e 74 6c  ../*.** Currentl
11e60 79 2c 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  y, SQLite never 
11e70 63 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b 46 69  calls the LockFi
11e80 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 20 77 69  leEx function wi
11e90 74 68 6f 75 74 20 77 61 6e 74 69 6e 67 20 74 68  thout wanting th
11ea0 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 61 69  e.** call to fai
11eb0 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66  l immediately if
11ec0 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
11ed0 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f   be obtained..*/
11ee0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11ef0 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53  LOCKFILEEX_FLAGS
11f00 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
11f10 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47  _LOCKFILEEX_FLAG
11f20 53 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  S (LOCKFILE_FAIL
11f30 5f 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a 23 65  _IMMEDIATELY).#e
11f40 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  ndif../*.** Acqu
11f50 69 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ire a reader loc
11f60 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20  k..** Different 
11f70 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65  API routines are
11f80 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e   called dependin
11f90 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
11fa0 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57  not this.** is W
11fb0 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a  in9x or WinNT..*
11fc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
11fd0 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
11fe0 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
11ff0 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  res;.  if( isNT(
12000 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
12010 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a 0a  OS_WINCE.    /*.
12020 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e      ** NOTE: Win
12030 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
12040 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
12050 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
12060 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
12070 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c    **       API L
12080 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20 2a  ockFileEx..    *
12090 2f 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 63  /.    res = winc
120a0 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  eLockFile(&pFile
120b0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
120c0 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6c  T, 0, 1, 0);.#el
120d0 73 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  se.    res = win
120e0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
120f0 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
12100 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48 41  ILEEX_FLAGS, SHA
12110 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20  RED_FIRST, 0,.  
12120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12130 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
12140 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   0);.#endif.  }.
12150 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
12160 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
12170 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b  lse{.    int lk;
12180 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
12190 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c  domness(sizeof(l
121a0 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46  k), &lk);.    pF
121b0 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
121c0 79 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c  yte = (short)((l
121d0 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25  k & 0x7fffffff)%
121e0 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
121f0 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  ));.    res = wi
12200 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
12210 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
12220 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20  FILE_FLAGS,.    
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12240 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70    SHARED_FIRST+p
12250 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
12260 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  Byte, 0, 1, 0);.
12270 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
12280 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20   res == 0 ){.   
12290 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
122a0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
122b0 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20  or();.    /* No 
122c0 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61  need to log a fa
122d0 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f  ilure to lock */
122e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
122f0 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  s;.}../*.** Undo
12300 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73   a readlock.*/.s
12310 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b  tatic int unlock
12320 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
12330 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
12340 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  res;.  DWORD las
12350 74 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 69 73  tErrno;.  if( is
12360 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20  NT() ){.    res 
12370 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28  = winUnlockFile(
12380 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
12390 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52  D_FIRST, 0, SHAR
123a0 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d  ED_SIZE, 0);.  }
123b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
123c0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
123d0 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20  else{.    res = 
123e0 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
123f0 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
12400 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61  FIRST+pFile->sha
12410 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20  redLockByte, 0, 
12420 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  1, 0);.  }.#endi
12430 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26  f.  if( res==0 &
12440 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20  & ((lastErrno = 
12450 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
12460 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43  )!=ERROR_NOT_LOC
12470 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  KED) ){.    pFil
12480 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
12490 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
124a0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
124b0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70  _IOERR_UNLOCK, p
124c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
124d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 75  .             "u
124e0 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20  nlockReadLock", 
124f0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
12500 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b   }.  return res;
12510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
12520 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
12530 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
12540 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
12550 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
12560 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
12570 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
12580 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
12590 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
125a0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
125b0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
125c0 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
125d0 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
125e0 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
125f0 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
12600 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
12610 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
12620 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
12630 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
12640 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
12650 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
12660 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
12670 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
12680 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
12690 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
126a0 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
126b0 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
126c0 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
126d0 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
126e0 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
126f0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
12700 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
12710 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
12720 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
12730 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
12740 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
12750 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
12760 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
12770 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
12780 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
12790 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
127a0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
127b0 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
127c0 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
127d0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
127e0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
127f0 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f  ck.  The winUnlo
12800 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ck() routine.** 
12810 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73  erases all locks
12820 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74   at once and ret
12830 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74  urns us immediat
12840 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c  ely to locking l
12850 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73  evel 0..** It is
12860 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
12870 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   lower the locki
12880 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65  ng level one ste
12890 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f  p at a time.  Yo
128a0 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72  u.** must go str
128b0 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67  aight to locking
128c0 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61   level 0..*/.sta
128d0 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28  tic int winLock(
128e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
128f0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
12900 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12910 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74  TE_OK;    /* Ret
12920 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
12930 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69  broutines */.  i
12940 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
12950 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
12960 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63  of a Windows loc
12970 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  k call */.  int 
12980 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20  newLocktype;    
12990 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d     /* Set pFile-
129a0 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69  >locktype to thi
129b0 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65  s value before e
129c0 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  xiting */.  int 
129d0 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
129e0 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65   0;/* True if we
129f0 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44   acquired a PEND
12a00 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69  ING lock this ti
12a10 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20  me */.  winFile 
12a20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
12a30 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c  e*)id;.  DWORD l
12a40 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52  astErrno = NO_ER
12a50 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ROR;..  assert( 
12a60 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41  id!=0 );.  OSTRA
12a70 43 45 28 28 22 4c 4f 43 4b 20 25 64 20 25 64 20  CE(("LOCK %d %d 
12a80 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20  was %d(%d)\n",. 
12a90 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
12aa0 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 70 46  >h, locktype, pF
12ab0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
12ac0 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
12ad0 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  Byte));..  /* If
12ae0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
12af0 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
12b00 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
12b10 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
12b20 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f  .  ** OsFile, do
12b30 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
12b40 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
12b50 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
12b60 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e    ** sqlite3OsEn
12b70 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
12b80 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
12b90 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
12ba0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c  ile->locktype>=l
12bb0 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
12bc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12bd0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
12be0 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
12bf0 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
12c00 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
12c10 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
12c20 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
12c30 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
12c40 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
12c50 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
12c60 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
12c70 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
12c80 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
12c90 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
12ca0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
12cb0 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65  ;..  /* Lock the
12cc0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
12cd0 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  te if we need to
12ce0 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   acquire a PENDI
12cf0 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20  NG lock or.  ** 
12d00 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20  a SHARED lock.  
12d10 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72  If we are acquir
12d20 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
12d30 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69  k, the acquisiti
12d40 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50  on of.  ** the P
12d50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65  ENDING_LOCK byte
12d60 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20   is temporary.. 
12d70 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70   */.  newLocktyp
12d80 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
12d90 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46  ype;.  if(   (pF
12da0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
12db0 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20  O_LOCK).     || 
12dc0 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45  (   (locktype==E
12dd0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
12de0 20 20 20 20 20 20 20 20 26 26 20 28 70 46 69 6c          && (pFil
12df0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  e->locktype==RES
12e00 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  ERVED_LOCK)).  )
12e10 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
12e20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e  3;.    while( cn
12e30 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20  t-->0 && (res = 
12e40 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
12e50 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
12e60 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20  CKFILE_FLAGS,.  
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e90 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42         PENDING_B
12ea0 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d  YTE, 0, 1, 0))==
12eb0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  0 ){.      /* Tr
12ec0 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74  y 3 times to get
12ed0 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63   the pending loc
12ee0 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65 64  k.  This is need
12ef0 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20  ed to work.     
12f00 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c   ** around probl
12f10 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 69 6e  ems caused by in
12f20 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e  dexing and/or an
12f30 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61 72  ti-virus softwar
12f40 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69  e on.      ** Wi
12f50 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 20  ndows systems.. 
12f60 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20 61       ** If you a
12f70 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 63 6f  re using this co
12f80 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f  de as a model fo
12f90 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56 46  r alternative VF
12fa0 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20  Ses, do not.    
12fb0 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20 72    ** copy this r
12fc0 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74 20  etry logic.  It 
12fd0 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e 64  is a hack intend
12fe0 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f  ed for Windows o
12ff0 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nly..      */.  
13000 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 63 6f      OSTRACE(("co
13010 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 20 50 45  uld not get a PE
13020 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d  NDING lock. cnt=
13030 25 64 5c 6e 22 2c 20 63 6e 74 29 29 3b 0a 20 20  %d\n", cnt));.  
13040 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 73 71      if( cnt ) sq
13050 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
13060 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p(1);.    }.    
13070 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
13080 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21 72   res;.    if( !r
13090 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74  es ){.      last
130a0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
130b0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
130c0 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
130d0 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a  e a shared lock.
130e0 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
130f0 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
13100 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
13110 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
13120 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
13130 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 67 65 74  );.    res = get
13140 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
13150 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
13160 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
13170 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
13180 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13190 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
131a0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
131b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
131c0 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
131d0 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ED lock.  */.  i
131e0 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  f( locktype==RES
131f0 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65  ERVED_LOCK && re
13200 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
13210 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
13220 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
13230 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f  .    res = winLo
13240 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
13250 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
13260 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45  E_FLAGS, RESERVE
13270 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
13280 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
13290 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
132a0 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  pe = RESERVED_LO
132b0 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
132c0 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
132d0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
132e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
132f0 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e  /* Acquire a PEN
13300 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  DING lock.  */. 
13310 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
13320 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
13330 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c   res ){.    newL
13340 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
13350 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50  G_LOCK;.    gotP
13360 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a  endingLock = 0;.
13370 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
13380 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
13390 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
133a0 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
133b0 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  VE_LOCK && res )
133c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
133d0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53  ile->locktype>=S
133e0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
133f0 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65    res = unlockRe
13400 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
13410 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 72     OSTRACE(("unr
13420 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c  eadlock = %d\n",
13430 20 72 65 73 29 29 3b 0a 20 20 20 20 72 65 73 20   res));.    res 
13440 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
13450 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
13460 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20  LOCKFILE_FLAGS, 
13470 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
13480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13490 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
134a0 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ZE, 0);.    if( 
134b0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
134c0 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55  Locktype = EXCLU
134d0 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  SIVE_LOCK;.    }
134e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
134f0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
13500 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
13510 4f 53 54 52 41 43 45 28 28 22 65 72 72 6f 72 2d  OSTRACE(("error-
13520 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c 20 6c 61  code = %d\n", la
13530 73 74 45 72 72 6e 6f 29 29 3b 0a 20 20 20 20 20  stErrno));.     
13540 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69   getReadLock(pFi
13550 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  le);.    }.  }..
13560 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68    /* If we are h
13570 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47  olding a PENDING
13580 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74   lock that ought
13590 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c   to be released,
135a0 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61   then.  ** relea
135b0 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  se it now..  */.
135c0 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67    if( gotPending
135d0 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65  Lock && locktype
135e0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
135f0 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
13600 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45  le(&pFile->h, PE
13610 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
13620 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
13630 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65  Update the state
13640 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73   of the lock has
13650 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c   held in the fil
13660 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65  e descriptor the
13670 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68  n.  ** return th
13680 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65  e appropriate re
13690 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  sult code..  */.
136a0 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
136b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
136c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53  .  }else{.    OS
136d0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 46 41 49  TRACE(("LOCK FAI
136e0 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f  LED %d trying fo
136f0 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c  r %d but got %d\
13700 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
13710 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
13720 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29  e, newLocktype))
13730 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
13740 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
13750 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  no;.    rc = SQL
13760 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20  ITE_BUSY;.  }.  
13770 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
13780 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70  = (u8)newLocktyp
13790 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
137a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
137b0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
137c0 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
137d0 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
137e0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
137f0 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
13800 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
13810 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
13820 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74  ock is held, ret
13830 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c  urn.** non-zero,
13840 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f 2e   otherwise zero.
13850 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
13860 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  inCheckReservedL
13870 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13880 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
13890 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ut){.  int rc;. 
138a0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
138b0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
138c0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
138d0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
138e0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
138f0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20  ERVEDLOCK; );.. 
13900 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
13910 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
13920 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45  ocktype>=RESERVE
13930 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63  D_LOCK ){.    rc
13940 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43   = 1;.    OSTRAC
13950 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
13960 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e   %d %d (local)\n
13970 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29  ", pFile->h, rc)
13980 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
13990 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  rc = winLockFile
139a0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
139b0 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
139c0 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  S, RESERVED_BYTE
139d0 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
139e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
139f0 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
13a00 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
13a10 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
13a20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
13a30 20 21 72 63 3b 0a 20 20 20 20 4f 53 54 52 41 43   !rc;.    OSTRAC
13a40 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
13a50 20 25 64 20 25 64 20 28 72 65 6d 6f 74 65 29 5c   %d %d (remote)\
13a60 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
13a70 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ));.  }.  *pResO
13a80 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72  ut = rc;.  retur
13a90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
13aa0 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
13ab0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
13ac0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
13ad0 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e   id to locktype.
13ae0 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75    locktype.** mu
13af0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
13b00 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
13b10 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
13b20 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
13b30 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
13b40 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
13b50 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
13b60 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
13b70 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
13b80 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
13b90 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  no-op..**.** It 
13ba0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
13bb0 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
13bc0 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20   to fail if the 
13bd0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
13be0 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20  ** is NO_LOCK.  
13bf0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
13c00 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44  gument is SHARED
13c10 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20  _LOCK then this 
13c20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74  routine.** might
13c30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
13c40 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  OERR;.*/.static 
13c50 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 71  int winUnlock(sq
13c60 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13c70 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
13c80 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69 6e   int type;.  win
13c90 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
13ca0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  inFile*)id;.  in
13cb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13cc0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
13cd0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
13ce0 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
13cf0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 54  ED_LOCK );.  OST
13d00 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 64  RACE(("UNLOCK %d
13d10 20 74 6f 20 25 64 20 77 61 73 20 25 64 28 25 64   to %d was %d(%d
13d20 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
13d30 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20  locktype,.      
13d40 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
13d50 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72  ype, pFile->shar
13d60 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 20 20  edLockByte));.  
13d70 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  type = pFile->lo
13d80 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74 79  cktype;.  if( ty
13d90 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe>=EXCLUSIVE_LO
13da0 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
13db0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
13dc0 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
13dd0 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
13de0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63   0);.    if( loc
13df0 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
13e00 43 4b 20 26 26 20 21 67 65 74 52 65 61 64 4c 6f  CK && !getReadLo
13e10 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ck(pFile) ){.   
13e20 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c     /* This shoul
13e30 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20  d never happen. 
13e40 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   We should alway
13e50 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20  s be able to.   
13e60 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20     ** reacquire 
13e70 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  the read lock */
13e80 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
13e90 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
13ea0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47  OERR_UNLOCK, osG
13eb0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
13ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
13ed0 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65  inUnlock", pFile
13ee0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
13ef0 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
13f00 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
13f10 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
13f20 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45  le(&pFile->h, RE
13f30 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
13f40 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  1, 0);.  }.  if(
13f50 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
13f60 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52  CK && type>=SHAR
13f70 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75  ED_LOCK ){.    u
13f80 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46  nlockReadLock(pF
13f90 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ile);.  }.  if( 
13fa0 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type>=PENDING_LO
13fb0 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
13fc0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
13fd0 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
13fe0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
13ff0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14000 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b   = (u8)locktype;
14010 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14020 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20  ./*.** If *pArg 
14030 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e  is inititially n
14040 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69  egative then thi
14050 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53  s is a query.  S
14060 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31  et *pArg to.** 1
14070 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20   or 0 depending 
14080 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
14090 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46  t bit mask of pF
140a0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69  ile->ctrlFlags i
140b0 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  s set..**.** If 
140c0 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c  *pArg is 0 or 1,
140d0 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73   then clear or s
140e0 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20  et the mask bit 
140f0 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
14100 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ags..*/.static v
14110 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77  oid winModeBit(w
14120 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  inFile *pFile, u
14130 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73  nsigned char mas
14140 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20  k, int *pArg){. 
14150 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a   if( *pArg<0 ){.
14160 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69      *pArg = (pFi
14170 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
14180 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  mask)!=0;.  }els
14190 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30  e if( (*pArg)==0
141a0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
141b0 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73  trlFlags &= ~mas
141c0 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
141d0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
141e0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a   |= mask;.  }.}.
141f0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
14200 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
14210 63 20 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d  c int getTempnam
14220 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  e(int nBuf, char
14230 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20   *zBuf);../*.** 
14240 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72  Control and quer
14250 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  y of the open fi
14260 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
14270 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65  atic int winFile
14280 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
14290 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
142a0 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
142b0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
142c0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
142d0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
142e0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
142f0 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
14300 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
14310 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  pArg = pFile->lo
14320 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 72 65  cktype;.      re
14330 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14340 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
14350 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
14360 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
14370 29 70 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69  )pArg = (int)pFi
14380 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
14390 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
143a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
143b0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
143c0 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b  TL_CHUNK_SIZE: {
143d0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a  .      pFile->sz
143e0 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29  Chunk = *(int *)
143f0 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75  pArg;.      retu
14400 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14410 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
14420 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
14430 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  INT: {.      if(
14440 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e   pFile->szChunk>
14450 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
14460 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a  ite3_int64 oldSz
14470 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  ;.        int rc
14480 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 69   = winFileSize(i
14490 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20  d, &oldSz);.    
144a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
144b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
144c0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
144d0 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74   newSz = *(sqlit
144e0 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a  e3_int64*)pArg;.
144f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 65            if( ne
14500 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20  wSz>oldSz ){.   
14510 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74           Simulat
14520 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
14530 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
14540 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
14550 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20  id, newSz);.    
14560 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
14570 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
14580 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
145a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
145b0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
145c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
145d0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
145e0 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57  _FCNTL_PERSIST_W
145f0 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d  AL: {.      winM
14600 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49  odeBit(pFile, WI
14610 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  NFILE_PERSIST_WA
14620 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  L, (int*)pArg);.
14630 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14640 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
14650 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
14660 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  NTL_POWERSAFE_OV
14670 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  ERWRITE: {.     
14680 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
14690 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c  e, WINFILE_PSOW,
146a0 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
146b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
146c0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
146d0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
146e0 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
146f0 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
14700 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
14710 74 66 28 22 77 69 6e 33 32 22 29 3b 0a 20 20 20  tf("win32");.   
14720 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14730 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
14740 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
14750 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a  _WIN32_AV_RETRY:
14760 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 20   {.      int *a 
14770 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20  = (int*)pArg;.  
14780 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20 29      if( a[0]>0 )
14790 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33 32 49  {.        win32I
147a0 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d  oerrRetry = a[0]
147b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
147c0 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69         a[0] = wi
147d0 6e 33 32 49 6f 65 72 72 52 65 74 72 79 3b 0a 20  n32IoerrRetry;. 
147e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
147f0 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20   a[1]>0 ){.     
14800 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74     win32IoerrRet
14810 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a  ryDelay = a[1];.
14820 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14830 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e 33       a[1] = win3
14840 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  2IoerrRetryDelay
14850 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14860 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14870 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14880 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
14890 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20  MPFILENAME: {.  
148a0 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65      char *zTFile
148b0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
148c0 63 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  c( pFile->pVfs->
148d0 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20  mxPathname );.  
148e0 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29      if( zTFile )
148f0 7b 0a 20 20 20 20 20 20 20 20 67 65 74 54 65 6d  {.        getTem
14900 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66  pname(pFile->pVf
14910 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a  s->mxPathname, z
14920 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  TFile);.        
14930 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
14940 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  zTFile;.      }.
14950 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14960 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
14970 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
14980 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f  E_NOTFOUND;.}../
14990 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
149a0 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
149b0 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
149c0 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
149d0 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
149e0 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
149f0 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
14a00 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
14a10 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
14a20 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
14a30 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
14a40 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
14a50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
14a60 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
14a70 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
14a80 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
14a90 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
14aa0 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
14ab0 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
14ac0 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
14ad0 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
14ae0 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
14af0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
14b00 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
14b10 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  e for both..*/.s
14b20 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63  tatic int winSec
14b30 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
14b40 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f  file *id){.  (vo
14b50 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  id)id;.  return 
14b60 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
14b70 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
14b80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65  *.** Return a ve
14b90 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63  ctor of device c
14ba0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a  haracteristics..
14bb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
14bc0 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
14bd0 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
14be0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46  ile *id){.  winF
14bf0 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c  ile *p = (winFil
14c00 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  e*)id;.  return 
14c10 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
14c20 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
14c30 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28  EN |.         ((
14c40 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  p->ctrlFlags & W
14c50 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c  INFILE_PSOW)?SQL
14c60 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
14c70 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29  AFE_OVERWRITE:0)
14c80 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
14c90 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a  ITE_OMIT_WAL../*
14ca0 20 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c   .** Windows wil
14cb0 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63  l only let you c
14cc0 72 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20  reate file view 
14cd0 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61  mappings.** on a
14ce0 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67  llocation size g
14cf0 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64  ranularity bound
14d00 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67  aries..** During
14d10 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
14d20 28 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79  () we do a GetSy
14d30 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f  stemInfo().** to
14d40 20 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61   get the granula
14d50 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59  rity size..*/.SY
14d60 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73  STEM_INFO winSys
14d70 49 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  Info;../*.** Hel
14d80 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
14d90 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
14da0 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
14db0 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20  l mutex. The.** 
14dc0 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
14dd0 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20  used to protect 
14de0 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20  the winLockInfo 
14df0 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
14e00 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61  .** this file, a
14e10 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20  ll of which may 
14e20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  be shared by mul
14e30 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
14e40 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69  *.** Function wi
14e50 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
14e60 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72  is used to asser
14e70 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f  t() that the glo
14e80 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73  bal mutex .** is
14e90 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
14ea0 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
14eb0 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
14ec0 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
14ed0 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  t() .** statemen
14ee0 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20  ts. e.g..**.**  
14ef0 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
14f00 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  x().**     asser
14f10 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  t( winShmMutexHe
14f20 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e  ld() );.**   win
14f30 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a  ShmLeaveMutex().
14f40 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
14f50 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
14f60 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
14f70 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c  _mutex_enter(sql
14f80 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
14f90 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
14fa0 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 73  IC_MASTER));.}.s
14fb0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
14fc0 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  mLeaveMutex(void
14fd0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
14fe0 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
14ff0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
15000 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
15010 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64 65  ASTER));.}.#ifde
15020 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
15030 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
15040 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20  MutexHeld(void) 
15050 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
15060 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71  e3_mutex_held(sq
15070 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
15080 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
15090 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a  TIC_MASTER));.}.
150a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62  #endif../*.** Ob
150b0 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70  ject used to rep
150c0 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20  resent a single 
150d0 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20  file opened and 
150e0 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69  mmapped to provi
150f0 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d  de.** shared mem
15100 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69  ory.  When multi
15110 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
15120 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
15130 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  me.** log-summar
15140 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 68  y, each thread h
15150 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69  as its own winFi
15160 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74  le object, but t
15170 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  hey all.** point
15180 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73   to a single ins
15190 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
151a0 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
151b0 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c  words, each.** l
151c0 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70  og-summary is op
151d0 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70  ened only once p
151e0 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  er process..**.*
151f0 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  * winShmMutexHel
15200 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
15210 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
15220 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
15230 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
15240 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
15250 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
15260 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
15270 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
15280 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a        pNext .**.
15290 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
152a0 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
152b0 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
152c0 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
152d0 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66  d:.** .**      f
152e0 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
152f0 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
15300 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74  r winShmNode.mut
15310 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  ex must be held 
15320 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52  or winShmNode.nR
15330 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e  ef==0 and.** win
15340 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
15350 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
15360 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
15370 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
15380 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
15390 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63  ure..**.*/.struc
153a0 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20  t winShmNode {. 
153b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
153c0 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
153d0 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
153e0 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
153f0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
15400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
15410 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  me of the file *
15420 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c  /.  winFile hFil
15430 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
15440 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72  * File handle fr
15450 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20  om winOpen */.. 
15460 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20   int szRegion;  
15470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
15480 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ize of shared-me
15490 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
154a0 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20    int nRegion;  
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
154c0 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
154d0 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75  Region */.  stru
154e0 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20  ct ShmRegion {. 
154f0 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20     HANDLE hMap; 
15500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
15510 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ile handle from 
15520 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
15530 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70  g */.    void *p
15540 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f  Map;.  } *aRegio
15550 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  n;.  DWORD lastE
15560 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
15570 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65  /* The Windows e
15580 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
15590 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
155a0 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
155b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
155c0 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68   Number of winSh
155d0 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
155e0 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
155f0 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  winShm *pFirst; 
15600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
15610 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  l winShm objects
15620 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
15630 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
15640 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  e *pNext;       
15650 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73    /* Next in lis
15660 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e  t of all winShmN
15670 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23  ode objects */.#
15680 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
15690 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  UG.  u8 nextShmI
156a0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
156b0 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
156c0 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75  e winShm.id valu
156d0 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
156e0 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61  /*.** A global a
156f0 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53  rray of all winS
15700 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a  hmNode objects..
15710 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d  **.** The winShm
15720 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
15730 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72   be true while r
15740 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
15750 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a  g this list..*/.
15760 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64  static winShmNod
15770 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  e *winShmNodeLis
15780 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  t = 0;../*.** St
15790 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
157a0 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
157b0 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
157c0 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
157d0 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
157e0 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
157f0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
15800 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
15810 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
15820 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
15830 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
15840 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
15850 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
15860 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65   winShm.pShmNode
15870 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64  .**    winShm.id
15880 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
15890 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
158a0 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e  /write.  The win
158b0 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  Shm.pShmNode->mu
158c0 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
158d0 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73  .** while access
158e0 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69  ing any read/wri
158f0 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74  te fields..*/.st
15900 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20  ruct winShm {.  
15910 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
15920 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Node;      /* Th
15930 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e  e underlying win
15940 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
15950 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78  /.  winShm *pNex
15960 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
15970 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69  * Next winShm wi
15980 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53  th the same winS
15990 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68  hmNode */.  u8 h
159a0 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20  asMutex;        
159b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
159c0 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69  f holding the wi
159d0 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a  nShmNode mutex *
159e0 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61  /.  u16 sharedMa
159f0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sk;            /
15a00 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
15a10 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
15a20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20   u16 exclMask;  
15a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
15a40 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
15a50 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23   locks held */.#
15a60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
15a70 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20  UG.  u8 id;     
15a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a90 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f  /* Id of this co
15aa0 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74  nnection with it
15ab0 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  s winShmNode */.
15ac0 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
15ad0 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20   Constants used 
15ae0 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23  for locking.*/.#
15af0 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42  define WIN_SHM_B
15b00 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54  ASE   ((22+SQLIT
15b10 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20  E_SHM_NLOCK)*4) 
15b20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20         /* first 
15b30 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65  lock byte */.#de
15b40 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  fine WIN_SHM_DMS
15b50 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53      (WIN_SHM_BAS
15b60 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  E+SQLITE_SHM_NLO
15b70 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20  CK)  /* deadman 
15b80 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  switch */../*.**
15b90 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20   Apply advisory 
15ba0 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20  locks for all n 
15bb0 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20  bytes beginning 
15bc0 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66  at ofst..*/.#def
15bd0 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20  ine _SHM_UNLCK  
15be0 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 52  1.#define _SHM_R
15bf0 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e 65 20  DLCK  2.#define 
15c00 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74  _SHM_WRLCK  3.st
15c10 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53  atic int winShmS
15c20 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e  ystemLock(.  win
15c30 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20  ShmNode *pFile, 
15c40 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b     /* Apply lock
15c50 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73  s to this open s
15c60 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
15c70 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  ment */.  int lo
15c80 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20  ckType,         
15c90 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f  /* _SHM_UNLCK, _
15ca0 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 5f 53  SHM_RDLCK, or _S
15cb0 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e  HM_WRLCK */.  in
15cc0 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
15cd0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
15ce0 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   first byte to b
15cf0 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65  e locked/unlocke
15d00 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  d */.  int nByte
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
15d30 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63  to lock or unloc
15d40 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  k */.){.  int rc
15d50 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
15d60 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
15d70 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46  orm Lock/UnlockF
15d80 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a  ileEx() */..  /*
15d90 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 77   Access to the w
15da0 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
15db0 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
15dc0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
15dd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15de0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69  3_mutex_held(pFi
15df0 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 46  le->mutex) || pF
15e00 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ile->nRef==0 );.
15e10 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63  .  /* Release/Ac
15e20 71 75 69 72 65 20 74 68 65 20 73 79 73 74 65 6d  quire the system
15e30 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20  -level lock */. 
15e40 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f   if( lockType==_
15e50 53 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  SHM_UNLCK ){.   
15e60 20 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46   rc = winUnlockF
15e70 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c  ile(&pFile->hFil
15e80 65 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42  e.h, ofst, 0, nB
15e90 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  yte, 0);.  }else
15ea0 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
15eb0 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ize the locking 
15ec0 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20  parameters */.  
15ed0 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 20    DWORD dwFlags 
15ee0 3d 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  = LOCKFILE_FAIL_
15ef0 49 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 20  IMMEDIATELY;.   
15f00 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d   if( lockType ==
15f10 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77   _SHM_WRLCK ) dw
15f20 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c  Flags |= LOCKFIL
15f30 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
15f40 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  ;.    rc = winLo
15f50 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
15f60 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c  File.h, dwFlags,
15f70 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c   ofst, 0, nByte,
15f80 20 30 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66   0);.  }.  .  if
15f90 28 20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20 20  ( rc!= 0 ){.    
15fa0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15fb0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
15fc0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
15fd0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
15fe0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
15ff0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20  TE_BUSY;.  }..  
16000 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
16010 43 4b 20 25 64 20 25 73 20 25 73 20 30 78 25 30  CK %d %s %s 0x%0
16020 38 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  8lx\n", .       
16030 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65      pFile->hFile
16040 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 72  .h,.           r
16050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
16060 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 2c 0a  ok" : "failed",.
16070 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 54             lockT
16080 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20  ype==_SHM_UNLCK 
16090 3f 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22  ? "UnlockFileEx"
160a0 20 3a 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c   : "LockFileEx",
160b0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
160c0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 29 3b 0a  e->lastErrno));.
160d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
160e0 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
160f0 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65  rences to VFS me
16100 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  thods */.static 
16110 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69  int winOpen(sqli
16120 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63  te3_vfs*,const c
16130 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c  har*,sqlite3_fil
16140 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74  e*,int,int*);.st
16150 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65  atic int winDele
16160 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  te(sqlite3_vfs *
16170 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  ,const char*,int
16180 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20  );../*.** Purge 
16190 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  the winShmNodeLi
161a0 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
161b0 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e 53  ntries with winS
161c0 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a  hmNode.nRef==0..
161d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
161e0 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d  t a VFS shared-m
161f0 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74  emory method; it
16200 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75   is a utility fu
16210 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a  nction called.**
16220 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d   by VFS shared-m
16230 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a  emory methods..*
16240 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
16250 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65  nShmPurge(sqlite
16260 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
16270 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20   deleteFlag){.  
16280 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b  winShmNode **pp;
16290 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
162a0 3b 0a 20 20 42 4f 4f 4c 20 62 52 63 3b 0a 20 20  ;.  BOOL bRc;.  
162b0 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75  assert( winShmMu
162c0 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 70  texHeld() );.  p
162d0 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c  p = &winShmNodeL
162e0 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  ist;.  while( (p
162f0 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20   = *pp)!=0 ){.  
16300 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30    if( p->nRef==0
16310 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
16320 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75  .      if( p->mu
16330 74 65 78 20 29 20 73 71 6c 69 74 65 33 5f 6d 75  tex ) sqlite3_mu
16340 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65  tex_free(p->mute
16350 78 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  x);.      for(i=
16360 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
16370 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 62   i++){.        b
16380 52 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65 77  Rc = osUnmapView
16390 4f 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f  OfFile(p->aRegio
163a0 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20  n[i].pMap);.    
163b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
163c0 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64 20 75  M-PURGE pid-%d u
163d0 6e 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64 20 25  nmap region=%d %
163e0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
163f0 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65         (int)osGe
16400 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
16410 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20 20 20  d(), i,.        
16420 20 20 20 20 20 20 20 20 20 62 52 63 20 3f 20 22           bRc ? "
16430 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
16440 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20  ;.        bRc = 
16450 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d  osCloseHandle(p-
16460 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70  >aRegion[i].hMap
16470 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
16480 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20 70  CE(("SHM-PURGE p
16490 69 64 2d 25 64 20 63 6c 6f 73 65 20 72 65 67 69  id-%d close regi
164a0 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20  on=%d %s\n",.   
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
164c0 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50  nt)osGetCurrentP
164d0 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 0a 20  rocessId(), i,. 
164e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164f0 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  bRc ? "ok" : "fa
16500 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d  iled"));.      }
16510 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 46  .      if( p->hF
16520 69 6c 65 2e 68 20 21 3d 20 49 4e 56 41 4c 49 44  ile.h != INVALID
16530 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b  _HANDLE_VALUE ){
16540 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
16550 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
16560 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 43 6c  );.        winCl
16570 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
16580 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a  e *)&p->hFile);.
16590 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
165a0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
165b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
165c0 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29  if( deleteFlag )
165d0 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  {.        Simula
165e0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
165f0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
16600 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
16610 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
16620 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73 2c 20  winDelete(pVfs, 
16630 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  p->zFilename, 0)
16640 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
16650 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
16660 28 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75  ();.        Simu
16670 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
16680 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n(0);.      }.  
16690 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65      *pp = p->pNe
166a0 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
166b0 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67 69 6f  3_free(p->aRegio
166c0 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
166d0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d  3_free(p);.    }
166e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d  else{.      pp =
166f0 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20   &p->pNext;.    
16700 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  }.  }.}../*.** O
16710 70 65 6e 20 74 68 65 20 73 68 61 72 65 64 2d 6d  pen the shared-m
16720 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63  emory area assoc
16730 69 61 74 65 64 20 77 69 74 68 20 64 61 74 61 62  iated with datab
16740 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 0a  ase file pDbFd..
16750 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69  **.** When openi
16760 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d  ng a new shared-
16770 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20  memory file, if 
16780 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63  no other instanc
16790 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69  es of that.** fi
167a0 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  le are currently
167b0 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70   open, in this p
167c0 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68  rocess or in oth
167d0 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68  er processes, th
167e0 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d  en.** the file m
167f0 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64  ust be truncated
16800 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20   to zero length 
16810 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64  or have its head
16820 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73  er cleared..*/.s
16830 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65  tatic int winOpe
16840 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 69  nSharedMemory(wi
16850 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20  nFile *pDbFd){. 
16860 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 2a   struct winShm *
16870 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
16880 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
16890 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e  ction to be open
168a0 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77  ed */.  struct w
168b0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
168c0 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  ode = 0;   /* Th
168d0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61  e underlying mma
168e0 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69  pped file */.  i
168f0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
16900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16910 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
16920 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e   */.  struct win
16930 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20  ShmNode *pNew;  
16940 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c           /* Newl
16950 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53  y allocated winS
16960 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  hmNode */.  int 
16970 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
16980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16990 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20  * Size of zName 
169a0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61  in bytes */..  a
169b0 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53  ssert( pDbFd->pS
169c0 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e  hm==0 );    /* N
169d0 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70  ot previously op
169e0 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  ened */..  /* Al
169f0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
16a00 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33   the new sqlite3
16a10 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c  _shm object.  Al
16a20 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79  so speculatively
16a30 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73  .  ** allocate s
16a40 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 77  pace for a new w
16a50 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69  inShmNode and fi
16a60 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70  lename..  */.  p
16a70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
16a80 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29  Zero( sizeof(*p)
16a90 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
16aa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
16ab0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e 4e  OERR_NOMEM;.  nN
16ac0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
16ad0 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61  len30(pDbFd->zPa
16ae0 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  th);.  pNew = sq
16af0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
16b00 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
16b10 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20  e) + nName + 17 
16b20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
16b30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
16b40 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74  free(p);.    ret
16b50 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
16b60 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 4e  _NOMEM;.  }.  pN
16b70 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  ew->zFilename = 
16b80 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
16b90 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
16ba0 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e  ntf(nName+15, pN
16bb0 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22  ew->zFilename, "
16bc0 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e  %s-shm", pDbFd->
16bd0 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65  zPath);.  sqlite
16be0 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
16bf0 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d  Fd->zPath, pNew-
16c00 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20  >zFilename); .. 
16c10 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20   /* Look to see 
16c20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65  if there is an e
16c30 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  xisting winShmNo
16c40 64 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  de that can be u
16c50 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20  sed..  ** If no 
16c60 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e  matching winShmN
16c70 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ode currently ex
16c80 69 73 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e  ists, create a n
16c90 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77  ew one..  */.  w
16ca0 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
16cb0 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64  );.  for(pShmNod
16cc0 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  e = winShmNodeLi
16cd0 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53  st; pShmNode; pS
16ce0 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d  hmNode=pShmNode-
16cf0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20  >pNext){.    /* 
16d00 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65  TBD need to come
16d10 20 75 70 20 77 69 74 68 20 62 65 74 74 65 72 20   up with better 
16d20 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50 65 72  match here.  Per
16d30 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20  haps.    ** use 
16d40 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52  FILE_ID_BOTH_DIR
16d50 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e  _INFO Structure.
16d60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
16d70 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
16d80 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
16d90 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  me, pNew->zFilen
16da0 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
16db0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
16dc0 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
16dd0 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
16de0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d   }else{.    pShm
16df0 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Node = pNew;.   
16e00 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28   pNew = 0;.    (
16e10 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d  (winFile*)(&pShm
16e20 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68  Node->hFile))->h
16e30 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c   = INVALID_HANDL
16e40 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68  E_VALUE;.    pSh
16e50 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77  mNode->pNext = w
16e60 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20  inShmNodeList;. 
16e70 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73     winShmNodeLis
16e80 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20  t = pShmNode;.. 
16e90 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74     pShmNode->mut
16ea0 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
16eb0 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
16ec0 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20  MUTEX_FAST);.   
16ed0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
16ee0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
16ef0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
16f00 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
16f10 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
16f20 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  r;.    }..    rc
16f30 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64   = winOpen(pDbFd
16f40 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20  ->pVfs,.        
16f50 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
16f60 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  e->zFilename,   
16f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
16f80 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
16f90 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20  TF-8) */.       
16fa0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
16fb0 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f  e3_file*)&pShmNo
16fc0 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46  de->hFile,  /* F
16fd0 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
16fe0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
16ff0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
17000 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  WAL | SQLITE_OPE
17010 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
17020 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
17030 2c 20 2f 2a 20 4d 6f 64 65 20 66 6c 61 67 73 20  , /* Mode flags 
17040 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
17050 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
17060 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
17070 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
17080 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
17090 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
170a0 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
170b0 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
170c0 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
170d0 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49  switch..    ** I
170e0 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
170f0 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
17100 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f   length. .    */
17110 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53  .    if( winShmS
17120 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
17130 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20  de, _SHM_WRLCK, 
17140 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d  WIN_SHM_DMS, 1)=
17150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17160 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
17170 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
17180 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
17190 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  hFile, 0);.     
171a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
171b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
171c0 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
171d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
171e0 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  PEN, osGetLastEr
171f0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
17200 20 20 20 20 20 20 20 20 22 77 69 6e 4f 70 65 6e          "winOpen
17210 53 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  Shm", pDbFd->zPa
17220 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
17230 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
17240 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17250 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f    winShmSystemLo
17260 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
17270 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_UNLCK, WIN_SHM
17280 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20  _DMS, 1);.      
17290 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
172a0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
172b0 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f  _SHM_RDLCK, WIN_
172c0 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20  SHM_DMS, 1);.   
172d0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
172e0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
172f0 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  r;.  }..  /* Mak
17300 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
17310 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
17320 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  the winShmNode *
17330 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
17340 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64  = pShmNode;.#ifd
17350 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
17360 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
17370 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
17380 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
17390 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
173a0 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
173b0 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
173c0 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72  x();..  /* The r
173d0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
173e0 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61  n pShmNode has a
173f0 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
17400 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20  emented under.  
17410 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20  ** the cover of 
17420 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  the winShmEnterM
17430 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64  utex() mutex and
17440 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f   the pointer fro
17450 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28  m the.  ** new (
17460 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f  struct winShm) o
17470 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
17480 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
17490 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
174a0 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
174b0 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
174c0 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
174d0 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
174e0 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
174f0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
17500 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
17510 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
17520 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e  g the pShmNode->
17530 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65  mutex .  ** mute
17540 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
17550 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
17560 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
17570 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
17580 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
17590 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
175a0 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
175b0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
175c0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
175d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
175e0 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
175f0 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
17600 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
17610 0a 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  .  winShmSystemL
17620 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
17630 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_UNLCK, WIN_SH
17640 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e  M_DMS, 1);.  win
17650 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e  ShmPurge(pDbFd->
17660 70 56 66 73 2c 20 30 29 3b 20 20 20 20 20 20 2f  pVfs, 0);      /
17670 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65  * This call free
17680 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65  s pShmNode if re
17690 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69  quired */.  sqli
176a0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73  te3_free(p);.  s
176b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
176c0 29 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  );.  winShmLeave
176d0 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
176e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
176f0 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
17700 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n to shared-memo
17710 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  ry.  Delete the 
17720 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73  underlying .** s
17730 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
17740 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f  Flag is true..*/
17750 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
17760 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
17770 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
17780 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
17790 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
177a0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
177b0 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
177c0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
177d0 65 20 61 66 74 65 72 20 63 6c 6f 73 69 6e 67 20  e after closing 
177e0 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
177f0 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  winFile *pDbFd; 
17800 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
17810 65 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  e holding shared
17820 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e  -memory */.  win
17830 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
17840 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63     /* The connec
17850 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65  tion to be close
17860 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  d */.  winShmNod
17870 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20  e *pShmNode; /* 
17880 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73  The underlying s
17890 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
178a0 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a  e */.  winShm **
178b0 70 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pp;          /* 
178c0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
178d0 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
178e0 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64  ions */..  pDbFd
178f0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b   = (winFile*)fd;
17900 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  .  p = pDbFd->pS
17910 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  hm;.  if( p==0 )
17920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17930 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  K;.  pShmNode = 
17940 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
17950 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
17960 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
17970 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
17980 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ns associated.  
17990 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65  ** with pShmNode
179a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
179b0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
179c0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  de->mutex);.  fo
179d0 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
179e0 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
179f0 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
17a00 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
17a10 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
17a20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
17a30 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
17a40 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
17a50 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
17a60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
17a70 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
17a80 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
17a90 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68  pShmNode->nRef h
17aa0 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
17ab0 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
17ac0 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
17ad0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
17ae0 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d   too */.  winShm
17af0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
17b00 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
17b10 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53  ->nRef>0 );.  pS
17b20 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  hmNode->nRef--;.
17b30 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
17b40 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77  nRef==0 ){.    w
17b50 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  inShmPurge(pDbFd
17b60 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74 65 46 6c  ->pVfs, deleteFl
17b70 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68  ag);.  }.  winSh
17b80 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
17b90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17ba0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
17bb0 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  nge the lock sta
17bc0 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d  te for a shared-
17bd0 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a  memory segment..
17be0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
17bf0 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  nShmLock(.  sqli
17c00 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
17c10 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
17c20 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
17c30 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
17c40 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
17c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c60 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
17c70 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
17c80 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
17c90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17ca0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
17cb0 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
17cc0 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
17cd0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17cf0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
17d00 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
17d10 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
17d20 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
17d30 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  ;        /* Conn
17d40 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
17d50 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
17d60 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44    winShm *p = pD
17d70 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20  bFd->pShm;      
17d80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
17d90 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
17da0 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77  ng locked */.  w
17db0 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20  inShm *pX;      
17dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17dd0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
17de0 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
17df0 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68  lings */.  winSh
17e00 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
17e10 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
17e20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17e30 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
17e40 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
17e50 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
17e60 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
17e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e80 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
17e90 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
17ea0 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
17eb0 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66  t( ofst>=0 && of
17ec0 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d  st+n<=SQLITE_SHM
17ed0 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  _NLOCK );.  asse
17ee0 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73  rt( n>=1 );.  as
17ef0 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51  sert( flags==(SQ
17f00 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
17f10 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
17f20 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
17f30 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
17f40 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
17f50 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20  M_EXCLUSIVE).   
17f60 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
17f70 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
17f80 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
17f90 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
17fa0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
17fb0 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
17fc0 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
17fd0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ) );.  assert( n
17fe0 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==1 || (flags & 
17ff0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
18000 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d  SIVE)!=0 );..  m
18010 61 73 6b 20 3d 20 28 75 31 36 29 28 28 31 55 3c  ask = (u16)((1U<
18020 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 55  <(ofst+n)) - (1U
18030 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61 73 73 65  <<ofst));.  asse
18040 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
18050 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
18060 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
18070 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
18080 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
18090 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
180a0 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
180b0 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
180c0 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
180d0 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
180e0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
180f0 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
18100 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
18110 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
18120 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
18130 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
18140 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
18150 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
18160 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18170 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
18180 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
18190 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
181a0 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
181b0 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
181c0 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
181d0 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
181e0 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
181f0 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
18200 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
18210 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
18220 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
18230 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
18240 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d  CK, ofst+WIN_SHM
18250 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
18260 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
18270 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18280 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
18290 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
182a0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
182b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
182c0 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
182d0 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
182e0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
182f0 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
18300 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
18310 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
18320 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
18330 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
18340 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
18350 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
18360 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
18370 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
18380 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
18390 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
183a0 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
183b0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
183c0 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
183d0 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
183e0 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
183f0 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
18400 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
18410 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
18420 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
18430 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
18440 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
18450 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
18460 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
18470 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
18480 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18490 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
184a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
184b0 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
184c0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
184d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
184e0 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
184f0 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
18500 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
18510 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
18520 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18530 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
18540 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
18550 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
18560 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
18570 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
18580 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53  DLCK, ofst+WIN_S
18590 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
185a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
185b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
185c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
185d0 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
185e0 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
185f0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
18600 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18610 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
18620 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
18630 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
18640 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
18650 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
18660 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
18670 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
18680 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
18690 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
186a0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
186b0 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
186c0 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
186d0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
186e0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
186f0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
18700 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
18710 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
18720 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
18730 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
18740 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
18750 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18760 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
18770 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65      /* Get the e
18780 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
18790 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
187a0 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
187b0 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61  cessful.    ** a
187c0 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
187d0 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
187e0 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
187f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
18800 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18810 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
18820 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
18830 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
18840 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
18850 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  SE, n);.      if
18860 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18870 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
18880 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  t( (p->sharedMas
18890 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a  k & mask)==0 );.
188a0 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d          p->exclM
188b0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
188c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
188d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
188e0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
188f0 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
18900 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69  (("SHM-LOCK shmi
18910 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74  d-%d, pid-%d got
18920 20 25 30 33 78 2c 25 30 33 78 20 25 73 5c 6e 22   %03x,%03x %s\n"
18930 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
18940 69 64 2c 20 28 69 6e 74 29 6f 73 47 65 74 43 75  id, (int)osGetCu
18950 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
18960 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
18970 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20   p->exclMask,.  
18980 20 20 20 20 20 20 20 20 20 72 63 20 3f 20 22 66           rc ? "f
18990 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
189a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
189b0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
189c0 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65   a memory barrie
189d0 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63  r or memory fenc
189e0 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  e on shared memo
189f0 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ry.  .**.** All 
18a00 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73  loads and stores
18a10 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68   begun before th
18a20 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63  e barrier must c
18a30 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a  omplete before.*
18a40 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74  * any load or st
18a50 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20  ore begun after 
18a60 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  the barrier..*/.
18a70 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
18a80 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c  hmBarrier(.  sql
18a90 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
18aa0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
18ab0 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  se holding the s
18ac0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
18ad0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
18ae0 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 2f 2a 20  METER(fd);.  /* 
18af0 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b  MemoryBarrier();
18b00 20 2f 2f 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72   // does not wor
18b10 6b 20 2d 2d 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  k -- do not know
18b20 20 77 68 79 20 6e 6f 74 20 2a 2f 0a 20 20 77 69   why not */.  wi
18b30 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
18b40 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
18b50 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  utex();.}../*.**
18b60 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
18b70 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
18b80 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
18b90 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
18ba0 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
18bb0 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
18bc0 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
18bd0 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
18be0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
18bf0 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
18c00 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
18c10 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
18c20 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
18c30 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
18c40 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
18c50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
18c60 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
18c70 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
18c80 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
18c90 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
18ca0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
18cb0 66 20 74 68 65 20 69 73 57 72 69 74 65 20 70 61  f the isWrite pa
18cc0 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
18cd0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
18ce0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
18cf0 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
18d00 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
18d10 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
18d20 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
18d30 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
18d40 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
18d50 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
18d60 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
18d70 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
18d80 66 20 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73  f .** isWrite is
18d90 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
18da0 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
18db0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
18dc0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
18dd0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
18de0 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
18df0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
18e00 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
18e10 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
18e20 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
18e30 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
18e40 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
18e50 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
18e60 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
18e70 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
18e80 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
18e90 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
18ea0 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
18eb0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
18ec0 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
18ed0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
18ee0 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
18ef0 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
18f00 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
18f10 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 61 70  ic int winShmMap
18f20 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
18f30 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20   *fd,           
18f40 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70      /* Handle op
18f50 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  en on database f
18f60 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ile */.  int iRe
18f70 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
18f80 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
18f90 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a  on to retrieve *
18fa0 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
18fb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18fc0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
18fd0 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
18fe0 69 73 57 72 69 74 65 2c 20 20 20 20 20 20 20 20  isWrite,        
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19000 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69  rue to extend fi
19010 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  le if necessary 
19020 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
19030 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20  le **pp         
19040 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70       /* OUT: Map
19050 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  ped memory */.){
19060 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
19070 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
19080 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d 20  ;.  winShm *p = 
19090 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77  pDbFd->pShm;.  w
190a0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
190b0 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ode;.  int rc = 
190c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
190d0 28 20 21 70 20 29 7b 0a 20 20 20 20 72 63 20 3d  ( !p ){.    rc =
190e0 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65   winOpenSharedMe
190f0 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20  mory(pDbFd);.   
19100 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
19110 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
19120 20 20 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70      p = pDbFd->p
19130 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e  Shm;.  }.  pShmN
19140 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
19150 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e;..  sqlite3_mu
19160 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
19170 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
19180 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
19190 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
191a0 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
191b0 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20  nRegion==0 );.. 
191c0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
191d0 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
191e0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68  ){.    struct Sh
191f0 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20  mRegion *apNew; 
19200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
19210 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79   aRegion[] array
19220 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
19230 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  e = (iRegion+1)*
19240 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69  szRegion;  /* Mi
19250 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
19260 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
19270 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
19280 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19290 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
192a0 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20  ze of wal-index 
192b0 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68  file */..    pSh
192c0 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
192d0 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
192e0 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
192f0 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20  d region is not 
19300 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
19310 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
19320 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a  ss space..    **
19330 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
19340 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
19350 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
19360 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
19370 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72  le is.    ** lar
19380 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
19390 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
193a0 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
193b0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46  */.    rc = winF
193c0 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33  ileSize((sqlite3
193d0 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
193e0 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a  e->hFile, &sz);.
193f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
19400 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
19410 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
19420 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
19430 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45  SIZE, osGetLastE
19440 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
19450 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
19460 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p1", pDbFd->zPat
19470 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  h);.      goto s
19480 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
19490 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42  }..    if( sz<nB
194a0 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  yte ){.      /* 
194b0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
194c0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
194d0 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69   not exist. If i
194e0 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f  sWrite is set to
194f0 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20  .      ** zero, 
19500 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
19510 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
19520 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
19530 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
19540 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c    **.      ** Al
19550 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
19560 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
19570 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61  ero, use ftrunca
19580 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
19590 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65  .      ** the re
195a0 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
195b0 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  egion..      */.
195c0 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69        if( !isWri
195d0 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67  te ) goto shmpag
195e0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20  e_out;.      rc 
195f0 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
19600 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
19610 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
19620 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
19630 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19640 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
19650 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
19660 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
19670 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
19680 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
19690 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32       "winShmMap2
196a0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
196b0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
196c0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
196d0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
196e0 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
196f0 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
19700 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
19710 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
19720 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
19730 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52  w = (struct ShmR
19740 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f  egion *)sqlite3_
19750 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
19760 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
19770 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  on, (iRegion+1)*
19780 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d 29  sizeof(apNew[0])
19790 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
197a0 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !apNew ){.      
197b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
197c0 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  R_NOMEM;.      g
197d0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
197e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
197f0 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61  ode->aRegion = a
19800 70 4e 65 77 3b 0a 0a 20 20 20 20 77 68 69 6c 65  pNew;..    while
19810 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
19820 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a  ion<=iRegion ){.
19830 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61        HANDLE hMa
19840 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20 20  p = NULL;       
19850 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69 6e    /* file-mappin
19860 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  g handle */.    
19870 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20 30    void *pMap = 0
19880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
19890 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 72   Mapped memory r
198a0 65 67 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 0a 23  egion */.     .#
198b0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
198c0 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  RT.      hMap = 
198d0 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
198e0 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68 6d 4e  ingFromApp(pShmN
198f0 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20  ode->hFile.h,.  
19900 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41          NULL, PA
19910 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 6e 42  GE_READWRITE, nB
19920 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
19930 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
19940 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
19950 53 5f 57 49 44 45 29 0a 20 20 20 20 20 20 68 4d  S_WIDE).      hM
19960 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
19970 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d 4e 6f  eMappingW(pShmNo
19980 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20  de->hFile.h, .  
19990 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41          NULL, PA
199a0 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
199b0 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20   nByte, NULL.   
199c0 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69     );.#elif defi
199d0 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
199e0 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 20  _HAS_ANSI).     
199f0 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
19a00 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 53 68  FileMappingA(pSh
19a10 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  mNode->hFile.h, 
19a20 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  .          NULL,
19a30 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
19a40 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a   0, nByte, NULL.
19a50 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a        );.#endif.
19a60 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
19a70 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 63  SHM-MAP pid-%d c
19a80 72 65 61 74 65 20 72 65 67 69 6f 6e 3d 25 64 20  reate region=%d 
19a90 6e 62 79 74 65 3d 25 64 20 25 73 5c 6e 22 2c 0a  nbyte=%d %s\n",.
19aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
19ab0 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74  int)osGetCurrent
19ac0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68  ProcessId(), pSh
19ad0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20  mNode->nRegion, 
19ae0 6e 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20  nByte,.         
19af0 20 20 20 20 20 20 68 4d 61 70 20 3f 20 22 6f 6b        hMap ? "ok
19b00 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
19b10 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29        if( hMap )
19b20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  {.        int iO
19b30 66 66 73 65 74 20 3d 20 70 53 68 6d 4e 6f 64 65  ffset = pShmNode
19b40 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69  ->nRegion*szRegi
19b50 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  on;.        int 
19b60 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69  iOffsetShift = i
19b70 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49  Offset % winSysI
19b80 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
19b90 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 23 69 66  Granularity;.#if
19ba0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
19bb0 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20  .        pMap = 
19bc0 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
19bd0 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20 46 49 4c  romApp(hMap, FIL
19be0 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49  E_MAP_WRITE | FI
19bf0 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20  LE_MAP_READ,.   
19c00 20 20 20 20 20 20 20 20 20 69 4f 66 66 73 65 74           iOffset
19c10 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c   - iOffsetShift,
19c20 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66   szRegion + iOff
19c30 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20  setShift.       
19c40 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
19c50 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69    pMap = osMapVi
19c60 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 46  ewOfFile(hMap, F
19c70 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c 20  ILE_MAP_WRITE | 
19c80 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a 20  FILE_MAP_READ,. 
19c90 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 69 4f             0, iO
19ca0 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53  ffset - iOffsetS
19cb0 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b  hift, szRegion +
19cc0 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20   iOffsetShift.  
19cd0 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69 66 0a        );.#endif.
19ce0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
19cf0 28 22 53 48 4d 2d 4d 41 50 20 70 69 64 2d 25 64  ("SHM-MAP pid-%d
19d00 20 6d 61 70 20 72 65 67 69 6f 6e 3d 25 64 20 6f   map region=%d o
19d10 66 66 73 65 74 3d 25 64 20 73 69 7a 65 3d 25 64  ffset=%d size=%d
19d20 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
19d30 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73           (int)os
19d40 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
19d50 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d  sId(), pShmNode-
19d60 3e 6e 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65  >nRegion, iOffse
19d70 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
19d80 20 20 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d      szRegion, pM
19d90 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
19da0 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a  led"));.      }.
19db0 20 20 20 20 20 20 69 66 28 20 21 70 4d 61 70 20        if( !pMap 
19dc0 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  ){.        pShmN
19dd0 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ode->lastErrno =
19de0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
19df0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
19e00 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
19e10 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c  TE_IOERR_SHMMAP,
19e20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45   pShmNode->lastE
19e30 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
19e40 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
19e50 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p3", pDbFd->zPat
19e60 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  h);.        if( 
19e70 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61  hMap ) osCloseHa
19e80 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20  ndle(hMap);.    
19e90 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
19ea0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _out;.      }.. 
19eb0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
19ec0 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
19ed0 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d  >nRegion].pMap =
19ee0 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68   pMap;.      pSh
19ef0 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70  mNode->aRegion[p
19f00 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
19f10 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20  ].hMap = hMap;. 
19f20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
19f30 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a  Region++;.    }.
19f40 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
19f50 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
19f60 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
19f70 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  n ){.    int iOf
19f80 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73  fset = iRegion*s
19f90 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74  zRegion;.    int
19fa0 20 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20   iOffsetShift = 
19fb0 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73  iOffset % winSys
19fc0 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f  Info.dwAllocatio
19fd0 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20  nGranularity;.  
19fe0 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61    char *p = (cha
19ff0 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52  r *)pShmNode->aR
1a000 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70  egion[iRegion].p
1a010 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28  Map;.    *pp = (
1a020 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65  void *)&p[iOffse
1a030 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65  tShift];.  }else
1a040 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
1a050 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1a060 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1a070 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
1a080 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65  urn rc;.}..#else
1a090 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
1a0a0 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
1a0b0 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20  ne winShmLock   
1a0c0 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53   0.# define winS
1a0d0 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65  hmBarrier 0.# de
1a0e0 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70  fine winShmUnmap
1a0f0 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23     0.#endif /* #
1a100 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a110 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  IT_WAL */../*.**
1a120 20 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69   Here ends the i
1a130 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1a140 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c   all sqlite3_fil
1a150 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a  e methods..**.**
1a160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a170 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33  **** End sqlite3
1a180 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a  _file Methods **
1a190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a1a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1a1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a1c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a1d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a1e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
1a200 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72  *.** This vector
1a210 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65   defines all the
1a220 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61   methods that ca
1a230 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a  n operate on an.
1a240 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ** sqlite3_file 
1a250 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74  for win32..*/.st
1a260 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
1a270 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69  e3_io_methods wi
1a280 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20  nIoMethod = {.  
1a290 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2,              
1a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2b0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
1a2c0 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20   winClose,      
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2e0 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20   /* xClose */.  
1a2f0 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20  winRead,        
1a300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a310 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69  /* xRead */.  wi
1a320 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  nWrite,         
1a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a340 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e   xWrite */.  win
1a350 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a370 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77  xTruncate */.  w
1a380 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  inSync,         
1a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a3a0 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e  * xSync */.  win
1a3b0 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20  FileSize,       
1a3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a3d0 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77  xFileSize */.  w
1a3e0 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  inLock,         
1a3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a400 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  * xLock */.  win
1a410 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
1a420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a430 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  xUnlock */.  win
1a440 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1a450 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  k,           /* 
1a460 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1a470 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43  ck */.  winFileC
1a480 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20  ontrol,         
1a490 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65          /* xFile
1a4a0 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e  Control */.  win
1a4b0 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20  SectorSize,     
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a4d0 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20  xSectorSize */. 
1a4e0 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63   winDeviceCharac
1a4f0 74 65 72 69 73 74 69 63 73 2c 20 20 20 20 20 20  teristics,      
1a500 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61   /* xDeviceChara
1a510 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
1a520 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20  winShmMap,      
1a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a540 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20  /* xShmMap */.  
1a550 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20  winShmLock,     
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a570 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20  /* xShmLock */. 
1a580 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20   winShmBarrier, 
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5a0 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20   /* xShmBarrier 
1a5b0 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70  */.  winShmUnmap
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5d0 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61       /* xShmUnma
1a5e0 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  p */.};../******
1a5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a630 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
1a640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a650 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  *** sqlite3_vfs 
1a660 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  methods ********
1a670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a680 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ****.**.** This 
1a690 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e  division contain
1a6a0 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
1a6b0 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20  tion of methods 
1a6c0 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  on the.** sqlite
1a6d0 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f  3_vfs object..*/
1a6e0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
1a6f0 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65  a UTF-8 filename
1a700 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66   into whatever f
1a710 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69  orm the underlyi
1a720 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  ng.** operating 
1a730 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c  system wants fil
1a740 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63  enames in.  Spac
1a750 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
1a760 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69  sult.** is obtai
1a770 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20  ned from malloc 
1a780 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65  and must be free
1a790 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  d by the calling
1a7a0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  .** function..*/
1a7b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 63 6f  .static void *co
1a7c0 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
1a7d0 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
1a7e0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64  ilename){.  void
1a7f0 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30   *zConverted = 0
1a800 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ;.  if( isNT() )
1a810 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
1a820 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65   = utf8ToUnicode
1a830 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  (zFilename);.  }
1a840 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
1a850 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
1a860 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65  else{.    zConve
1a870 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77  rted = sqlite3_w
1a880 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63  in32_utf8_to_mbc
1a890 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  s(zFilename);.  
1a8a0 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61  }.#endif.  /* ca
1a8b0 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65  ller will handle
1a8c0 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a   out of memory *
1a8d0 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76  /.  return zConv
1a8e0 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erted;.}../*.** 
1a8f0 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
1a900 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20  ry file name in 
1a910 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74  zBuf.  zBuf must
1a920 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
1a930 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 70 56 66  o.** hold at pVf
1a940 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 63 68  s->mxPathname ch
1a950 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61  aracters..*/.sta
1a960 74 69 63 20 69 6e 74 20 67 65 74 54 65 6d 70 6e  tic int getTempn
1a970 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
1a980 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61  ar *zBuf){.  sta
1a990 74 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b  tic char zChars[
1a9a0 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67  ] =.    "abcdefg
1a9b0 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
1a9c0 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46  xyz".    "ABCDEF
1a9d0 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
1a9e0 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34  WXYZ".    "01234
1a9f0 35 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74  56789";.  size_t
1aa00 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65   i, j;.  int nTe
1aa10 6d 70 50 61 74 68 3b 0a 20 20 63 68 61 72 20 7a  mpPath;.  char z
1aa20 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f 50 41 54  TempPath[MAX_PAT
1aa30 48 2b 32 5d 3b 0a 0a 20 20 2f 2a 20 49 74 27 73  H+2];..  /* It's
1aa40 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
1aa50 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
1aa60 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
1aa70 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
1aa80 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
1aa90 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
1aaa0 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
1aab0 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
1aac0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
1aad0 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
1aae0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1aaf0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1ab00 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 6d 65 6d  _IOERR );..  mem
1ab10 73 65 74 28 7a 54 65 6d 70 50 61 74 68 2c 20 30  set(zTempPath, 0
1ab20 2c 20 4d 41 58 5f 50 41 54 48 2b 32 29 3b 0a 0a  , MAX_PATH+2);..
1ab30 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65    if( sqlite3_te
1ab40 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a  mp_directory ){.
1ab50 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1ab60 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30  intf(MAX_PATH-30
1ab70 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73  , zTempPath, "%s
1ab80 22 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ", sqlite3_temp_
1ab90 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 7d 0a  directory);.  }.
1aba0 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
1abb0 49 4e 52 54 0a 20 20 65 6c 73 65 20 69 66 28 20  INRT.  else if( 
1abc0 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 63 68  isNT() ){.    ch
1abd0 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20 20 20  ar *zMulti;.    
1abe0 57 43 48 41 52 20 7a 57 69 64 65 50 61 74 68 5b  WCHAR zWidePath[
1abf0 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20 20 20 6f  MAX_PATH];.    o
1ac00 73 47 65 74 54 65 6d 70 50 61 74 68 57 28 4d 41  sGetTempPathW(MA
1ac10 58 5f 50 41 54 48 2d 33 30 2c 20 7a 57 69 64 65  X_PATH-30, zWide
1ac20 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d 75 6c 74  Path);.    zMult
1ac30 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  i = unicodeToUtf
1ac40 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  8(zWidePath);.  
1ac50 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a    if( zMulti ){.
1ac60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
1ac70 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d  printf(MAX_PATH-
1ac80 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22  30, zTempPath, "
1ac90 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20  %s", zMulti);.  
1aca0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1acb0 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 7d 65  (zMulti);.    }e
1acc0 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
1acd0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1ace0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OMEM;.    }.  }.
1acf0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
1ad00 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
1ad10 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
1ad20 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20 7a  Utf8;.    char z
1ad30 4d 62 63 73 50 61 74 68 5b 4d 41 58 5f 50 41 54  MbcsPath[MAX_PAT
1ad40 48 5d 3b 0a 20 20 20 20 6f 73 47 65 74 54 65 6d  H];.    osGetTem
1ad50 70 50 61 74 68 41 28 4d 41 58 5f 50 41 54 48 2d  pPathA(MAX_PATH-
1ad60 33 30 2c 20 7a 4d 62 63 73 50 61 74 68 29 3b 0a  30, zMbcsPath);.
1ad70 20 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69      zUtf8 = sqli
1ad80 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
1ad90 6f 5f 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68  o_utf8(zMbcsPath
1ada0 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38  );.    if( zUtf8
1adb0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1adc0 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
1add0 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74  ATH-30, zTempPat
1ade0 68 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  h, "%s", zUtf8);
1adf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1ae00 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20  ree(zUtf8);.    
1ae10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
1ae20 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1ae30 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
1ae40 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  }.#endif.#endif.
1ae50 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
1ae60 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
1ae70 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
1ae80 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
1ae90 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20  rary file .  ** 
1aea0 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e  name. If it is n
1aeb0 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
1aec0 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20  E_ERROR..  */.  
1aed0 6e 54 65 6d 70 50 61 74 68 20 3d 20 73 71 6c 69  nTempPath = sqli
1aee0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
1aef0 70 50 61 74 68 29 3b 0a 0a 20 20 69 66 28 20 28  pPath);..  if( (
1af00 6e 54 65 6d 70 50 61 74 68 20 2b 20 73 71 6c 69  nTempPath + sqli
1af10 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49  te3Strlen30(SQLI
1af20 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
1af30 46 49 58 29 20 2b 20 31 38 29 20 3e 3d 20 6e 42  FIX) + 18) >= nB
1af40 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  uf ){.    return
1af50 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1af60 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 6e 54 65 6d   }..  for(i=nTem
1af70 70 50 61 74 68 3b 20 69 3e 30 20 26 26 20 7a 54  pPath; i>0 && zT
1af80 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c  empPath[i-1]=='\
1af90 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65  \'; i--){}.  zTe
1afa0 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a 0a  mpPath[i] = 0;..
1afb0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1afc0 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75 66  tf(nBuf-18, zBuf
1afd0 2c 20 28 6e 54 65 6d 70 50 61 74 68 20 3e 20 30  , (nTempPath > 0
1afe0 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) ?.            
1aff0 20 20 20 20 20 20 20 20 20 20 20 22 25 73 5c 5c             "%s\\
1b000 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  "SQLITE_TEMP_FIL
1b010 45 5f 50 52 45 46 49 58 20 3a 20 53 51 4c 49 54  E_PREFIX : SQLIT
1b020 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
1b030 49 58 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  IX,.            
1b040 20 20 20 20 20 20 20 7a 54 65 6d 70 50 61 74 68         zTempPath
1b050 29 3b 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33  );.  j = sqlite3
1b060 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a  Strlen30(zBuf);.
1b070 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
1b080 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a  ness(15, &zBuf[j
1b090 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
1b0a0 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  <15; i++, j++){.
1b0b0 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
1b0c0 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
1b0d0 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
1b0e0 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
1b0f0 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20  ars)-1) ];.  }. 
1b100 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
1b110 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 0a  zBuf[j+1] = 0;..
1b120 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
1b130 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e 22   FILENAME: %s\n"
1b140 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72 65 74 75  , zBuf));.  retu
1b150 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
1b160 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1b170 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64  RUE if the named
1b180 20 66 69 6c 65 20 69 73 20 72 65 61 6c 6c 79 20   file is really 
1b190 61 20 64 69 72 65 63 74 6f 72 79 2e 20 20 52 65  a directory.  Re
1b1a0 74 75 72 6e 20 66 61 6c 73 65 20 69 66 0a 2a 2a  turn false if.**
1b1b0 20 69 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67   it is something
1b1c0 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 64 69   other than a di
1b1d0 72 65 63 74 6f 72 79 2c 20 6f 72 20 69 66 20 74  rectory, or if t
1b1e0 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
1b1f0 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c   of memory.** al
1b200 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  location failure
1b210 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b220 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76  winIsDir(const v
1b230 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 29  oid *zConverted)
1b240 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a  {.  DWORD attr;.
1b250 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
1b260 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
1b270 0a 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29  ..  if( isNT() )
1b280 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
1b290 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  0;.    WIN32_FIL
1b2a0 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
1b2b0 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
1b2c0 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74  memset(&sAttrDat
1b2d0 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74  a, 0, sizeof(sAt
1b2e0 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68  trData));.    wh
1b2f0 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65  ile( !(rc = osGe
1b300 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
1b310 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  xW((LPCWSTR)zCon
1b320 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
1b330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b340 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e       GetFileExIn
1b350 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20  foStandard,.    
1b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b370 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
1b380 61 74 61 29 29 20 26 26 20 72 65 74 72 79 49 6f  ata)) && retryIo
1b390 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
1b3a0 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66  rrno) ){}.    if
1b3b0 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 72  ( !rc ){.      r
1b3c0 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49 6e 76 61  eturn 0; /* Inva
1b3d0 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20  lid name? */.   
1b3e0 20 7d 0a 20 20 20 20 61 74 74 72 20 3d 20 73 41   }.    attr = sA
1b3f0 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74  ttrData.dwFileAt
1b400 74 72 69 62 75 74 65 73 3b 0a 23 69 66 20 53 51  tributes;.#if SQ
1b410 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30  LITE_OS_WINCE==0
1b420 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74  .  }else{.    at
1b430 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
1b440 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a  tributesA((char*
1b450 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65  )zConverted);.#e
1b460 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72  ndif.  }.  retur
1b470 6e 20 28 61 74 74 72 21 3d 49 4e 56 41 4c 49 44  n (attr!=INVALID
1b480 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
1b490 29 20 26 26 20 28 61 74 74 72 26 46 49 4c 45 5f  ) && (attr&FILE_
1b4a0 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
1b4b0 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  ORY);.}../*.** O
1b4c0 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pen a file..*/.s
1b4d0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65  tatic int winOpe
1b4e0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
1b4f0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 2f   *pVfs,        /
1b500 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
1b510 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
1b520 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  e,        /* Nam
1b530 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
1b540 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74  TF-8) */.  sqlit
1b550 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
1b560 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
1b570 65 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61  e SQLite file ha
1b580 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  ndle here */.  i
1b590 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
1b5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
1b5b0 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20   mode flags */. 
1b5c0 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20   int *pOutFlags 
1b5d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
1b5e0 61 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67  atus return flag
1b5f0 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45  s */.){.  HANDLE
1b600 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   h;.  DWORD last
1b610 45 72 72 6e 6f 3b 0a 20 20 44 57 4f 52 44 20 64  Errno;.  DWORD d
1b620 77 44 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a  wDesiredAccess;.
1b630 20 20 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d    DWORD dwShareM
1b640 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43  ode;.  DWORD dwC
1b650 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
1b660 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c  on;.  DWORD dwFl
1b670 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
1b680 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45   = 0;.#if SQLITE
1b690 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20  _OS_WINCE.  int 
1b6a0 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64  isTemp = 0;.#end
1b6b0 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  if.  winFile *pF
1b6c0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
1b6d0 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  id;.  void *zCon
1b6e0 76 65 72 74 65 64 3b 20 20 20 20 20 20 20 20 20  verted;         
1b6f0 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
1b700 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20   in OS encoding 
1b710 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1b720 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61  *zUtf8Name = zNa
1b730 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20  me; /* Filename 
1b740 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e  in UTF-8 encodin
1b750 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d  g */.  int cnt =
1b760 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67   0;..  /* If arg
1b770 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61  ument zPath is a
1b780 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74   NULL pointer, t
1b790 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1b7a0 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e  required to open
1b7b0 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  .  ** a temporar
1b7c0 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73  y file. Use this
1b7d0 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65   buffer to store
1b7e0 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69   the file name i
1b7f0 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a  n..  */.  char z
1b800 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Tmpname[MAX_PATH
1b810 2b 32 5d 3b 20 20 20 20 20 2f 2a 20 42 75 66 66  +2];     /* Buff
1b820 65 72 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  er used to creat
1b830 65 20 74 65 6d 70 20 66 69 6c 65 6e 61 6d 65 20  e temp filename 
1b840 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  */..  int rc = S
1b850 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1b860 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
1b870 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
1b880 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
1b890 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  BUG) || SQLITE_O
1b8a0 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54  S_WINCE.  int eT
1b8b0 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
1b8c0 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  FFFF00;  /* Type
1b8d0 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
1b8e0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e   */.#endif..  in
1b8f0 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
1b900 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1b910 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
1b920 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
1b930 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
1b940 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1b950 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
1b960 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
1b970 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1b980 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 23  _OPEN_CREATE);.#
1b990 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
1b9a0 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20  int isReadonly  
1b9b0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
1b9c0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1b9d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20  );.#endif.  int 
1b9e0 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28  isReadWrite  = (
1b9f0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
1ba00 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a  PEN_READWRITE);.
1ba10 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1ba20 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72    int isOpenJour
1ba30 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20  nal = (isCreate 
1ba40 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79  && (.        eTy
1ba50 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1ba60 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
1ba70 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
1ba80 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1ba90 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
1baa0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1bab0 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65  PEN_WAL.  ));.#e
1bac0 6e 64 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ndif..  /* Check
1bad0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1bae0 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72  tatements are tr
1baf0 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ue: .  **.  **  
1bb00 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
1bb10 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
1bb20 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
1bb30 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
1bb40 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62  , and .  **   (b
1bb50 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73  ) if CREATE is s
1bb60 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49  et, then READWRI
1bb70 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
1bb80 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
1bb90 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45  (c) if EXCLUSIVE
1bba0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
1bbb0 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
1bbc0 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64  e set..  **   (d
1bbd0 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f  ) if DELETEONCLO
1bbe0 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  SE is set, then 
1bbf0 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
1bc00 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
1bc10 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e  assert((isReadon
1bc20 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  ly==0 || isReadW
1bc30 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52  rite==0) && (isR
1bc40 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65  eadWrite || isRe
1bc50 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65  adonly));.  asse
1bc60 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c  rt(isCreate==0 |
1bc70 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a  | isReadWrite);.
1bc80 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75    assert(isExclu
1bc90 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  sive==0 || isCre
1bca0 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ate);.  assert(i
1bcb0 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73  sDelete==0 || is
1bcc0 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54  Create);..  /* T
1bcd0 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e  he main DB, main
1bce0 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69   journal, WAL fi
1bcf0 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f  le and master jo
1bd00 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20  urnal are never 
1bd10 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
1bd20 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72  lly deleted. Nor
1bd30 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74   are they ever t
1bd40 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
1bd50 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21   */.  assert( (!
1bd60 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
1bd70 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
1bd80 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1bd90 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
1bda0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
1bdb0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
1bdc0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
1bdd0 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
1bde0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
1bdf0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
1be00 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
1be10 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  STER_JOURNAL );.
1be20 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
1be30 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
1be40 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
1be50 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f  OPEN_WAL );..  /
1be60 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
1be70 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
1be80 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
1be90 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
1bea0 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
1beb0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1bec0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
1bed0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
1bee0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
1bef0 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
1bf00 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
1bf10 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
1bf20 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1bf30 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
1bf40 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
1bf50 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
1bf60 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
1bf70 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
1bf80 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
1bf90 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
1bfa0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
1bfb0 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65  IENT_DB || eType
1bfc0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
1bfd0 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  L.  );..  assert
1bfe0 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 55 4e 55  ( id!=0 );.  UNU
1bff0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
1c000 66 73 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  fs);..#if SQLITE
1c010 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20  _OS_WINRT.  if( 
1c020 21 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  !sqlite3_temp_di
1c030 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73  rectory ){.    s
1c040 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
1c050 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20 20 20  E_ERROR,.       
1c060 20 22 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64   "sqlite3_temp_d
1c070 69 72 65 63 74 6f 72 79 20 76 61 72 69 61 62 6c  irectory variabl
1c080 65 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20  e should be set 
1c090 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d  for WinRT");.  }
1c0a0 0a 23 65 6e 64 69 66 0a 0a 20 20 70 46 69 6c 65  .#endif..  pFile
1c0b0 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ->h = INVALID_HA
1c0c0 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 20 20 2f  NDLE_VALUE;..  /
1c0d0 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
1c0e0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
1c0f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c   function is NUL
1c100 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20  L, generate a . 
1c110 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69   ** temporary fi
1c120 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a  le name to use .
1c130 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66    */.  if( !zUtf
1c140 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73  8Name ){.    ass
1c150 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20  ert(isDelete && 
1c160 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b  !isOpenJournal);
1c170 0a 20 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d  .    rc = getTem
1c180 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b 32  pname(MAX_PATH+2
1c190 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  , zTmpname);.   
1c1a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c1b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1c1c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1c1d0 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d   zUtf8Name = zTm
1c1e0 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pname;.  }..  /*
1c1f0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
1c200 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a  mes are double-z
1c210 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69  ero terminated i
1c220 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20  f they are not. 
1c230 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61   ** URIs with pa
1c240 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rameters.  Hence
1c250 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79  , they can alway
1c260 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f  s be passed into
1c270 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72  .  ** sqlite3_ur
1c280 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20  i_parameter().. 
1c290 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65   */.  assert( (e
1c2a0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
1c2b0 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66  N_MAIN_DB) || (f
1c2c0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
1c2d0 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20  EN_URI) ||.     
1c2e0 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 74 72     zUtf8Name[str
1c2f0 6c 65 6e 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31  len(zUtf8Name)+1
1c300 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f  ]==0 );..  /* Co
1c310 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61  nvert the filena
1c320 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d  me to the system
1c330 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   encoding. */.  
1c340 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
1c350 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
1c360 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69  (zUtf8Name);.  i
1c370 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
1c380 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1c390 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1c3a0 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69  M;.  }..  if( wi
1c3b0 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65  nIsDir(zConverte
1c3c0 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  d) ){.    sqlite
1c3d0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
1c3e0 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  d);.    return S
1c3f0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
1c400 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  SDIR;.  }..  if(
1c410 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
1c420 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
1c430 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45  ess = GENERIC_RE
1c440 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49  AD | GENERIC_WRI
1c450 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  TE;.  }else{.   
1c460 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
1c470 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b   = GENERIC_READ;
1c480 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54  .  }..  /* SQLIT
1c490 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1c4a0 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65   is used to make
1c4b0 20 73 75 72 65 20 74 68 61 74 20 61 20 6e 65 77   sure that a new
1c4c0 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63   file is .  ** c
1c4d0 72 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64  reated. SQLite d
1c4e0 6f 65 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f  oesn't use it to
1c4f0 20 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75   indicate "exclu
1c500 73 69 76 65 20 61 63 63 65 73 73 22 20 0a 20 20  sive access" .  
1c510 2a 2a 20 61 73 20 69 74 20 69 73 20 75 73 75 61  ** as it is usua
1c520 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a  lly understood..
1c530 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63    */.  if( isExc
1c540 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a  lusive ){.    /*
1c550 20 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 66   Creates a new f
1c560 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20  ile, only if it 
1c570 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
1c580 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f   exist. */.    /
1c590 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 65 78  * If the file ex
1c5a0 69 73 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20  ists, it fails. 
1c5b0 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
1c5c0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43  nDisposition = C
1c5d0 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c  REATE_NEW;.  }el
1c5e0 73 65 20 69 66 28 20 69 73 43 72 65 61 74 65 20  se if( isCreate 
1c5f0 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65  ){.    /* Open e
1c600 78 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72  xisting file, or
1c610 20 63 72 65 61 74 65 20 69 66 20 69 74 20 64 6f   create if it do
1c620 65 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20  esn't exist */. 
1c630 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
1c640 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f  position = OPEN_
1c650 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b  ALWAYS;.  }else{
1c660 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20  .    /* Opens a 
1c670 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74  file, only if it
1c680 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20   exists. */.    
1c690 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
1c6a0 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49  ition = OPEN_EXI
1c6b0 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77  STING;.  }..  dw
1c6c0 53 68 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45  ShareMode = FILE
1c6d0 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49  _SHARE_READ | FI
1c6e0 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a  LE_SHARE_WRITE;.
1c6f0 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20  .  if( isDelete 
1c700 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
1c710 5f 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61  _WINCE.    dwFla
1c720 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
1c730 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  = FILE_ATTRIBUTE
1c740 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54  _HIDDEN;.    isT
1c750 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20  emp = 1;.#else. 
1c760 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
1c770 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41  ributes = FILE_A
1c780 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41  TTRIBUTE_TEMPORA
1c790 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RY.             
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7b0 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55    | FILE_ATTRIBU
1c7c0 54 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20  TE_HIDDEN.      
1c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7e0 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f           | FILE_
1c7f0 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43  FLAG_DELETE_ON_C
1c800 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  LOSE;.#endif.  }
1c810 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67  else{.    dwFlag
1c820 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
1c830 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
1c840 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a  NORMAL;.  }.  /*
1c850 20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68   Reports from th
1c860 65 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74  e internet are t
1c870 68 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  hat performance 
1c880 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62  is always.  ** b
1c890 65 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c  etter if FILE_FL
1c8a0 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
1c8b0 20 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65   is used.  Ticke
1c8c0 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20  t #2699. */.#if 
1c8d0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
1c8e0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
1c8f0 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46  ibutes |= FILE_F
1c900 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
1c910 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  S;.#endif..  if(
1c920 20 69 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53   isNT() ){.#if S
1c930 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
1c940 20 20 20 43 52 45 41 54 45 46 49 4c 45 32 5f 45     CREATEFILE2_E
1c950 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45  XTENDED_PARAMETE
1c960 52 53 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d  RS extendedParam
1c970 65 74 65 72 73 3b 0a 20 20 20 20 65 78 74 65 6e  eters;.    exten
1c980 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
1c990 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43 52  Size = sizeof(CR
1c9a0 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44  EATEFILE2_EXTEND
1c9b0 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 3b 0a  ED_PARAMETERS);.
1c9c0 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
1c9d0 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 41 74 74  meters.dwFileAtt
1c9e0 72 69 62 75 74 65 73 20 3d 0a 20 20 20 20 20 20  ributes =.      
1c9f0 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64        dwFlagsAnd
1ca00 41 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c  Attributes & FIL
1ca10 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b  E_ATTRIBUTE_MASK
1ca20 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
1ca30 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 46  rameters.dwFileF
1ca40 6c 61 67 73 20 3d 20 64 77 46 6c 61 67 73 41 6e  lags = dwFlagsAn
1ca50 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46 49  dAttributes & FI
1ca60 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20  LE_FLAG_MASK;.  
1ca70 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
1ca80 74 65 72 73 2e 64 77 53 65 63 75 72 69 74 79 51  ters.dwSecurityQ
1ca90 6f 73 46 6c 61 67 73 20 3d 20 53 45 43 55 52 49  osFlags = SECURI
1caa0 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20  TY_ANONYMOUS;.  
1cab0 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
1cac0 74 65 72 73 2e 6c 70 53 65 63 75 72 69 74 79 41  ters.lpSecurityA
1cad0 74 74 72 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c  ttributes = NULL
1cae0 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
1caf0 72 61 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c 61  rameters.hTempla
1cb00 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20  teFile = NULL;. 
1cb10 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f     while( (h = o
1cb20 73 43 72 65 61 74 65 46 69 6c 65 32 28 28 4c 50  sCreateFile2((LP
1cb30 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
1cb40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1cb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb60 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
1cb70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1cb90 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20  wShareMode,.    
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbb0 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61            dwCrea
1cbc0 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c  tionDisposition,
1cbd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1cbf0 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
1cc00 72 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  rs))==INVALID_HA
1cc10 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20  NDLE_VALUE &&.  
1cc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 72              retr
1cc40 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
1cc50 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
1cc60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
1cc70 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c 73  op */.    }.#els
1cc80 65 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20  e.    while( (h 
1cc90 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28  = osCreateFileW(
1cca0 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
1ccb0 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ted,.           
1ccc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccd0 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
1cce0 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss,.            
1ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd00 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e    dwShareMode, N
1cd10 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd30 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
1cd40 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20  position,.      
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd60 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41          dwFlagsA
1cd70 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20  ndAttributes,.  
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd90 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
1cda0 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ))==INVALID_HAND
1cdb0 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20  LE_VALUE &&.    
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdd0 20 20 20 20 20 20 20 20 20 20 72 65 74 72 79 49            retryI
1cde0 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
1cdf0 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  Errno) ){.      
1ce00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70           /* Noop
1ce10 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   */.    }.#endif
1ce20 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
1ce30 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
1ce40 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 77 68  I.  else{.    wh
1ce50 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61  ile( (h = osCrea
1ce60 74 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29  teFileA((LPCSTR)
1ce70 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
1ce80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce90 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69            dwDesi
1cea0 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
1ceb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cec0 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65           dwShare
1ced0 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  Mode, NULL,.    
1cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cef0 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61            dwCrea
1cf00 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c  tionDisposition,
1cf10 0a 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 20 20 20 20 64                 d
1cf30 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
1cf40 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tes,.           
1cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf60 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c     NULL))==INVAL
1cf70 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
1cf80 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfa0 20 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74   retryIoerr(&cnt
1cfb0 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
1cfc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cfd0 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
1cfe0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 6c 6f  .  }.#endif.  lo
1cff0 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20  gIoerr(cnt);..  
1d000 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25  OSTRACE(("OPEN %
1d010 64 20 25 73 20 30 78 25 6c 78 20 25 73 5c 6e 22  d %s 0x%lx %s\n"
1d020 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 68 2c  , .           h,
1d030 20 7a 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65   zName, dwDesire
1d040 64 41 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20  dAccess, .      
1d050 20 20 20 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f       h==INVALID_
1d060 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22  HANDLE_VALUE ? "
1d070 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
1d080 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41  ;..  if( h==INVA
1d090 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
1d0a0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
1d0b0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
1d0c0 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
1d0d0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
1d0e0 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61  TOPEN, pFile->la
1d0f0 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65  stErrno, "winOpe
1d100 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  n", zUtf8Name);.
1d110 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1d120 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
1d130 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
1d140 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76  e && !isExclusiv
1d150 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
1d160 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20  n winOpen(pVfs, 
1d170 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20  zName, id, .    
1d180 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73           ((flags
1d190 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  |SQLITE_OPEN_REA
1d1a0 44 4f 4e 4c 59 29 26 7e 28 53 51 4c 49 54 45 5f  DONLY)&~(SQLITE_
1d1b0 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49  OPEN_CREATE|SQLI
1d1c0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1d1d0 45 29 29 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b  E)), pOutFlags);
1d1e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d1f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d200 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
1d210 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1d220 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20  pOutFlags ){.   
1d230 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
1d240 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46   ){.      *pOutF
1d250 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
1d260 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20  EN_READWRITE;.  
1d270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
1d280 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49  pOutFlags = SQLI
1d290 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1d2a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d  ;.    }.  }..  m
1d2b0 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
1d2c0 73 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b  sizeof(*pFile));
1d2d0 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  .  pFile->pMetho
1d2e0 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64  d = &winIoMethod
1d2f0 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68  ;.  pFile->h = h
1d300 3b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  ;.  pFile->lastE
1d310 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
1d320 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d  .  pFile->pVfs =
1d330 20 70 56 66 73 3b 0a 23 69 66 6e 64 65 66 20 53   pVfs;.#ifndef S
1d340 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
1d350 20 70 46 69 6c 65 2d 3e 70 53 68 6d 20 3d 20 30   pFile->pShm = 0
1d360 3b 0a 23 65 6e 64 69 66 0a 20 20 70 46 69 6c 65  ;.#endif.  pFile
1d370 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b  ->zPath = zName;
1d380 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75  .  if( sqlite3_u
1d390 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65  ri_boolean(zName
1d3a0 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45  , "psow", SQLITE
1d3b0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1d3c0 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69  RITE) ){.    pFi
1d3d0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
1d3e0 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20   WINFILE_PSOW;. 
1d3f0 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   }..#if SQLITE_O
1d400 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 69 73  S_WINCE.  if( is
1d410 52 65 61 64 57 72 69 74 65 20 26 26 20 65 54 79  ReadWrite && eTy
1d420 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1d430 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 26  MAIN_DB.       &
1d440 26 20 21 77 69 6e 63 65 43 72 65 61 74 65 4c 6f  & !winceCreateLo
1d450 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29  ck(zName, pFile)
1d460 0a 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73  .  ){.    osClos
1d470 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20  eHandle(h);.    
1d480 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
1d490 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65  nverted);.    re
1d4a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
1d4b0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OPEN_BKPT;.  }. 
1d4c0 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
1d4d0 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74     pFile->zDelet
1d4e0 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76  eOnClose = zConv
1d4f0 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23  erted;.  }else.#
1d500 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
1d510 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
1d520 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 4f  erted);.  }..  O
1d530 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
1d540 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d550 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
1d560 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a   named file..**.
1d570 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e  ** Note that Win
1d580 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c  dows does not al
1d590 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65  low a file to be
1d5a0 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65   deleted if some
1d5b0 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
1d5c0 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20  s has it open.  
1d5d0 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75  Sometimes a viru
1d5e0 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64  s scanner or ind
1d5f0 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a  exing program.**
1d600 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75   will open a jou
1d610 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c  rnal file shortl
1d620 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72  y after it is cr
1d630 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  eated in order t
1d640 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72  o do.** whatever
1d650 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65   it does.  While
1d660 20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63   this other proc
1d670 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
1d680 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c  he.** file open,
1d690 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62   we will be unab
1d6a0 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e  le to delete it.
1d6b0 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64    To work around
1d6c0 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d   this.** problem
1d6d0 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d  , we delay 100 m
1d6e0 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20  illiseconds and 
1d6f0 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67  try to delete ag
1d700 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d  ain.  Up.** to M
1d710 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  X_DELETION_ATTEM
1d720 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74  PTs deletion att
1d730 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65  empts are run be
1d740 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75  fore giving.** u
1d750 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  p and returning 
1d760 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  an error..*/.sta
1d770 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74  tic int winDelet
1d780 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
1d790 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
1d7a0 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
1d7b0 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
1d7c0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1d7d0 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ,      /* Name o
1d7e0 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65  f file to delete
1d7f0 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69   */.  int syncDi
1d800 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
1d810 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
1d820 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69   win32 */.){.  i
1d830 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
1d840 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74  t rc;.  DWORD at
1d850 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  tr;.  DWORD last
1d860 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a  Errno;.  void *z
1d870 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
1d880 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
1d890 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  fs);.  UNUSED_PA
1d8a0 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29  RAMETER(syncDir)
1d8b0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
1d8c0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
1d8d0 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29  TE_IOERR_DELETE)
1d8e0 3b 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  ;.  zConverted =
1d8f0 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65   convertUtf8File
1d900 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
1d910 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
1d920 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  d==0 ){.    retu
1d930 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1d940 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
1d950 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64   isNT() ){.    d
1d960 6f 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  o {.#if SQLITE_O
1d970 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49  S_WINRT.      WI
1d980 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  N32_FILE_ATTRIBU
1d990 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74  TE_DATA sAttrDat
1d9a0 61 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  a;.      memset(
1d9b0 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
1d9c0 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
1d9d0 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73  );.      if ( os
1d9e0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
1d9f0 73 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c  sExW(zConverted,
1da00 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
1da10 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20  andard,.        
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da30 20 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72            &sAttr
1da40 44 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20  Data) ){.       
1da50 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
1da60 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
1da70 65 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  es;.      }else{
1da80 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
1da90 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
1daa0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
1dab0 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
1dac0 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
1dad0 4e 44 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d  ND || lastErrno=
1dae0 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f  =ERROR_PATH_NOT_
1daf0 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
1db00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1db10 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
1db20 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f  T; /* Already go
1db30 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ne? */.        }
1db40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1db50 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1db60 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
1db70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1db80 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
1db90 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
1dba0 41 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e  AttributesW(zCon
1dbb0 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a  verted);.#endif.
1dbc0 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d        if ( attr=
1dbd0 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
1dbe0 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20  TRIBUTES ){.    
1dbf0 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
1dc00 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1dc10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61  ;.        if( la
1dc20 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46  stErrno==ERROR_F
1dc30 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 7c 7c  ILE_NOT_FOUND ||
1dc40 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
1dc50 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
1dc60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1dc70 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
1dc80 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a  DELETE_NOENT; /*
1dc90 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a   Already gone? *
1dca0 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
1dcb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1dcc0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1dcd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1dce0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1dcf0 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46       if ( attr&F
1dd00 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49  ILE_ATTRIBUTE_DI
1dd10 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20  RECTORY ){.     
1dd20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
1dd30 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f  RROR; /* Files o
1dd40 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nly. */.        
1dd50 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1dd60 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65       if ( osDele
1dd70 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74  teFileW(zConvert
1dd80 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ed) ){.        r
1dd90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f  c = SQLITE_OK; /
1dda0 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f  * Deleted OK. */
1ddb0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1ddc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1ddd0 20 28 20 21 72 65 74 72 79 49 6f 65 72 72 28 26   ( !retryIoerr(&
1dde0 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
1ddf0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1de00 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
1de10 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65  * No more retrie
1de20 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  s. */.        br
1de30 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1de40 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d   } while(1);.  }
1de50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
1de60 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
1de70 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  else{.    do {. 
1de80 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65       attr = osGe
1de90 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
1dea0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
1deb0 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49      if ( attr==I
1dec0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
1ded0 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20  IBUTES ){.      
1dee0 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
1def0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1df00 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
1df10 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
1df20 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 7c 7c 20 6c  E_NOT_FOUND || l
1df30 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
1df40 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
1df50 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1df60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
1df70 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
1df80 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
1df90 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1dfa0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1dfb0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1dfc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
1dfd0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1dfe0 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c     if ( attr&FIL
1dff0 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
1e000 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  CTORY ){.       
1e010 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1e020 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c  OR; /* Files onl
1e030 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  y. */.        br
1e040 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1e050 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65     if ( osDelete
1e060 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64  FileA(zConverted
1e070 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1e080 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20  = SQLITE_OK; /* 
1e090 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20  Deleted OK. */. 
1e0a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e0b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
1e0c0 20 21 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e   !retryIoerr(&cn
1e0d0 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
1e0e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1e0f0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
1e100 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e  No more retries.
1e110 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
1e120 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1e130 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23   while(1);.  }.#
1e140 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20 26  endif.  if( rc &
1e150 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
1e160 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20  RR_DELETE_NOENT 
1e170 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  ){.    rc = winL
1e180 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1e190 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73  OERR_DELETE, las
1e1a0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
1e1b0 20 20 20 20 20 22 77 69 6e 44 65 6c 65 74 65 22       "winDelete"
1e1c0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
1e1d0 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f  }else{.    logIo
1e1e0 65 72 72 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20  err(cnt);.  }.  
1e1f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
1e200 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52  nverted);.  OSTR
1e210 41 43 45 28 28 22 44 45 4c 45 54 45 20 5c 22 25  ACE(("DELETE \"%
1e220 73 5c 22 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65  s\" %s\n", zFile
1e230 6e 61 6d 65 2c 20 28 72 63 20 3f 20 22 66 61 69  name, (rc ? "fai
1e240 6c 65 64 22 20 3a 20 22 6f 6b 22 20 29 29 29 3b  led" : "ok" )));
1e250 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e260 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65  ./*.** Check the
1e270 20 65 78 69 73 74 61 6e 63 65 20 61 6e 64 20 73   existance and s
1e280 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e  tatus of a file.
1e290 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1e2a0 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  inAccess(.  sqli
1e2b0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
1e2c0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
1e2d0 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20  ed on win32 */. 
1e2e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
1e2f0 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e  lename,     /* N
1e300 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63  ame of file to c
1e310 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  heck */.  int fl
1e320 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
1e330 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
1e340 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20  test to make on 
1e350 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
1e360 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
1e370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
1e380 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20  : Result */.){. 
1e390 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69   DWORD attr;.  i
1e3a0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f  nt rc = 0;.  DWO
1e3b0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
1e3c0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
1e3d0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1e3e0 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53  ETER(pVfs);..  S
1e3f0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1e400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1e410 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20  ERR_ACCESS; );. 
1e420 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f   zConverted = co
1e430 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
1e440 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
1e450 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
1e460 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1e470 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1e480 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  EM;.  }.  if( is
1e490 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  NT() ){.    int 
1e4a0 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e  cnt = 0;.    WIN
1e4b0 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  32_FILE_ATTRIBUT
1e4c0 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61  E_DATA sAttrData
1e4d0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41  ;.    memset(&sA
1e4e0 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65  ttrData, 0, size
1e4f0 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a  of(sAttrData));.
1e500 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20      while( !(rc 
1e510 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
1e520 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54  butesExW((LPCWST
1e530 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
1e540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e550 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69             GetFi
1e560 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64  leExInfoStandard
1e570 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e590 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20  &sAttrData)) && 
1e5a0 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
1e5b0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
1e5c0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1e5d0 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53       /* For an S
1e5e0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1e5f0 53 54 53 20 71 75 65 72 79 2c 20 74 72 65 61 74  STS query, treat
1e600 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66   a zero-length f
1e610 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ile.      ** as 
1e620 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  if it does not e
1e630 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  xist..      */. 
1e640 20 20 20 20 20 69 66 28 20 20 20 20 66 6c 61 67       if(    flag
1e650 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53  s==SQLITE_ACCESS
1e660 5f 45 58 49 53 54 53 0a 20 20 20 20 20 20 20 20  _EXISTS.        
1e670 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e    && sAttrData.n
1e680 46 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 20  FileSizeHigh==0 
1e690 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41  .          && sA
1e6a0 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a  ttrData.nFileSiz
1e6b0 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  eLow==0 ){.     
1e6c0 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49     attr = INVALI
1e6d0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
1e6e0 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  S;.      }else{.
1e6f0 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73          attr = s
1e700 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41  AttrData.dwFileA
1e710 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20  ttributes;.     
1e720 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
1e730 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74      logIoerr(cnt
1e740 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73  );.      if( las
1e750 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49  tErrno!=ERROR_FI
1e760 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20  LE_NOT_FOUND && 
1e770 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52  lastErrno!=ERROR
1e780 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
1e790 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 4c 6f  ){.        winLo
1e7a0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1e7b0 45 52 52 5f 41 43 43 45 53 53 2c 20 6c 61 73 74  ERR_ACCESS, last
1e7c0 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73  Errno, "winAcces
1e7d0 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  s", zFilename);.
1e7e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1e7f0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
1e800 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1e810 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
1e820 43 45 53 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73  CESS;.      }els
1e830 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  e{.        attr 
1e840 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  = INVALID_FILE_A
1e850 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
1e860 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66   }.    }.  }.#if
1e870 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
1e880 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
1e890 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47  {.    attr = osG
1e8a0 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
1e8b0 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
1e8c0 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ted);.  }.#endif
1e8d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1e8e0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73  zConverted);.  s
1e8f0 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a  witch( flags ){.
1e900 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e910 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20  ACCESS_READ:.   
1e920 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
1e930 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20  ESS_EXISTS:.    
1e940 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56    rc = attr!=INV
1e950 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
1e960 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61  UTES;.      brea
1e970 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1e980 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
1e990 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20  ITE:.      rc = 
1e9a0 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
1e9b0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26  LE_ATTRIBUTES &&
1e9c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61  .             (a
1e9d0 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49  ttr & FILE_ATTRI
1e9e0 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d  BUTE_READONLY)==
1e9f0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
1ea00 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
1ea10 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61     assert(!"Inva
1ea20 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65  lid flags argume
1ea30 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  nt");.  }.  *pRe
1ea40 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74  sOut = rc;.  ret
1ea50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1ea60 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  .../*.** Returns
1ea70 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
1ea80 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20   specified path 
1ea90 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75  name should be u
1eaa0 73 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49  sed verbatim.  I
1eab0 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  f.** non-zero is
1eac0 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74   returned from t
1ead0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
1eae0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1eaf0 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a  on must simply.*
1eb00 2a 20 75 73 65 20 74 68 65 20 70 72 6f 76 69 64  * use the provid
1eb10 65 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72  ed path name ver
1eb20 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c  batim -OR- resol
1eb30 76 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c  ve it into a ful
1eb40 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75  l path name.** u
1eb50 73 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c  sing the GetFull
1eb60 50 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41  PathName Win32 A
1eb70 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20  PI function (if 
1eb80 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73  available)..*/.s
1eb90 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73  tatic BOOL winIs
1eba0 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
1ebb0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
1ebc0 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f  zPathname.){.  /
1ebd0 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61  *.  ** If the pa
1ebe0 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
1ebf0 69 74 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c  ith a forward sl
1ec00 61 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61  ash or a backsla
1ec10 73 68 2c 20 69 74 20 69 73 20 65 69 74 68 65 72  sh, it is either
1ec20 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e  .  ** a legal UN
1ec30 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65  C name, a volume
1ec40 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20   relative path, 
1ec50 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70  or an absolute p
1ec60 61 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a  ath name in the.
1ec70 20 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d    ** "Unix" form
1ec80 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20  at on Windows.  
1ec90 54 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79  There is no easy
1eca0 20 77 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e   way to differen
1ecb0 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20  tiate between.  
1ecc0 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f  ** the final two
1ecd0 20 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72   cases; therefor
1ece0 65 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68 65  e, we return the
1ecf0 20 73 61 66 65 72 20 72 65 74 75 72 6e 20 76 61   safer return va
1ed00 6c 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a  lue of TRUE.  **
1ed10 20 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73   so that callers
1ed20 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
1ed30 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73  n will simply us
1ed40 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20  e it verbatim.. 
1ed50 20 2a 2f 0a 20 20 69 66 20 28 20 7a 50 61 74 68   */.  if ( zPath
1ed60 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 7c 7c 20  name[0]=='/' || 
1ed70 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 3d 3d 27 5c  zPathname[0]=='\
1ed80 5c 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  \' ){.    return
1ed90 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   TRUE;.  }..  /*
1eda0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74  .  ** If the pat
1edb0 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69  h name starts wi
1edc0 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64 20  th a letter and 
1edd0 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69  a colon it is ei
1ede0 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20  ther a volume.  
1edf0 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  ** relative path
1ee00 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   or an absolute 
1ee10 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f  path.  Callers o
1ee20 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
1ee30 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74  must not.  ** at
1ee40 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20 69  tempt to treat i
1ee50 74 20 61 73 20 61 20 72 65 6c 61 74 69 76 65 20  t as a relative 
1ee60 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20  path name (i.e. 
1ee70 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d 70  they should simp
1ee80 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20 76  ly use.  ** it v
1ee90 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20  erbatim)..  */. 
1eea0 20 69 66 20 28 20 73 71 6c 69 74 65 33 49 73 61   if ( sqlite3Isa
1eeb0 6c 70 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30  lpha(zPathname[0
1eec0 5d 29 20 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b  ]) && zPathname[
1eed0 31 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 72  1]==':' ){.    r
1eee0 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a  eturn TRUE;.  }.
1eef0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  /*.  ** If we
1ef00 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
1ef10 6e 74 2c 20 74 68 65 20 70 61 74 68 20 6e 61 6d  nt, the path nam
1ef20 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20  e should almost 
1ef30 63 65 72 74 61 69 6e 6c 79 20 62 65 20 61 20 70  certainly be a p
1ef40 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74  urely.  ** relat
1ef50 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f  ive one (i.e. no
1ef60 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f  t a UNC name, no
1ef70 74 20 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20  t absolute, and 
1ef80 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74  not volume relat
1ef90 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  ive)..  */.  ret
1efa0 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a  urn FALSE;.}../*
1efb0 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
1efc0 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
1efd0 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
1efe0 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 66 75  e.  Write the fu
1eff0 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69  ll.** pathname i
1f000 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75  nto zOut[].  zOu
1f010 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c  t[] will be at l
1f020 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74  east pVfs->mxPat
1f030 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69  hname.** bytes i
1f040 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
1f050 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74  c int winFullPat
1f060 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33  hname(.  sqlite3
1f070 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
1f080 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1f090 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
1f0a0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1f0b0 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20  *zRelative,     
1f0c0 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72     /* Possibly r
1f0d0 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61  elative input pa
1f0e0 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c  th */.  int nFul
1f0f0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
1f100 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1f110 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
1f120 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
1f130 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20  r *zFull        
1f140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
1f150 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29  tput buffer */.)
1f160 7b 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64  {.  .#if defined
1f170 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53  (__CYGWIN__).  S
1f180 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1f190 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1f1a0 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ROR );.  UNUSED_
1f1b0 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29  PARAMETER(nFull)
1f1c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
1f1d0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3e 3d 4d 41  ->mxPathname>=MA
1f1e0 58 5f 50 41 54 48 20 29 3b 0a 20 20 61 73 73 65  X_PATH );.  asse
1f1f0 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d  rt( nFull>=pVfs-
1f200 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20  >mxPathname );. 
1f210 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
1f220 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
1f230 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
1f240 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
1f250 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
1f260 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
1f270 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
1f280 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
1f290 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
1f2a0 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
1f2b0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
1f2c0 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
1f2d0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
1f2e0 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
1f2f0 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
1f300 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
1f310 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
1f320 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
1f330 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
1f340 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
1f350 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73 6c  rectory and a sl
1f360 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
1f370 63 68 61 72 20 7a 4f 75 74 5b 4d 41 58 5f 50 41  char zOut[MAX_PA
1f380 54 48 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 73 65  TH+1];.    memse
1f390 74 28 7a 4f 75 74 2c 20 30 2c 20 4d 41 58 5f 50  t(zOut, 0, MAX_P
1f3a0 41 54 48 2b 31 29 3b 0a 20 20 20 20 63 79 67 77  ATH+1);.    cygw
1f3b0 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 77 69 6e 33 32  in_conv_to_win32
1f3c0 5f 70 61 74 68 28 7a 52 65 6c 61 74 69 76 65 2c  _path(zRelative,
1f3d0 20 7a 4f 75 74 29 3b 20 2f 2a 20 50 4f 53 49 58   zOut); /* POSIX
1f3e0 20 74 6f 20 57 69 6e 33 32 20 2a 2f 0a 20 20 20   to Win32 */.   
1f3f0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1f400 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
1f410 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
1f420 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c  zFull, "%s\\%s",
1f430 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f440 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
1f450 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 7a 4f  ta_directory, zO
1f460 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ut);.  }else{.  
1f470 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
1f480 3a 20 54 68 65 20 43 79 67 77 69 6e 20 64 6f 63  : The Cygwin doc
1f490 73 20 73 74 61 74 65 20 74 68 61 74 20 74 68 65  s state that the
1f4a0 20 6d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20   maximum length 
1f4b0 6e 65 65 64 65 64 0a 20 20 20 20 2a 2a 20 20 20  needed.    **   
1f4c0 20 20 20 20 66 6f 72 20 74 68 65 20 62 75 66 66      for the buff
1f4d0 65 72 20 70 61 73 73 65 64 20 74 6f 20 63 79 67  er passed to cyg
1f4e0 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c  win_conv_to_full
1f4f0 5f 77 69 6e 33 32 5f 70 61 74 68 0a 20 20 20 20  _win32_path.    
1f500 2a 2a 20 20 20 20 20 20 20 69 73 20 4d 41 58 5f  **       is MAX_
1f510 50 41 54 48 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  PATH..    */.   
1f520 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f   cygwin_conv_to_
1f530 66 75 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 68 28  full_win32_path(
1f540 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c  zRelative, zFull
1f550 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1f560 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
1f570 66 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f  f..#if (SQLITE_O
1f580 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
1f590 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21  E_OS_WINRT) && !
1f5a0 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
1f5b0 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  __).  SimulateIO
1f5c0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
1f5d0 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
1f5e0 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20  /* WinCE has no 
1f5f0 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c  concept of a rel
1f600 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20  ative pathname, 
1f610 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e  or so I am told.
1f620 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68   */.  /* WinRT h
1f630 61 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e  as no way to con
1f640 76 65 72 74 20 61 20 72 65 6c 61 74 69 76 65 20  vert a relative 
1f650 70 61 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c  path to an absol
1f660 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66  ute one. */.  if
1f670 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
1f680 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
1f690 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
1f6a0 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
1f6b0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
1f6c0 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
1f6d0 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
1f6e0 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
1f6f0 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
1f700 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
1f710 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
1f720 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
1f730 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
1f740 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
1f750 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
1f760 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
1f770 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
1f780 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
1f790 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
1f7a0 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
1f7b0 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73  tory and a backs
1f7c0 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
1f7d0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1f7e0 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
1f7f0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
1f800 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c  zFull, "%s\\%s",
1f810 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f820 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
1f830 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 7a 52  ta_directory, zR
1f840 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73  elative);.  }els
1f850 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  e{.    sqlite3_s
1f860 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
1f870 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
1f880 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
1f890 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
1f8a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1f8b0 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23  TE_OK;.#endif..#
1f8c0 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
1f8d0 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
1f8e0 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
1f8f0 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
1f900 20 20 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20    DWORD nByte;. 
1f910 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
1f920 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b  d;.  char *zOut;
1f930 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
1f940 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20  ath name begins 
1f950 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72  with "/X:", wher
1f960 65 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70  e "X" is any alp
1f970 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61  habetic.  ** cha
1f980 72 61 63 74 65 72 2c 20 64 69 73 63 61 72 64 20  racter, discard 
1f990 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20  the initial "/" 
1f9a0 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d  from the pathnam
1f9b0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52  e..  */.  if( zR
1f9c0 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20  elative[0]=='/' 
1f9d0 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68  && sqlite3Isalph
1f9e0 61 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d 29 20  a(zRelative[1]) 
1f9f0 26 26 20 7a 52 65 6c 61 74 69 76 65 5b 32 5d 3d  && zRelative[2]=
1fa00 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a 52 65 6c  =':' ){.    zRel
1fa10 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  ative++;.  }..  
1fa20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
1fa30 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
1fa40 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
1fa50 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
1fa60 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
1fa70 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
1fa80 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
1fa90 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
1faa0 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
1fab0 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
1fac0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
1fad0 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
1fae0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
1faf0 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
1fb00 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
1fb10 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
1fb20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
1fb30 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1fb40 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
1fb50 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
1fb60 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
1fb70 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
1fb80 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
1fb90 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
1fba0 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
1fbb0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
1fbc0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
1fbd0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
1fbe0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
1fbf0 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
1fc00 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
1fc10 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
1fc20 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
1fc30 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
1fc40 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
1fc50 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
1fc60 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
1fc70 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
1fc80 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
1fc90 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62  irectory and a b
1fca0 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f  ackslash..    */
1fcb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1fcc0 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
1fcd0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
1fce0 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c  e), zFull, "%s\\
1fcf0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
1fd00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1fd10 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
1fd20 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
1fd30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fd40 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65  OK;.  }.  zConve
1fd50 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
1fd60 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61  f8Filename(zRela
1fd70 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  tive);.  if( zCo
1fd80 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
1fd90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fda0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
1fdb0 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
1fdc0 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d  .    LPWSTR zTem
1fdd0 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f  p;.    nByte = o
1fde0 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
1fdf0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
1fe00 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b  erted, 0, 0, 0);
1fe10 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
1fe20 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  0 ){.      winLo
1fe30 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
1fe40 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ROR, osGetLastEr
1fe50 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
1fe60 20 20 20 20 20 20 20 20 20 22 47 65 74 46 75 6c           "GetFul
1fe70 6c 50 61 74 68 4e 61 6d 65 57 31 22 2c 20 7a 43  lPathNameW1", zC
1fe80 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
1fe90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
1fea0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
1feb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1fec0 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
1fed0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
1fee0 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d  e += 3;.    zTem
1fef0 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
1ff00 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a  cZero( nByte*siz
1ff10 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b  eof(zTemp[0]) );
1ff20 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d  .    if( zTemp==
1ff30 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1ff40 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
1ff50 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
1ff60 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1ff70 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
1ff80 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
1ff90 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57  lPathNameW((LPCW
1ffa0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
1ffb0 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
1ffc0 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
1ffd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c  =0 ){.      winL
1ffe0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45  ogError(SQLITE_E
1fff0 52 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45  RROR, osGetLastE
20000 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
20010 20 20 20 20 20 20 20 20 20 20 22 47 65 74 46 75            "GetFu
20020 6c 6c 50 61 74 68 4e 61 6d 65 57 32 22 2c 20 7a  llPathNameW2", z
20030 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
20040 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
20050 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
20060 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
20070 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74  Temp);.      ret
20080 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
20090 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20  PEN_FULLPATH;.  
200a0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
200b0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
200c0 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69  ;.    zOut = uni
200d0 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
200e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
200f0 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a  ree(zTemp);.  }.
20100 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
20110 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
20120 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
20130 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
20140 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
20150 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
20160 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
20170 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
20180 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c  =0 ){.      winL
20190 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45  ogError(SQLITE_E
201a0 52 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45  RROR, osGetLastE
201b0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
201c0 20 20 20 20 20 20 20 20 20 20 22 47 65 74 46 75            "GetFu
201d0 6c 6c 50 61 74 68 4e 61 6d 65 41 31 22 2c 20 7a  llPathNameA1", z
201e0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
201f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
20200 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
20210 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20220 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
20230 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  H;.    }.    nBy
20240 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65  te += 3;.    zTe
20250 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  mp = sqlite3Mall
20260 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69  ocZero( nByte*si
20270 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29  zeof(zTemp[0]) )
20280 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d  ;.    if( zTemp=
20290 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
202a0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
202b0 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
202c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
202d0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
202e0 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
202f0 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
20300 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  r*)zConverted, n
20310 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
20320 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
20330 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  0 ){.      winLo
20340 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
20350 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ROR, osGetLastEr
20360 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
20370 20 20 20 20 20 20 20 20 20 22 47 65 74 46 75 6c           "GetFul
20380 6c 50 61 74 68 4e 61 6d 65 41 32 22 2c 20 7a 43  lPathNameA2", zC
20390 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
203a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
203b0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
203c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
203d0 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  emp);.      retu
203e0 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
203f0 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20  EN_FULLPATH;.   
20400 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
20410 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
20420 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69  .    zOut = sqli
20430 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
20440 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20  o_utf8(zTemp);. 
20450 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20460 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64  zTemp);.  }.#end
20470 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b  if.  if( zOut ){
20480 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
20490 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
204a0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
204b0 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c  e), zFull, "%s",
204c0 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69   zOut);.    sqli
204d0 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
204e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
204f0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
20500 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20510 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
20520 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e  }.#endif.}..#ifn
20530 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20540 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
20550 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
20560 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
20570 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
20580 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
20590 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
205a0 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
205b0 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
205c0 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
205d0 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  .*/./*.** Interf
205e0 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
205f0 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
20600 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
20610 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
20620 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
20630 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
20640 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
20650 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rary..*/.static 
20660 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28  void *winDlOpen(
20670 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
20680 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
20690 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e  Filename){.  HAN
206a0 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a  DLE h;.  void *z
206b0 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
206c0 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
206d0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e  zFilename);.  UN
206e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
206f0 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  Vfs);.  if( zCon
20700 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
20710 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
20720 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23   if( isNT() ){.#
20730 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
20740 52 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61  RT.    h = osLoa
20750 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
20760 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
20770 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a  rted, 0);.#else.
20780 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69      h = osLoadLi
20790 62 72 61 72 79 57 28 28 4c 50 43 57 53 54 52 29  braryW((LPCWSTR)
207a0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
207b0 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  dif.  }.#ifdef S
207c0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
207d0 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
207e0 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61   h = osLoadLibra
207f0 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  ryA((char*)zConv
20800 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  erted);.  }.#end
20810 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  if.  sqlite3_fre
20820 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
20830 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68   return (void*)h
20840 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
20850 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  winDlError(sqlit
20860 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
20870 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
20880 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44  ufOut){.  UNUSED
20890 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
208a0 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72  ;.  getLastError
208b0 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72  Msg(osGetLastErr
208c0 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66  or(), nBuf, zBuf
208d0 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Out);.}.static v
208e0 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73  oid (*winDlSym(s
208f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
20900 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c  , void *pHandle,
20910 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79   const char *zSy
20920 6d 62 6f 6c 29 29 28 76 6f 69 64 29 7b 0a 20 20  mbol))(void){.  
20930 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
20940 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
20950 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29   (void(*)(void))
20960 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  osGetProcAddress
20970 41 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c  A((HANDLE)pHandl
20980 65 2c 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 73  e, zSymbol);.}.s
20990 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c  tatic void winDl
209a0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
209b0 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70  s *pVfs, void *p
209c0 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45  Handle){.  UNUSE
209d0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
209e0 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61  );.  osFreeLibra
209f0 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64  ry((HANDLE)pHand
20a00 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  le);.}.#else /* 
20a10 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  if SQLITE_OMIT_L
20a20 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73  OAD_EXTENSION is
20a30 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23   defined: */.  #
20a40 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e  define winDlOpen
20a50 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
20a60 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  nDlError 0.  #de
20a70 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20  fine winDlSym   
20a80 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
20a90 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
20aa0 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70  ../*.** Write up
20ab0 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f   to nBuf bytes o
20ac0 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74  f randomness int
20ad0 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  o zBuf..*/.stati
20ae0 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e  c int winRandomn
20af0 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
20b00 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
20b10 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
20b20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55  int n = 0;.  UNU
20b30 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
20b40 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  fs);.#if defined
20b50 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
20b60 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73  n = nBuf;.  mems
20b70 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66  et(zBuf, 0, nBuf
20b80 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73  );.#else.  if( s
20b90 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45  izeof(SYSTEMTIME
20ba0 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
20bb0 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20   SYSTEMTIME x;. 
20bc0 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69     osGetSystemTi
20bd0 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63  me(&x);.    memc
20be0 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c  py(&zBuf[n], &x,
20bf0 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
20c00 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b   n += sizeof(x);
20c10 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f  .  }.  if( sizeo
20c20 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e  f(DWORD)<=nBuf-n
20c30 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69   ){.    DWORD pi
20c40 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74  d = osGetCurrent
20c50 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20  ProcessId();.   
20c60 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
20c70 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
20c80 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  id));.    n += s
20c90 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a  izeof(pid);.  }.
20ca0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
20cb0 4e 52 54 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  NRT.  if( sizeof
20cc0 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75  (ULONGLONG)<=nBu
20cd0 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47  f-n ){.    ULONG
20ce0 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65 74  LONG cnt = osGet
20cf0 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20  TickCount64();. 
20d00 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
20d10 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66  n], &cnt, sizeof
20d20 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  (cnt));.    n +=
20d30 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20   sizeof(cnt);.  
20d40 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69  }.#else.  if( si
20d50 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75  zeof(DWORD)<=nBu
20d60 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  f-n ){.    DWORD
20d70 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b   cnt = osGetTick
20d80 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d  Count();.    mem
20d90 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63  cpy(&zBuf[n], &c
20da0 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29  nt, sizeof(cnt))
20db0 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
20dc0 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  f(cnt);.  }.#end
20dd0 69 66 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  if.  if( sizeof(
20de0 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d  LARGE_INTEGER)<=
20df0 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41  nBuf-n ){.    LA
20e00 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20  RGE_INTEGER i;. 
20e10 20 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72     osQueryPerfor
20e20 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29  manceCounter(&i)
20e30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
20e40 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f  uf[n], &i, sizeo
20e50 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  f(i));.    n += 
20e60 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23  sizeof(i);.  }.#
20e70 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e  endif.  return n
20e80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ;.}.../*.** Slee
20e90 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
20ea0 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
20eb0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
20ec0 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   slept..*/.stati
20ed0 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73  c int winSleep(s
20ee0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
20ef0 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b  , int microsec){
20f00 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  .  sqlite3_win32
20f10 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63  _sleep((microsec
20f20 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55  +999)/1000);.  U
20f30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
20f40 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
20f50 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f  ((microsec+999)/
20f60 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f  1000)*1000;.}../
20f70 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
20f80 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
20f90 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
20fa0 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
20fb0 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
20fc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
20fd0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
20fe0 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
20ff0 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
21000 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
21010 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
21020 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
21030 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
21040 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
21050 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
21060 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
21070 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
21080 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
21090 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
210a0 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
210b0 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
210c0 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
210d0 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
210e0 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
210f0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
21100 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
21110 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
21120 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
21130 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
21140 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
21150 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
21160 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
21170 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
21180 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
21190 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
211a0 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
211b0 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
211c0 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
211d0 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
211e0 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
211f0 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
21200 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
21210 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
21220 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
21230 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ate .** cannot b
21240 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
21250 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  ic int winCurren
21260 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
21270 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71  e3_vfs *pVfs, sq
21280 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e  lite3_int64 *piN
21290 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49  ow){.  /* FILETI
212a0 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ME structure is 
212b0 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72  a 64-bit value r
212c0 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
212d0 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20  number of .     
212e0 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69  100-nanosecond i
212f0 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a  ntervals since J
21300 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28  anuary 1, 1601 (
21310 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e  = JD 2305813.5).
21320 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d   .  */.  FILETIM
21330 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63  E ft;.  static c
21340 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
21350 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70  64 winFiletimeEp
21360 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28  och = 23058135*(
21370 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
21380 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51  40000;.#ifdef SQ
21390 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74  LITE_TEST.  stat
213a0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
213b0 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68  _int64 unixEpoch
213c0 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c   = 24405875*(sql
213d0 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
213e0 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20  00;.#endif.  /* 
213f0 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20  2^32 - to avoid 
21400 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61  use of LL and wa
21410 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f  rnings in gcc */
21420 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
21430 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61  sqlite3_int64 ma
21440 78 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a 20  x32BitValue = . 
21450 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e       (sqlite3_in
21460 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b  t64)2000000000 +
21470 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
21480 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71  2000000000 + (sq
21490 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39  lite3_int64)2949
214a0 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49  67296;..#if SQLI
214b0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59  TE_OS_WINCE.  SY
214c0 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20  STEMTIME time;. 
214d0 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
214e0 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66  (&time);.  /* if
214f0 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c   SystemTimeToFil
21500 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69  eTime() fails, i
21510 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20  t returns zero. 
21520 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74  */.  if (!osSyst
21530 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
21540 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20  (&time,&ft)){.  
21550 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21560 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65  ERROR;.  }.#else
21570 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69  .  osGetSystemTi
21580 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66  meAsFileTime( &f
21590 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a  t );.#endif..  *
215a0 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74  piNow = winFilet
215b0 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20  imeEpoch +.     
215c0 20 20 20 20 20 20 20 28 28 28 28 73 71 6c 69 74         ((((sqlit
215d0 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69  e3_int64)ft.dwHi
215e0 67 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33  ghDateTime)*max3
215f0 32 42 69 74 56 61 6c 75 65 29 20 2b 20 0a 20 20  2BitValue) + .  
21600 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
21610 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64  lite3_int64)ft.d
21620 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73  wLowDateTime)/(s
21630 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30  qlite3_int64)100
21640 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  00;..#ifdef SQLI
21650 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71  TE_TEST.  if( sq
21660 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
21670 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77  me ){.    *piNow
21680 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   = 1000*(sqlite3
21690 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63  _int64)sqlite3_c
216a0 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e  urrent_time + un
216b0 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e  ixEpoch;.  }.#en
216c0 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  dif.  UNUSED_PAR
216d0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
216e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
216f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
21700 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
21710 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
21720 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
21730 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
21740 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
21750 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
21760 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74  n Day number int
21770 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20  o *prNow and.** 
21780 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72  return 0.  Retur
21790 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20  n 1 if the time 
217a0 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20  and date cannot 
217b0 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
217c0 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65  tic int winCurre
217d0 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
217e0 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65  fs *pVfs, double
217f0 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20   *prNow){.  int 
21800 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  rc;.  sqlite3_in
21810 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69  t64 i;.  rc = wi
21820 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
21830 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69  4(pVfs, &i);.  i
21840 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70  f( !rc ){.    *p
21850 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30  rNow = i/8640000
21860 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  0.0;.  }.  retur
21870 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
21880 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
21890 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  this function wo
218a0 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69  rks like a combi
218b0 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74  nation of.** Get
218c0 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20  LastError() and 
218d0 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20  FormatMessage() 
218e0 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20 65  on Windows (or e
218f0 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65  rrno and.** stre
21900 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78  rror_r() on Unix
21910 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f  ). After an erro
21920 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  r is returned by
21930 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69   an OS.** functi
21940 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  on, SQLite calls
21950 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
21960 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e  ith zBuf pointin
21970 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72  g to.** a buffer
21980 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20   of nBuf bytes. 
21990 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f  The OS layer sho
219a0 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65  uld populate the
219b0 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68 20  .** buffer with 
219c0 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
219d0 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65   UTF-8 encoded e
219e0 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
219f0 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c  describing the l
21a00 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20  ast IO error to 
21a10 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 77 69  have occurred wi
21a20 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67  thin the calling
21a30 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a  .** thread..**.*
21a40 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d  * If the error m
21a50 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61  essage is too la
21a60 72 67 65 20 66 6f 72 20 74 68 65 20 73 75 70 70  rge for the supp
21a70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20  lied buffer,.** 
21a80 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  it should be tru
21a90 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65 74 75  ncated. The retu
21aa0 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74  rn value of xGet
21ab0 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20  LastError.** is 
21ac0 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
21ad0 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69  r message fits i
21ae0 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72  n the buffer, or
21af0 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68   non-zero.** oth
21b00 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d  erwise (if the m
21b10 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63  essage was trunc
21b20 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65  ated). If non-ze
21b30 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a  ro is returned,.
21b40 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  ** then it is no
21b50 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69  t necessary to i
21b60 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74  nclude the nul-t
21b70 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63  erminator charac
21b80 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75  ter.** in the ou
21b90 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  tput buffer..**.
21ba0 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67  ** Not supplying
21bb0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
21bc0 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61  e will have no a
21bd0 64 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a  dverse effect.**
21be0 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69   on SQLite. It i
21bf0 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61  s fine to have a
21c00 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
21c10 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72   that never.** r
21c20 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
21c30 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  message:.**.**  
21c40 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72   int xGetLastErr
21c50 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
21c60 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
21c70 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20  char *zBuf){.** 
21c80 20 20 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b      assert(zBuf[
21c90 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20  0]=='\0');.**   
21ca0 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20    return 0;.**  
21cb0 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72   }.**.** However
21cc0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73   if an error mes
21cd0 73 61 67 65 20 69 73 20 73 75 70 70 6c 69 65 64  sage is supplied
21ce0 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63  , it will be inc
21cf0 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20  orporated.** by 
21d00 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20  sqlite into the 
21d10 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76  error message av
21d20 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
21d30 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ser using.** sql
21d40 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70  ite3_errmsg(), p
21d50 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49  ossibly making I
21d60 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65 72 20  O errors easier 
21d70 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61  to debug..*/.sta
21d80 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61  tic int winGetLa
21d90 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
21da0 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
21db0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
21dc0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
21dd0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
21de0 74 75 72 6e 20 67 65 74 4c 61 73 74 45 72 72 6f  turn getLastErro
21df0 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72  rMsg(osGetLastEr
21e00 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75  ror(), nBuf, zBu
21e10 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  f);.}../*.** Ini
21e20 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e  tialize and dein
21e30 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65  itialize the ope
21e40 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e  rating system in
21e50 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  terface..*/.int 
21e60 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
21e70 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
21e80 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56  sqlite3_vfs winV
21e90 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20  fs = {.    3,   
21ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21eb0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
21ec0 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c     sizeof(winFil
21ed0 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46  e),     /* szOsF
21ee0 69 6c 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f 50  ile */.    MAX_P
21ef0 41 54 48 2c 20 20 20 20 20 20 20 20 20 20 20 20  ATH,            
21f00 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
21f10 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
21f20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
21f30 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32  xt */.    "win32
21f40 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ",             /
21f50 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  * zName */.    0
21f60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21f70 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20      /* pAppData 
21f80 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20  */.    winOpen, 
21f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21fa0 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
21fb0 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
21fc0 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20   /* xDelete */. 
21fd0 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20     winAccess,   
21fe0 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
21ff0 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c  ss */.    winFul
22000 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f  lPathname,     /
22010 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  * xFullPathname 
22020 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e  */.    winDlOpen
22030 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
22040 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69  DlOpen */.    wi
22050 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20  nDlError,       
22060 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
22070 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20  /.    winDlSym, 
22080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
22090 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44  lSym */.    winD
220a0 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  lClose,         
220b0 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a   /* xDlClose */.
220c0 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73      winRandomnes
220d0 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e  s,       /* xRan
220e0 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77  domness */.    w
220f0 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  inSleep,        
22100 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
22110 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54  .    winCurrentT
22120 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75  ime,      /* xCu
22130 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20  rrentTime */.   
22140 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
22150 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73  ,     /* xGetLas
22160 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  tError */.    wi
22170 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
22180 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69  4, /* xCurrentTi
22190 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77  meInt64 */.    w
221a0 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c  inSetSystemCall,
221b0 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65      /* xSetSyste
221c0 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
221d0 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  GetSystemCall,  
221e0 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43    /* xGetSystemC
221f0 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65  all */.    winNe
22200 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  xtSystemCall,   
22210 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61  /* xNextSystemCa
22220 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 2f 2a  ll */.  };..  /*
22230 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68   Double-check th
22240 61 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b  at the aSyscall[
22250 5d 20 61 72 72 61 79 20 68 61 73 20 62 65 65 6e  ] array has been
22260 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a   constructed.  *
22270 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65  * correctly.  Se
22280 65 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36  e ticket [bb3a86
22290 65 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a  e890c8e96ab] */.
222a0 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
222b0 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 37  ize(aSyscall)==7
222c0 34 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  4 );..#ifndef SQ
222d0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
222e0 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61  /* get memory ma
222f0 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61  p allocation gra
22300 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65  nularity */.  me
22310 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f  mset(&winSysInfo
22320 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54  , 0, sizeof(SYST
22330 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53  EM_INFO));.#if S
22340 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
22350 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74   osGetNativeSyst
22360 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e  emInfo(&winSysIn
22370 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47  fo);.#else.  osG
22380 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69  etSystemInfo(&wi
22390 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69  nSysInfo);.#endi
223a0 66 0a 20 20 61 73 73 65 72 74 28 77 69 6e 53 79  f.  assert(winSy
223b0 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69  sInfo.dwAllocati
223c0 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 20 3e 20  onGranularity > 
223d0 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  0);.#endif..  sq
223e0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
223f0 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a  er(&winVfs, 1);.
22400 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22410 4f 4b 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  OK; .}..int sqli
22420 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29  te3_os_end(void)
22430 7b 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  { .#if SQLITE_OS
22440 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73 6c 65  _WINRT.  if( sle
22450 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20  epObj!=NULL ){. 
22460 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
22470 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20  (sleepObj);.    
22480 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b  sleepObj = NULL;
22490 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
224a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
224b0 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  }..#endif /* SQL
224c0 49 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a        ITE_OS_WIN */.