/ Hex Artifact Content
Login

Artifact e988c2de4266fbb3b8c58e4b5550a2e17f541327:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43  mmon.h"../*.** C
02a0: 6f 6d 70 69 6c 69 6e 67 20 61 6e 64 20 75 73 69  ompiling and usi
02b0: 6e 67 20 57 41 4c 20 6d 6f 64 65 20 72 65 71 75  ng WAL mode requ
02c0: 69 72 65 73 20 73 65 76 65 72 61 6c 20 41 50 49  ires several API
02d0: 73 20 74 68 61 74 20 61 72 65 20 6f 6e 6c 79 0a  s that are only.
02e0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ** available in 
02f0: 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d  Windows platform
0300: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e  s based on the N
0310: 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66  T kernel..*/.#if
0320: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e   !SQLITE_OS_WINN
0330: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
0340: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 23  LITE_OMIT_WAL).#
0350: 20 65 72 72 6f 72 20 22 57 41 4c 20 6d 6f 64 65   error "WAL mode
0360: 20 72 65 71 75 69 72 65 73 20 73 75 70 70 6f 72   requires suppor
0370: 74 20 66 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f  t from the Windo
0380: 77 73 20 4e 54 20 6b 65 72 6e 65 6c 2c 20 63 6f  ws NT kernel, co
0390: 6d 70 69 6c 65 5c 0a 20 77 69 74 68 20 53 51 4c  mpile\. with SQL
03a0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 2e 22 0a 23  ITE_OMIT_WAL.".#
03b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65  endif../*.** Are
03c0: 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69 6e   most of the Win
03d0: 33 32 20 41 4e 53 49 20 41 50 49 73 20 61 76 61  32 ANSI APIs ava
03e0: 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77 69 74  ilable (i.e. wit
03f0: 68 20 63 65 72 74 61 69 6e 20 65 78 63 65 70 74  h certain except
0400: 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  ions.** based on
0410: 20 74 68 65 20 73 75 62 2d 70 6c 61 74 66 6f 72   the sub-platfor
0420: 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49  m)?.*/.#if !SQLI
0430: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
0440: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
0450: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
0460: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
0470: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72  #endif../*.** Ar
0480: 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69  e most of the Wi
0490: 6e 33 32 20 55 6e 69 63 6f 64 65 20 41 50 49 73  n32 Unicode APIs
04a0: 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e   available (i.e.
04b0: 20 77 69 74 68 20 63 65 72 74 61 69 6e 20 65 78   with certain ex
04c0: 63 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65  ceptions.** base
04d0: 64 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61  d on the sub-pla
04e0: 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 53  tform)?.*/.#if S
04f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
0500: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e  | SQLITE_OS_WINN
0510: 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  T || SQLITE_OS_W
0520: 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53  INRT.#  define S
0530: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0540: 57 49 44 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  WIDE.#endif../*.
0550: 2a 2a 20 44 6f 20 77 65 20 6e 65 65 64 20 74 6f  ** Do we need to
0560: 20 6d 61 6e 75 61 6c 6c 79 20 64 65 66 69 6e 65   manually define
0570: 20 74 68 65 20 57 69 6e 33 32 20 66 69 6c 65 20   the Win32 file 
0580: 6d 61 70 70 69 6e 67 20 41 50 49 73 20 66 6f 72  mapping APIs for
0590: 20 75 73 65 20 77 69 74 68 20 57 41 4c 0a 2a 2a   use with WAL.**
05a0: 20 6d 6f 64 65 20 28 65 2e 67 2e 20 74 68 65 73   mode (e.g. thes
05b0: 65 20 41 50 49 73 20 61 72 65 20 61 76 61 69 6c  e APIs are avail
05c0: 61 62 6c 65 20 69 6e 20 74 68 65 20 57 69 6e 64  able in the Wind
05d0: 6f 77 73 20 43 45 20 53 44 4b 3b 20 68 6f 77 65  ows CE SDK; howe
05e0: 76 65 72 2c 20 74 68 65 79 0a 2a 2a 20 61 72 65  ver, they.** are
05f0: 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
0600: 74 68 65 20 68 65 61 64 65 72 20 66 69 6c 65 29  the header file)
0610: 3f 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ?.*/.#if SQLITE_
0620: 57 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e  WIN32_FILEMAPPIN
0630: 47 5f 41 50 49 20 26 26 20 21 64 65 66 69 6e 65  G_API && !define
0640: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
0650: 4c 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66 20  L)./*.** Two of 
0660: 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  the file mapping
0670: 20 41 50 49 73 20 61 72 65 20 64 69 66 66 65 72   APIs are differ
0680: 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52 54 2e  ent under WinRT.
0690: 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69    Figure out whi
06a0: 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65 65  ch.** set we nee
06b0: 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  d..*/.#if SQLITE
06c0: 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41 53  _OS_WINRT.WINBAS
06d0: 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41  EAPI HANDLE WINA
06e0: 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70  PI CreateFileMap
06f0: 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e 44  pingFromApp(HAND
0700: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
0710: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
0720: 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e  TES, ULONG, ULON
0730: 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a 0a  G64, LPCWSTR);..
0740: 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49  WINBASEAPI LPVOI
0750: 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77  D WINAPI MapView
0760: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 48 41  OfFileFromApp(HA
0770: 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f  NDLE, ULONG, ULO
0780: 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a 23  NG64, SIZE_T);.#
0790: 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64  else.#if defined
07a0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
07b0: 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53 45 41  S_ANSI).WINBASEA
07c0: 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49  PI HANDLE WINAPI
07d0: 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
07e0: 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45  ngA(HANDLE, LPSE
07f0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
0800: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
0810: 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44  RD, DWORD, DWORD
0820: 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64 69  , LPCSTR);.#endi
0830: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
0840: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
0850: 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  SI) */..#if defi
0860: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
0870: 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e 42 41  _HAS_WIDE).WINBA
0880: 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e  SEAPI HANDLE WIN
0890: 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61  API CreateFileMa
08a0: 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20 4c  ppingW(HANDLE, L
08b0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
08c0: 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20  UTES, \.        
08d0: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57  DWORD, DWORD, DW
08e0: 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a 23  ORD, LPCWSTR);.#
08f0: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
0900: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
0910: 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e 42  S_WIDE) */..WINB
0920: 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57 49  ASEAPI LPVOID WI
0930: 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69  NAPI MapViewOfFi
0940: 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52 44  le(HANDLE, DWORD
0950: 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20  , DWORD, DWORD, 
0960: 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66 20  SIZE_T);.#endif 
0970: 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
0980: 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  RT */../*.** Thi
0990: 73 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41  s file mapping A
09a0: 50 49 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  PI is common to 
09b0: 62 6f 74 68 20 57 69 6e 33 32 20 61 6e 64 20 57  both Win32 and W
09c0: 69 6e 52 54 2e 0a 2a 2f 0a 57 49 4e 42 41 53 45  inRT..*/.WINBASE
09d0: 41 50 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20  API BOOL WINAPI 
09e0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
09f0: 4c 50 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66  LPCVOID);.#endif
0a00: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
0a10: 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49  _FILEMAPPING_API
0a20: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0a30: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 2a 2f  ITE_OMIT_WAL) */
0a40: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 20 74 6f  ../*.** Macro to
0a50: 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75   find the minimu
0a60: 6d 20 6f 66 20 74 77 6f 20 6e 75 6d 65 72 69 63  m of two numeric
0a70: 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66 6e   values..*/.#ifn
0a80: 64 65 66 20 4d 49 4e 0a 23 20 64 65 66 69 6e 65  def MIN.# define
0a90: 20 4d 49 4e 28 78 2c 79 29 20 28 28 78 29 3c 28   MIN(x,y) ((x)<(
0aa0: 79 29 3f 28 78 29 3a 28 79 29 29 0a 23 65 6e 64  y)?(x):(y)).#end
0ab0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  if../*.** Some M
0ac0: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
0ad0: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
0ae0: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
0af0: 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  def INVALID_FILE
0b00: 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65  _ATTRIBUTES.# de
0b10: 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c  fine INVALID_FIL
0b20: 45 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44  E_ATTRIBUTES ((D
0b30: 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64 69 66  WORD)-1) .#endif
0b40: 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46  ..#ifndef FILE_F
0b50: 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  LAG_MASK.# defin
0b60: 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b  e FILE_FLAG_MASK
0b70: 20 20 20 20 20 20 20 20 20 20 28 30 78 46 46 33            (0xFF3
0b80: 43 30 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23  C0000).#endif..#
0b90: 69 66 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52  ifndef FILE_ATTR
0ba0: 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66  IBUTE_MASK.# def
0bb0: 69 6e 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55  ine FILE_ATTRIBU
0bc0: 54 45 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30  TE_MASK     (0x0
0bd0: 30 30 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a  003FFF7).#endif.
0be0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0bf0: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77  OMIT_WAL./* Forw
0c00: 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a  ard references *
0c10: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0c20: 20 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20   winShm winShm; 
0c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
0c40: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
0c50: 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79  red-memory */.ty
0c60: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
0c70: 53 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f  ShmNode winShmNo
0c80: 64 65 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f  de;   /* A regio
0c90: 6e 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n of shared-memo
0ca0: 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry */.#endif../*
0cb0: 0a 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20  .** WinCE lacks 
0cc0: 6e 61 74 69 76 65 20 73 75 70 70 6f 72 74 20 66  native support f
0cd0: 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  or file locking 
0ce0: 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 66 61  so we have to fa
0cf0: 6b 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f  ke it.** with so
0d00: 6d 65 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f  me code of our o
0d10: 77 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  wn..*/.#if SQLIT
0d20: 45 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64  E_OS_WINCE.typed
0d30: 65 66 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c  ef struct winceL
0d40: 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61  ock {.  int nRea
0d50: 64 65 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  ders;       /* N
0d60: 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65 72 20  umber of reader 
0d70: 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a  locks obtained *
0d80: 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e  /.  BOOL bPendin
0d90: 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63  g;      /* Indic
0da0: 61 74 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c  ates a pending l
0db0: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
0dc0: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
0dd0: 62 52 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f  bReserved;     /
0de0: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 72 65  * Indicates a re
0df0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20  served lock has 
0e00: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
0e10: 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69  .  BOOL bExclusi
0e20: 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  ve;    /* Indica
0e30: 74 65 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  tes an exclusive
0e40: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
0e50: 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e  btained */.} win
0e60: 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a  ceLock;.#endif..
0e70: 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c  /*.** The winFil
0e80: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  e structure is a
0e90: 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c   subclass of sql
0ea0: 69 74 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69  ite3_file* speci
0eb0: 66 69 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32  fic to the win32
0ec0: 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20  .** portability 
0ed0: 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  layer..*/.typede
0ee0: 66 20 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65  f struct winFile
0ef0: 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74   winFile;.struct
0f00: 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e   winFile {.  con
0f10: 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
0f20: 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20  thods *pMethod; 
0f30: 2f 2a 2a 2a 20 4d 75 73 74 20 62 65 20 66 69 72  /*** Must be fir
0f40: 73 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65  st ***/.  sqlite
0f50: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
0f60: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 75 73 65    /* The VFS use
0f70: 64 20 74 6f 20 6f 70 65 6e 20 74 68 69 73 20 66  d to open this f
0f80: 69 6c 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ile */.  HANDLE 
0f90: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0fa0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
0fb0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c  ccessing the fil
0fc0: 65 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79  e */.  u8 lockty
0fd0: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
0fe0: 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63  * Type of lock c
0ff0: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e  urrently held on
1000: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1010: 73 68 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b  short sharedLock
1020: 42 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f  Byte;   /* Rando
1030: 6d 6c 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20  mly chosen byte 
1040: 75 73 65 64 20 61 73 20 61 20 73 68 61 72 65 64  used as a shared
1050: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74   lock */.  u8 ct
1060: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  rlFlags;        
1070: 20 20 20 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65     /* Flags.  Se
1080: 65 20 57 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f  e WINFILE_* belo
1090: 77 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  w */.  DWORD las
10a0: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f  tErrno;        /
10b0: 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
10c0: 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
10d0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23  t I/O error */.#
10e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10f0: 49 54 5f 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20  IT_WAL.  winShm 
1100: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
1110: 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20   /* Instance of 
1120: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e  shared memory on
1130: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65   this file */.#e
1140: 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 63 68 61  ndif.  const cha
1150: 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 2f  r *zPath;      /
1160: 2a 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  * Full pathname 
1170: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  of this file */.
1180: 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20    int szChunk;  
1190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75            /* Chu
11a0: 6e 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67 75 72  nk size configur
11b0: 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e  ed by FCNTL_CHUN
11c0: 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51  K_SIZE */.#if SQ
11d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11e0: 4c 50 57 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e  LPWSTR zDeleteOn
11f0: 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  Close;  /* Name 
1200: 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74  of file to delet
1210: 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a  e when closing *
1220: 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65  /.  HANDLE hMute
1230: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  x;          /* M
1240: 75 74 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e  utex used to con
1250: 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73  trol access to s
1260: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a  hared lock */  .
1270: 20 20 48 41 4e 44 4c 45 20 68 53 68 61 72 65 64    HANDLE hShared
1280: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61  ;         /* Sha
1290: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
12a0: 6e 74 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  nt used for lock
12b0: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f  ing */.  winceLo
12c0: 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20  ck local;       
12d0: 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e   /* Locks obtain
12e0: 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 61  ed by this insta
12f0: 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a  nce of winFile *
1300: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73  /.  winceLock *s
1310: 68 61 72 65 64 3b 20 20 20 20 20 20 2f 2a 20 47  hared;      /* G
1320: 6c 6f 62 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  lobal shared loc
1330: 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  k memory for the
1340: 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66   file  */.#endif
1350: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  .};../*.** Allow
1360: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69  ed values for wi
1370: 6e 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a  nFile.ctrlFlags.
1380: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
1390: 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20  LE_PERSIST_WAL  
13a0: 20 20 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72     0x04   /* Per
13b0: 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65  sistent WAL mode
13c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46   */.#define WINF
13d0: 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20  ILE_PSOW        
13e0: 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51      0x10   /* SQ
13f0: 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1400: 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a  SAFE_OVERWRITE *
1410: 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a  /../*. * The siz
1420: 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
1430: 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  used by sqlite3_
1440: 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75  win32_write_debu
1450: 67 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  g().. */.#ifndef
1460: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
1470: 47 5f 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65  G_BUF_SIZE.#  de
1480: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
1490: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20  2_DBG_BUF_SIZE  
14a0: 20 28 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a   ((int)(4096-siz
14b0: 65 6f 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e  eof(DWORD))).#en
14c0: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76  dif../*. * The v
14d0: 61 6c 75 65 20 75 73 65 64 20 77 69 74 68 20 73  alue used with s
14e0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
14f0: 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20  _directory() to 
1500: 73 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20  specify that. * 
1510: 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
1520: 72 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61  ry should be cha
1530: 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  nged.. */.#ifnde
1540: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  f SQLITE_WIN32_D
1550: 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  ATA_DIRECTORY_TY
1560: 50 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  PE.#  define SQL
1570: 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44  ITE_WIN32_DATA_D
1580: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28 31  IRECTORY_TYPE (1
1590: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
15a0: 54 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77  The value used w
15b0: 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  ith sqlite3_win3
15c0: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
15d0: 29 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61  ) to specify tha
15e0: 74 0a 20 2a 20 74 68 65 20 74 65 6d 70 6f 72 61  t. * the tempora
15f0: 72 79 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f  ry directory sho
1600: 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  uld be changed..
1610: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1620: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
1630: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20  RECTORY_TYPE.#  
1640: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
1650: 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f  N32_TEMP_DIRECTO
1660: 52 59 5f 54 59 50 45 20 28 32 29 0a 23 65 6e 64  RY_TYPE (2).#end
1670: 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d  if../*. * If com
1680: 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
1690: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f  E_WIN32_MALLOC o
16a0: 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69  n Windows, we wi
16b0: 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61  ll use the. * va
16c0: 72 69 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20  rious Win32 API 
16d0: 68 65 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69  heap functions i
16e0: 6e 73 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77  nstead of our ow
16f0: 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  n.. */.#ifdef SQ
1700: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
1710: 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73  C../*. * If this
1720: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e   is non-zero, an
1730: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
1740: 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 62  ill be created b
1750: 79 20 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e  y the native Win
1760: 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20  32. * allocator 
1770: 73 75 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72  subsystem; other
1780: 77 69 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c  wise, the defaul
1790: 74 20 70 72 6f 63 65 73 73 20 68 65 61 70 20 77  t process heap w
17a0: 69 6c 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68  ill be used.  Th
17b0: 69 73 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61  is. * setting ha
17c0: 73 20 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e  s no effect when
17d0: 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57   compiling for W
17e0: 69 6e 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c  inRT.  By defaul
17f0: 74 2c 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c  t, this is enabl
1800: 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f  ed. * and an iso
1810: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20  lated heap will 
1820: 62 65 20 63 72 65 61 74 65 64 20 74 6f 20 73 74  be created to st
1830: 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65  ore all allocate
1840: 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a  d data.. *. ****
1850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41  **********. * WA
18a0: 52 4e 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70  RNING: It is imp
18b0: 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74  ortant to note t
18c0: 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 73 65  hat when this se
18d0: 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72  tting is non-zer
18e0: 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20  o and the. *    
18f0: 20 20 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74        winMemShut
1900: 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  down function is
1910: 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79   called (e.g. by
1920: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75   the sqlite3_shu
1930: 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20  tdown. *        
1940: 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c    function), all
1950: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 61   data that was a
1960: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74  llocated using t
1970: 68 65 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70  he isolated heap
1980: 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20   will. *        
1990: 20 20 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64    be freed immed
19a0: 69 61 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61  iately and any a
19b0: 74 74 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73  ttempt to access
19c0: 20 61 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65   any of that fre
19d0: 65 64 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64  ed. *          d
19e0: 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20  ata will almost 
19f0: 63 65 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74  certainly result
1a00: 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65   in an immediate
1a10: 20 61 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f   access violatio
1a20: 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.. ************
1a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a70: 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  **. */.#ifndef S
1a80: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
1a90: 5f 43 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e  _CREATE.#  defin
1aa0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
1ab0: 45 41 50 5f 43 52 45 41 54 45 20 20 20 20 28 54  EAP_CREATE    (T
1ac0: 52 55 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  RUE).#endif../*.
1ad0: 20 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73   * The initial s
1ae0: 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ize of the Win32
1af0: 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20  -specific heap. 
1b00: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
1b10: 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66  be zero.. */.#if
1b20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
1b30: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
1b40: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
1b50: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
1b60: 54 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45 5f  T_SIZE ((SQLITE_
1b70: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
1b80: 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20  ZE) * \.        
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1bb0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
1bc0: 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 34  AGE_SIZE) + 4194
1bd0: 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  304).#endif../*.
1be0: 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73   * The maximum s
1bf0: 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ize of the Win32
1c00: 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20  -specific heap. 
1c10: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
1c20: 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66  be zero.. */.#if
1c30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
1c40: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a  2_HEAP_MAX_SIZE.
1c50: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
1c60: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
1c70: 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69 66  SIZE  (0).#endif
1c80: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72  ../*. * The extr
1c90: 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69  a flags to use i
1ca0: 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57  n calls to the W
1cb0: 69 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e 20  in32 heap APIs. 
1cc0: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
1cd0: 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74  be. * zero for t
1ce0: 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76  he default behav
1cf0: 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ior.. */.#ifndef
1d00: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
1d10: 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69  AP_FLAGS.#  defi
1d20: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
1d30: 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20 28  HEAP_FLAGS     (
1d40: 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0).#endif../*.**
1d50: 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61 20   The winMemData 
1d60: 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65 73  structure stores
1d70: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71   information req
1d80: 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69 6e  uired by the Win
1d90: 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 73  32-specific.** s
1da0: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
1db0: 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ds implementatio
1dc0: 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  n..*/.typedef st
1dd0: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
1de0: 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72 75  winMemData;.stru
1df0: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b 0a  ct winMemData {.
1e00: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1e10: 20 75 33 32 20 6d 61 67 69 63 3b 20 20 20 20 2f   u32 magic;    /
1e20: 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74  * Magic number t
1e30: 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75  o detect structu
1e40: 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a  re corruption. *
1e50: 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44 4c  /.#endif.  HANDL
1e60: 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65 20  E hHeap; /* The 
1e70: 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68 65  handle to our he
1e80: 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f  ap. */.  BOOL bO
1e90: 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65 20  wned;  /* Do we 
1ea0: 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69 2e  own the heap (i.
1eb0: 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f 6e  e. destroy it on
1ec0: 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a 7d   shutdown)? */.}
1ed0: 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
1ee0: 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d  G.#define WINMEM
1ef0: 5f 4d 41 47 49 43 20 20 20 20 20 30 78 34 32 62  _MAGIC     0x42b
1f00: 32 38 33 30 62 0a 23 65 6e 64 69 66 0a 0a 73 74  2830b.#endif..st
1f10: 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d  atic struct winM
1f20: 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64  emData win_mem_d
1f30: 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20  ata = {.#ifndef 
1f40: 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f  NDEBUG.  WINMEM_
1f50: 4d 41 47 49 43 2c 0a 23 65 6e 64 69 66 0a 20 20  MAGIC,.#endif.  
1f60: 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 7d 3b 0a 0a  NULL, FALSE.};..
1f70: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
1f80: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73  define winMemAss
1f90: 65 72 74 4d 61 67 69 63 28 29 20 61 73 73 65 72  ertMagic() asser
1fa0: 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e  t( win_mem_data.
1fb0: 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  magic==WINMEM_MA
1fc0: 47 49 43 20 29 0a 23 65 6c 73 65 0a 23 64 65 66  GIC ).#else.#def
1fd0: 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ine winMemAssert
1fe0: 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a  Magic().#endif..
1ff0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65  #define winMemGe
2000: 74 48 65 61 70 28 29 20 77 69 6e 5f 6d 65 6d 5f  tHeap() win_mem_
2010: 64 61 74 61 2e 68 48 65 61 70 0a 0a 73 74 61 74  data.hHeap..stat
2020: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d  ic void *winMemM
2030: 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73  alloc(int nBytes
2040: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
2050: 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a  inMemFree(void *
2060: 70 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20  pPrior);.static 
2070: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c  void *winMemReal
2080: 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  loc(void *pPrior
2090: 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  , int nBytes);.s
20a0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
20b0: 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73  Size(void *p);.s
20c0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
20d0: 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a  Roundup(int n);.
20e0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
20f0: 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70  mInit(void *pApp
2100: 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f  Data);.static vo
2110: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77  id winMemShutdow
2120: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  n(void *pAppData
2130: 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  );..const sqlite
2140: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73  3_mem_methods *s
2150: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
2160: 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20  2(void);.#endif 
2170: 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
2180: 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  MALLOC */../*.**
2190: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
21a0: 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d  ariable is (norm
21b0: 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61  ally) set once a
21c0: 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73  nd never changes
21d0: 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20  .** thereafter. 
21e0: 20 49 74 20 72 65 63 6f 72 64 73 20 77 68 65 74   It records whet
21f0: 68 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e  her the operatin
2200: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
2210: 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a  x.** or WinNT..*
2220: 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74  *.** 0:   Operat
2230: 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f  ing system unkno
2240: 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72  wn..** 1:   Oper
2250: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
2260: 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f  Win9x..** 2:   O
2270: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
2280: 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20  is WinNT..**.** 
2290: 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69  In order to faci
22a0: 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f  litate testing o
22b0: 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d  n a WinNT system
22c0: 2c 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75  , the test fixtu
22d0: 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c  re.** can manual
22e0: 6c 79 20 73 65 74 20 74 68 69 73 20 76 61 6c 75  ly set this valu
22f0: 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74  e to 1 to emulat
2300: 65 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72  e Win98 behavior
2310: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2320: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
2330: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b  te3_os_type = 0;
2340: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e  .#else.static in
2350: 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  t sqlite3_os_typ
2360: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 0;.#endif..#
2370: 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23  ifndef SYSCALL.#
2380: 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c    define SYSCALL
2390: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
23a0: 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  _ptr.#endif../*.
23b0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
23c0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
23d0: 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20  e on Windows CE 
23e0: 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23  or WinRT.. */..#
23f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2400: 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
2410: 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20  WINRT.#  define 
2420: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
2430: 49 28 29 20 20 20 20 20 20 20 31 0a 23 65 6e 64  I()       1.#end
2440: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73  if../*.** Many s
2450: 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20  ystem calls are 
2460: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
2470: 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63   pointer-to-func
2480: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a  tions so that.**
2490: 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65   they may be ove
24a0: 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69  rridden at runti
24b0: 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  me to facilitate
24c0: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
24d0: 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69   during.** testi
24e0: 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e  ng and sandboxin
24f0: 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  g.  The followin
2500: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68  g array holds th
2510: 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e  e names and poin
2520: 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f  ters.** to all o
2530: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
2540: 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  em calls..*/.sta
2550: 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73  tic struct win_s
2560: 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74  yscall {.  const
2570: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
2580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2590: 20 6f 66 20 74 68 65 20 73 79 74 65 6d 20 63 61   of the sytem ca
25a0: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
25b0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72  syscall_ptr pCur
25c0: 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74  rent; /* Current
25d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
25e0: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
25f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2600: 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20  tr pDefault; /* 
2610: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f  Default value */
2620: 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20  .} aSyscall[] = 
2630: 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
2640: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
2650: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
2660: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22  AreFileApisANSI"
2670: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
2680: 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73 41 4e  LL)AreFileApisAN
2690: 53 49 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  SI,         0 },
26a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72 65 46  .#else.  { "AreF
26b0: 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20  ileApisANSI",   
26c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
26d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
26f0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41  dif..#ifndef osA
2700: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 0a 23  reFileApisANSI.#
2710: 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65  define osAreFile
2720: 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28  ApisANSI ((BOOL(
2730: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
2740: 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72  Syscall[0].pCurr
2750: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
2760: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
2770: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
2780: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2790: 45 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65  E).  { "CharLowe
27a0: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
27b0: 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 4c    (SYSCALL)CharL
27c0: 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20 20 20  owerW,          
27d0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
27e0: 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c   { "CharLowerW",
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
2800: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
2830: 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65 72  fine osCharLower
2840: 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50  W ((LPWSTR(WINAP
2850: 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79 73  I*)(LPWSTR))aSys
2860: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
2870: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
2880: 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65  _WINCE && define
2890: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
28a0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68  AS_WIDE).  { "Ch
28b0: 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20 20  arUpperW",      
28c0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
28d0: 29 43 68 61 72 55 70 70 65 72 57 2c 20 20 20 20  )CharUpperW,    
28e0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
28f0: 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 55 70  else.  { "CharUp
2900: 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  perW",          
2910: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
2940: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61  f..#define osCha
2950: 72 55 70 70 65 72 57 20 28 28 4c 50 57 53 54 52  rUpperW ((LPWSTR
2960: 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52  (WINAPI*)(LPWSTR
2970: 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43  ))aSyscall[2].pC
2980: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c  urrent)..  { "Cl
2990: 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20 20 20 20  oseHandle",     
29a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
29b0: 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20  )CloseHandle,   
29c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
29d0: 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48  #define osCloseH
29e0: 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  andle ((BOOL(WIN
29f0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
2a00: 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65  yscall[3].pCurre
2a10: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
2a20: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2a30: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43 72 65  S_ANSI).  { "Cre
2a40: 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  ateFileA",      
2a50: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2a60: 43 72 65 61 74 65 46 69 6c 65 41 2c 20 20 20 20  CreateFileA,    
2a70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2a80: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
2a90: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
2aa0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2ad0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
2ae0: 74 65 46 69 6c 65 41 20 28 28 48 41 4e 44 4c 45  teFileA ((HANDLE
2af0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
2b00: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
2b10: 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49          LPSECURI
2b20: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57  TY_ATTRIBUTES,DW
2b30: 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45  ORD,DWORD,HANDLE
2b40: 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43  ))aSyscall[4].pC
2b50: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
2b60: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
2b70: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2b80: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
2b90: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57    { "CreateFileW
2ba0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
2bb0: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
2bc0: 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  leW,            
2bd0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2be0: 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20  "CreateFileW",  
2bf0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
2c00: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2c20: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2c30: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 20  e osCreateFileW 
2c40: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
2c50: 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c  )(LPCWSTR,DWORD,
2c60: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
2c70: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
2c80: 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f  IBUTES,DWORD,DWO
2c90: 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63  RD,HANDLE))aSysc
2ca0: 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29  all[5].pCurrent)
2cb0: 0a 0a 23 69 66 20 28 21 53 51 4c 49 54 45 5f 4f  ..#if (!SQLITE_O
2cc0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
2cd0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2ce0: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a 20  HAS_ANSI) && \. 
2cf0: 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28         !defined(
2d00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
2d10: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
2d20: 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20  eMappingA",     
2d30: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
2d40: 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20 20 20  FileMappingA,   
2d50: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
2d60: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
2d70: 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59  pingA",      (SY
2d80: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2da0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
2db0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
2dc0: 4d 61 70 70 69 6e 67 41 20 28 28 48 41 4e 44 4c  MappingA ((HANDL
2dd0: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  E(WINAPI*)(HANDL
2de0: 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  E,LPSECURITY_ATT
2df0: 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20  RIBUTES, \.     
2e00: 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44     DWORD,DWORD,D
2e10: 57 4f 52 44 2c 4c 50 43 53 54 52 29 29 61 53 79  WORD,LPCSTR))aSy
2e20: 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e  scall[6].pCurren
2e30: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
2e40: 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c  S_WINCE || (!SQL
2e50: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
2e60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2e70: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26  IN32_HAS_WIDE) &
2e80: 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66  & \.        !def
2e90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2ea0: 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65 61  _WAL)).  { "Crea
2eb0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c  teFileMappingW",
2ec0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
2ed0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
2ee0: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
2ef0: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
2f00: 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20  leMappingW",    
2f10: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2f40: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
2f50: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28  eFileMappingW ((
2f60: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
2f70: 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54  HANDLE,LPSECURIT
2f80: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a  Y_ATTRIBUTES, \.
2f90: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57          DWORD,DW
2fa0: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54  ORD,DWORD,LPCWST
2fb0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70  R))aSyscall[7].p
2fc0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
2fd0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
2fe0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
2ff0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3000: 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65  .  { "CreateMute
3010: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xW",            
3020: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d  (SYSCALL)CreateM
3030: 75 74 65 78 57 2c 20 20 20 20 20 20 20 20 20 20  utexW,          
3040: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3050: 20 22 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c   "CreateMutexW",
3060: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3070: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3090: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
30a0: 6e 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78  ne osCreateMutex
30b0: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
30c0: 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41  I*)(LPSECURITY_A
30d0: 54 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20  TTRIBUTES,BOOL, 
30e0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53 54  \.        LPCWST
30f0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70  R))aSyscall[8].p
3100: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3110: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3120: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
3130: 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20   "DeleteFileA", 
3140: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3150: 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41  CALL)DeleteFileA
3160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3170: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65  },.#else.  { "De
3180: 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  leteFileA",     
3190: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
31a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
31b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
31c0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
31d0: 73 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42  sDeleteFileA ((B
31e0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
31f0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  STR))aSyscall[9]
3200: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3210: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3220: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
3230: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22   { "DeleteFileW"
3240: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
3250: 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c  YSCALL)DeleteFil
3260: 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eW,             
3270: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3280: 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20  DeleteFileW",   
3290: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
32a0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
32c0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
32d0: 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28   osDeleteFileW (
32e0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
32f0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
3300: 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [10].pCurrent)..
3310: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
3320: 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  NCE.  { "FileTim
3330: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
3340: 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65  ", (SYSCALL)File
3350: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
3360: 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ime, 0 },.#else.
3370: 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c    { "FileTimeToL
3380: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28  ocalFileTime", (
3390: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
33c0: 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65  efine osFileTime
33d0: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20  ToLocalFileTime 
33e0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
33f0: 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c  CONST FILETIME*,
3400: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c   \.        LPFIL
3410: 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  ETIME))aSyscall[
3420: 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  11].pCurrent)..#
3430: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
3440: 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  CE.  { "FileTime
3450: 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  ToSystemTime",  
3460: 20 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54    (SYSCALL)FileT
3470: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c  imeToSystemTime,
3480: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3490: 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79   { "FileTimeToSy
34a0: 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53  stemTime",    (S
34b0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
34e0: 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54  fine osFileTimeT
34f0: 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f  oSystemTime ((BO
3500: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53  OL(WINAPI*)(CONS
3510: 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20  T FILETIME*, \. 
3520: 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54         LPSYSTEMT
3530: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32  IME))aSyscall[12
3540: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3550: 20 22 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65   "FlushFileBuffe
3560: 72 73 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  rs",        (SYS
3570: 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75  CALL)FlushFileBu
3580: 66 66 65 72 73 2c 20 20 20 20 20 20 20 20 30 20  ffers,        0 
3590: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c  },..#define osFl
35a0: 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 20 28  ushFileBuffers (
35b0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
35c0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
35d0: 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  13].pCurrent)..#
35e0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
35f0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
3600: 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  ).  { "FormatMes
3610: 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20  sageA",         
3620: 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74   (SYSCALL)Format
3630: 4d 65 73 73 61 67 65 41 2c 20 20 20 20 20 20 20  MessageA,       
3640: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3650: 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  { "FormatMessage
3660: 41 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  A",          (SY
3670: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3690: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
36a0: 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  ine osFormatMess
36b0: 61 67 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e  ageA ((DWORD(WIN
36c0: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56  API*)(DWORD,LPCV
36d0: 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  OID,DWORD,DWORD,
36e0: 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  LPSTR, \.       
36f0: 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29   DWORD,va_list*)
3700: 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43  )aSyscall[14].pC
3710: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3720: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3730: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
3740: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22  "FormatMessageW"
3750: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
3760: 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67  ALL)FormatMessag
3770: 65 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  eW,          0 }
3780: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72  ,.#else.  { "For
3790: 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20  matMessageW",   
37a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
37b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
37c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
37d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
37e0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28  FormatMessageW (
37f0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3800: 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57  DWORD,LPCVOID,DW
3810: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52  ORD,DWORD,LPWSTR
3820: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
3830: 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73  D,va_list*))aSys
3840: 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e  call[15].pCurren
3850: 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t)..#if !defined
3860: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41  (SQLITE_OMIT_LOA
3870: 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b  D_EXTENSION).  {
3880: 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20   "FreeLibrary", 
3890: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
38a0: 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79  CALL)FreeLibrary
38b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
38c0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72  },.#else.  { "Fr
38d0: 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  eeLibrary",     
38e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
38f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3900: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3910: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3920: 73 46 72 65 65 4c 69 62 72 61 72 79 20 28 28 42  sFreeLibrary ((B
3930: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f  OOL(WINAPI*)(HMO
3940: 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  DULE))aSyscall[1
3950: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  6].pCurrent)..  
3960: 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f  { "GetCurrentPro
3970: 63 65 73 73 49 64 22 2c 20 20 20 20 20 28 53 59  cessId",     (SY
3980: 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74  SCALL)GetCurrent
3990: 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30  ProcessId,     0
39a0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
39b0: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
39c0: 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  Id ((DWORD(WINAP
39d0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
39e0: 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[17].pCurrent)
39f0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
3a00: 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65  _WINCE && define
3a10: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3a20: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
3a30: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 22  tDiskFreeSpaceA"
3a40: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
3a50: 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  )GetDiskFreeSpac
3a60: 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  eA,       0 },.#
3a70: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73  else.  { "GetDis
3a80: 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 20 20  kFreeSpaceA",   
3a90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ab0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3ac0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3ad0: 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 20 28  DiskFreeSpaceA (
3ae0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
3af0: 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50  PCSTR,LPDWORD,LP
3b00: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c  DWORD,LPDWORD, \
3b10: 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44  .        LPDWORD
3b20: 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70  ))aSyscall[18].p
3b30: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
3b40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
3b50: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
3b60: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
3b70: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3b80: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73  IDE).  { "GetDis
3b90: 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20  kFreeSpaceW",   
3ba0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
3bb0: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20  DiskFreeSpaceW, 
3bc0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3bd0: 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65  .  { "GetDiskFre
3be0: 65 53 70 61 63 65 57 22 2c 20 20 20 20 20 20 20  eSpaceW",       
3bf0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3c20: 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b  define osGetDisk
3c30: 46 72 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f  FreeSpaceW ((BOO
3c40: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  L(WINAPI*)(LPCWS
3c50: 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f  TR,LPDWORD,LPDWO
3c60: 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20  RD,LPDWORD, \.  
3c70: 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61        LPDWORD))a
3c80: 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72  Syscall[19].pCur
3c90: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3ca0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3cb0: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47  HAS_ANSI).  { "G
3cc0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3cd0: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
3ce0: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
3cf0: 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tesA,      0 },.
3d00: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
3d10: 6c 65 41 74 74 72 69 62 75 74 65 73 41 22 2c 20  leAttributesA", 
3d20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3d50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
3d60: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
3d70: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
3d80: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
3d90: 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[20].pCurrent)
3da0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
3db0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
3dc0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3dd0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
3de0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
3df0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
3e00: 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  )GetFileAttribut
3e10: 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  esW,      0 },.#
3e20: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
3e30: 65 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20  eAttributesW",  
3e40: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3e70: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3e80: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 20  FileAttributesW 
3e90: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
3ea0: 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  (LPCWSTR))aSysca
3eb0: 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[21].pCurrent)
3ec0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
3ed0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3ee0: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c  IDE).  { "GetFil
3ef0: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c  eAttributesExW",
3f00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
3f10: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
3f20: 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  W,    0 },.#else
3f30: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
3f40: 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20  ributesExW",    
3f50: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f70: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3f80: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
3f90: 41 74 74 72 69 62 75 74 65 73 45 78 57 20 28 28  AttributesExW ((
3fa0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
3fb0: 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58  CWSTR,GET_FILEEX
3fc0: 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a  _INFO_LEVELS, \.
3fd0: 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29          LPVOID))
3fe0: 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75  aSyscall[22].pCu
3ff0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4000: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
4010: 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20   "GetFileSize", 
4020: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4030: 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65  CALL)GetFileSize
4040: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
4050: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4060: 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20  tFileSize",     
4070: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4080: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4090: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
40a0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
40b0: 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44  sGetFileSize ((D
40c0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
40d0: 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53  NDLE,LPDWORD))aS
40e0: 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72  yscall[23].pCurr
40f0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4100: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
4110: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4120: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
4130: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
4140: 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eA",        (SYS
4150: 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68  CALL)GetFullPath
4160: 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20  NameA,        0 
4170: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4180: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c  tFullPathNameA",
4190: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
41a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
41b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
41c0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
41d0: 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
41e0: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
41f0: 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c  *)(LPCSTR,DWORD,
4200: 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  LPSTR, \.       
4210: 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c   LPSTR*))aSyscal
4220: 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[24].pCurrent).
4230: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4240: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
4250: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
4260: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4270: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4280: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
4290: 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  W",        (SYSC
42a0: 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e  ALL)GetFullPathN
42b0: 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d  ameW,        0 }
42c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
42d0: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20  FullPathNameW", 
42e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
42f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4300: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4310: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4320: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
4330: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
4340: 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c  )(LPCWSTR,DWORD,
4350: 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  LPWSTR, \.      
4360: 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63    LPWSTR*))aSysc
4370: 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74  all[25].pCurrent
4380: 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45  )..  { "GetLastE
4390: 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20  rror",          
43a0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61    (SYSCALL)GetLa
43b0: 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  stError,        
43c0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
43d0: 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  e osGetLastError
43e0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
43f0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
4400: 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [26].pCurrent)..
4410: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
4420: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
4430: 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c  TENSION).#if SQL
4440: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
4450: 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41 64 64  * The GetProcAdd
4460: 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20  ressA() routine 
4470: 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
4480: 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e  e on Windows CE.
4490: 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63   */.  { "GetProc
44a0: 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20  AddressA",      
44b0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50     (SYSCALL)GetP
44c0: 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20 20  rocAddressA,    
44d0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
44e0: 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57    /* All other W
44f0: 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73  indows platforms
4500: 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63 41   expect GetProcA
4510: 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65  ddress() to take
4520: 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74  .  ** an ANSI st
4530: 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ring regardless 
4540: 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20  of the _UNICODE 
4550: 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22  setting */.  { "
4560: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22  GetProcAddressA"
4570: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
4580: 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73  LL)GetProcAddres
4590: 73 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  s,          0 },
45a0: 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20  .#endif.#else.  
45b0: 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73  { "GetProcAddres
45c0: 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  sA",         (SY
45d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
45f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4600: 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64  ine osGetProcAdd
4610: 72 65 73 73 41 20 28 28 46 41 52 50 52 4f 43 28  ressA ((FARPROC(
4620: 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45  WINAPI*)(HMODULE
4630: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53  , \.        LPCS
4640: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d  TR))aSyscall[27]
4650: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4660: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
4670: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49  .  { "GetSystemI
4680: 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20  nfo",           
4690: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
46a0: 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  emInfo,         
46b0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
46c0: 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22   "GetSystemInfo"
46d0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
46e0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4700: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4710: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e  ne osGetSystemIn
4720: 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  fo ((VOID(WINAPI
4730: 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f  *)(LPSYSTEM_INFO
4740: 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70  ))aSyscall[28].p
4750: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
4760: 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  etSystemTime",  
4770: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4780: 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c  L)GetSystemTime,
4790: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
47a0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79  .#define osGetSy
47b0: 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28  stemTime ((VOID(
47c0: 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45  WINAPI*)(LPSYSTE
47d0: 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  MTIME))aSyscall[
47e0: 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  29].pCurrent)..#
47f0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4800: 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74  NCE.  { "GetSyst
4810: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
4820: 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53  ", (SYSCALL)GetS
4830: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
4840: 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ime, 0 },.#else.
4850: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69    { "GetSystemTi
4860: 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28  meAsFileTime", (
4870: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
48a0: 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65  efine osGetSyste
48b0: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20  mTimeAsFileTime 
48c0: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
48d0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c   \.        LPFIL
48e0: 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  ETIME))aSyscall[
48f0: 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  30].pCurrent)..#
4900: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4910: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
4920: 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  ).  { "GetTempPa
4930: 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  thA",           
4940: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d   (SYSCALL)GetTem
4950: 70 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20  pPathA,         
4960: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4970: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22  { "GetTempPathA"
4980: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
4990: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
49b0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
49c0: 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74  ine osGetTempPat
49d0: 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  hA ((DWORD(WINAP
49e0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29  I*)(DWORD,LPSTR)
49f0: 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43  )aSyscall[31].pC
4a00: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4a10: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
4a20: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4a30: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4a40: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
4a50: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
4a60: 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50  SYSCALL)GetTempP
4a70: 61 74 68 57 2c 20 20 20 20 20 20 20 20 20 20 20  athW,           
4a80: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4a90: 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20  "GetTempPathW", 
4aa0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4ab0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4ad0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4ae0: 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57  e osGetTempPathW
4af0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
4b00: 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29  )(DWORD,LPWSTR))
4b10: 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75  aSyscall[32].pCu
4b20: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4b30: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
4b40: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c   "GetTickCount",
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4b60: 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e  CALL)GetTickCoun
4b70: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  t,            0 
4b80: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4b90: 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20  tTickCount",    
4ba0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4bb0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4bc0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4bd0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4be0: 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28  sGetTickCount ((
4bf0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56  DWORD(WINAPI*)(V
4c00: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33  OID))aSyscall[33
4c10: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4c20: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4c30: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
4c40: 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45    { "GetVersionE
4c50: 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  xA",           (
4c60: 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69  SYSCALL)GetVersi
4c70: 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20 20  onExA,          
4c80: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4c90: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c  "GetVersionExA",
4ca0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4cb0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4cd0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4ce0: 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78  e osGetVersionEx
4cf0: 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  A ((BOOL(WINAPI*
4d00: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  )( \.        LPO
4d10: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61  SVERSIONINFOA))a
4d20: 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72  Syscall[34].pCur
4d30: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
4d40: 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20  Alloc",         
4d50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
4d60: 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20  eapAlloc,       
4d70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
4d80: 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f  efine osHeapAllo
4d90: 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  c ((LPVOID(WINAP
4da0: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
4db0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
4dc0: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d  _T))aSyscall[35]
4dd0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4de0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
4df0: 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74 65  .  { "HeapCreate
4e00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4e10: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65  (SYSCALL)HeapCre
4e20: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
4e30: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4e40: 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20   "HeapCreate",  
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4e60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4e80: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4e90: 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65 20  ne osHeapCreate 
4ea0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
4eb0: 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20  )(DWORD,SIZE_T, 
4ec0: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
4ed0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70  ))aSyscall[36].p
4ee0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4ef0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
4f00: 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79 22   { "HeapDestroy"
4f10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4f20: 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74 72  YSCALL)HeapDestr
4f30: 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oy,             
4f40: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4f50: 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20  HeapDestroy",   
4f60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4f70: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4f90: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4fa0: 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20 28   osHeapDestroy (
4fb0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
4fc0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
4fd0: 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  37].pCurrent).. 
4fe0: 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20 20   { "HeapFree",  
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
5000: 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c  YSCALL)HeapFree,
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5030: 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28  HeapFree ((BOOL(
5040: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5050: 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53  DWORD,LPVOID))aS
5060: 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72  yscall[38].pCurr
5070: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52  ent)..  { "HeapR
5080: 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20  eAlloc",        
5090: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
50a0: 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20  apReAlloc,      
50b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
50c0: 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c  fine osHeapReAll
50d0: 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  oc ((LPVOID(WINA
50e0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
50f0: 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20  D,LPVOID, \.    
5100: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
5110: 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e  call[39].pCurren
5120: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a  t)..  { "HeapSiz
5130: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5140: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5150: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
5160: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5170: 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28  ne osHeapSize ((
5180: 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28  SIZE_T(WINAPI*)(
5190: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
51a0: 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29          LPCVOID)
51b0: 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43  )aSyscall[40].pC
51c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
51d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
51e0: 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65 22  { "HeapValidate"
51f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5200: 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61  SCALL)HeapValida
5210: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  te,            0
5220: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
5230: 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20  eapValidate",   
5240: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5250: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5260: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5270: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5280: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20 28  osHeapValidate (
5290: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
52a0: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20  ANDLE,DWORD, \. 
52b0: 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29         LPCVOID))
52c0: 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75  aSyscall[41].pCu
52d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
52e0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
52f0: 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64  _HAS_ANSI) && !d
5300: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5310: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
5320: 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  N).  { "LoadLibr
5330: 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20  aryA",          
5340: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c    (SYSCALL)LoadL
5350: 69 62 72 61 72 79 41 2c 20 20 20 20 20 20 20 20  ibraryA,        
5360: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5370: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41   { "LoadLibraryA
5380: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5390: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
53c0: 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61  fine osLoadLibra
53d0: 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49  ryA ((HMODULE(WI
53e0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
53f0: 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72  Syscall[42].pCur
5400: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5410: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
5420: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5430: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26  N32_HAS_WIDE) &&
5440: 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69   \.        !defi
5450: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5460: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
5470: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
5480: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
5490: 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72  SYSCALL)LoadLibr
54a0: 61 72 79 57 2c 20 20 20 20 20 20 20 20 20 20 20  aryW,           
54b0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
54c0: 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20  "LoadLibraryW", 
54d0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
54e0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5500: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5510: 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  e osLoadLibraryW
5520: 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50   ((HMODULE(WINAP
5530: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
5540: 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65  scall[43].pCurre
5550: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5560: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c  _OS_WINRT.  { "L
5570: 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20  ocalFree",      
5580: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5590: 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20  L)LocalFree,    
55a0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
55b0: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61 6c  #else.  { "Local
55c0: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
55d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5600: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
5610: 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c  calFree ((HLOCAL
5620: 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c  (WINAPI*)(HLOCAL
5630: 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70  ))aSyscall[44].p
5640: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5650: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
5660: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
5670: 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  RT.  { "LockFile
5680: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5690: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46    (SYSCALL)LockF
56a0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
56b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
56c0: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
56e0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0 },.#endif..#if
5710: 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a  ndef osLockFile.
5720: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69  #define osLockFi
5730: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
5740: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
5750: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
5760: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
5770: 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72  yscall[45].pCurr
5780: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
5790: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
57a0: 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45  E.  { "LockFileE
57b0: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  x",             
57c0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69   (SYSCALL)LockFi
57d0: 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20  leEx,           
57e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
57f0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  { "LockFileEx", 
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5810: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5830: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
5840: 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78  def osLockFileEx
5850: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46  .#define osLockF
5860: 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  ileEx ((BOOL(WIN
5870: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
5880: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  RD,DWORD,DWORD,D
5890: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
58a0: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
58b0: 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72  yscall[46].pCurr
58c0: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
58d0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
58e0: 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f   || (!SQLITE_OS_
58f0: 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
5900: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
5910: 4c 29 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77  L)).  { "MapView
5920: 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  OfFile",        
5930: 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56     (SYSCALL)MapV
5940: 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20  iewOfFile,      
5950: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5960: 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69    { "MapViewOfFi
5970: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  le",           (
5980: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
59b0: 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f  efine osMapViewO
59c0: 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28 57  fFile ((LPVOID(W
59d0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
59e0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
59f0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
5a00: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d  _T))aSyscall[47]
5a10: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5a20: 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  "MultiByteToWide
5a30: 43 68 61 72 22 2c 20 20 20 20 20 28 53 59 53 43  Char",     (SYSC
5a40: 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f 57  ALL)MultiByteToW
5a50: 69 64 65 43 68 61 72 2c 20 20 20 20 20 30 20 7d  ideChar,     0 }
5a60: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c  ,..#define osMul
5a70: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
5a80: 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28   ((int(WINAPI*)(
5a90: 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54  UINT,DWORD,LPCST
5aa0: 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a  R,int,LPWSTR, \.
5ab0: 20 20 20 20 20 20 20 20 69 6e 74 29 29 61 53 79          int))aSy
5ac0: 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65  scall[48].pCurre
5ad0: 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79 50  nt)..  { "QueryP
5ae0: 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
5af0: 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 65  r", (SYSCALL)Que
5b00: 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
5b10: 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66  nter, 0 },..#def
5b20: 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66 6f  ine osQueryPerfo
5b30: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 28  rmanceCounter ((
5b40: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c  BOOL(WINAPI*)( \
5b50: 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f 49  .        LARGE_I
5b60: 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63 61 6c  NTEGER*))aSyscal
5b70: 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[49].pCurrent).
5b80: 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22 2c  .  { "ReadFile",
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69 6c  (SYSCALL)ReadFil
5bb0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
5bc0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5bd0: 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f 4f  osReadFile ((BOO
5be0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
5bf0: 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c  E,LPVOID,DWORD,L
5c00: 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  PDWORD, \.      
5c10: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
5c20: 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75  aSyscall[50].pCu
5c30: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74  rrent)..  { "Set
5c40: 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  EndOfFile",     
5c50: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5c60: 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20  SetEndOfFile,   
5c70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
5c80: 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f  define osSetEndO
5c90: 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  fFile ((BOOL(WIN
5ca0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
5cb0: 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72  yscall[51].pCurr
5cc0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5cd0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
5ce0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c  SetFilePointer",
5cf0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5d00: 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  LL)SetFilePointe
5d10: 72 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  r,          0 },
5d20: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46  .#else.  { "SetF
5d30: 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20  ilePointer",    
5d40: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5d50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5d60: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5d70: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53  dif..#define osS
5d80: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 28  etFilePointer ((
5d90: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48  DWORD(WINAPI*)(H
5da0: 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47  ANDLE,LONG,PLONG
5db0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
5dc0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e  D))aSyscall[52].
5dd0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5de0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
5df0: 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20    { "Sleep",    
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5e10: 53 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20  SYSCALL)Sleep,  
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e30: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5e40: 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20  "Sleep",        
5e50: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5e60: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5e80: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5e90: 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f 49 44  e osSleep ((VOID
5ea0: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 29  (WINAPI*)(DWORD)
5eb0: 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43  )aSyscall[53].pC
5ec0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79  urrent)..  { "Sy
5ed0: 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
5ee0: 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  me",    (SYSCALL
5ef0: 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c  )SystemTimeToFil
5f00: 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a  eTime,    0 },..
5f10: 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74 65 6d  #define osSystem
5f20: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20 28  TimeToFileTime (
5f30: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43  (BOOL(WINAPI*)(C
5f40: 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d 45 2a  ONST SYSTEMTIME*
5f50: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  , \.        LPFI
5f60: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
5f70: 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [54].pCurrent)..
5f80: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5f90: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
5fa0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55 6e  OS_WINRT.  { "Un
5fb0: 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  lockFile",      
5fc0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5fd0: 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20  )UnlockFile,    
5fe0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5ff0: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  else.  { "Unlock
6000: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
6010: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6030: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6040: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e 6c  f..#ifndef osUnl
6050: 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20  ockFile.#define 
6060: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42  osUnlockFile ((B
6070: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6080: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
6090: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
60a0: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
60b0: 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  [55].pCurrent).#
60c0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49  endif..#if !SQLI
60d0: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20  TE_OS_WINCE.  { 
60e0: 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  "UnlockFileEx", 
60f0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6100: 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  ALL)UnlockFileEx
6110: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
6120: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c  ,.#else.  { "Unl
6130: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
6140: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6150: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6160: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6170: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6180: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42  UnlockFileEx ((B
6190: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
61a0: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
61b0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
61c0: 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61   LPOVERLAPPED))a
61d0: 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72  Syscall[56].pCur
61e0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
61f0: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21 64  E_OS_WINCE || !d
6200: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6210: 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 55 6e 6d  IT_WAL).  { "Unm
6220: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
6230: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6240: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  UnmapViewOfFile,
6250: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6260: 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69  lse.  { "UnmapVi
6270: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
6280: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
62b0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61  ..#define osUnma
62c0: 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f  pViewOfFile ((BO
62d0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56  OL(WINAPI*)(LPCV
62e0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37  OID))aSyscall[57
62f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6300: 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74   "WideCharToMult
6310: 69 42 79 74 65 22 2c 20 20 20 20 20 28 53 59 53  iByte",     (SYS
6320: 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d  CALL)WideCharToM
6330: 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30 20  ultiByte,     0 
6340: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69  },..#define osWi
6350: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
6360: 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  e ((int(WINAPI*)
6370: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57  (UINT,DWORD,LPCW
6380: 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e  STR,int,LPSTR,in
6390: 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  t, \.        LPC
63a0: 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73  STR,LPBOOL))aSys
63b0: 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e  call[58].pCurren
63c0: 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69  t)..  { "WriteFi
63d0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
63e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74     (SYSCALL)Writ
63f0: 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  eFile,          
6400: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6410: 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28  ne osWriteFile (
6420: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6430: 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57  ANDLE,LPCVOID,DW
6440: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
6450: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
6460: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39  PED))aSyscall[59
6470: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6480: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
6490: 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e  .  { "CreateEven
64a0: 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  tExW",          
64b0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 45  (SYSCALL)CreateE
64c0: 76 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20 20  ventExW,        
64d0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
64e0: 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57   "CreateEventExW
64f0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
6500: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6520: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6530: 6e 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74  ne osCreateEvent
6540: 45 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ExW ((HANDLE(WIN
6550: 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59  API*)(LPSECURITY
6560: 5f 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43 57  _ATTRIBUTES,LPCW
6570: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
6580: 57 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79 73  WORD,DWORD))aSys
6590: 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e  call[60].pCurren
65a0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
65b0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61  OS_WINRT.  { "Wa
65c0: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
65d0: 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  t",     (SYSCALL
65e0: 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  )WaitForSingleOb
65f0: 6a 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a 23  ject,     0 },.#
6600: 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f  else.  { "WaitFo
6610: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20  rSingleObject", 
6620: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6650: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69  f..#define osWai
6660: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
6670: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
6680: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
6690: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
66a0: 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74  all[61].pCurrent
66b0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
66c0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 74  _WINRT.  { "Wait
66d0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
66e0: 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 57  x",   (SYSCALL)W
66f0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
6700: 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65 6c  ctEx,   0 },.#el
6710: 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53  se.  { "WaitForS
6720: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20  ingleObjectEx", 
6730: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6750: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6760: 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46  .#define osWaitF
6770: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
6780: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
6790: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
67a0: 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29 29  \.        BOOL))
67b0: 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75  aSyscall[62].pCu
67c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
67d0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
67e0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  "SetFilePointerE
67f0: 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  x",        (SYSC
6800: 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74  ALL)SetFilePoint
6810: 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20 7d  erEx,        0 }
6820: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74  ,.#else.  { "Set
6830: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20  FilePointerEx", 
6840: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6850: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6860: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6870: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6880: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
6890: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
68a0: 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e  (HANDLE,LARGE_IN
68b0: 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20 20  TEGER, \.       
68c0: 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c   PLARGE_INTEGER,
68d0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
68e0: 36 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  63].pCurrent)..#
68f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
6900: 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49  RT.  { "GetFileI
6910: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
6920: 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29  leEx", (SYSCALL)
6930: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
6940: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30 20  onByHandleEx, 0 
6950: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
6960: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
6970: 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59  ByHandleEx", (SY
6980: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6990: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
69a0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
69b0: 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  sGetFileInformat
69c0: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28 28  ionByHandleEx ((
69d0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
69e0: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
69f0: 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e  FILE_INFO_BY_HAN
6a00: 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44  DLE_CLASS,LPVOID
6a10: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
6a20: 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [64].pCurrent)..
6a30: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
6a40: 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
6a50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
6a60: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46  .  { "MapViewOfF
6a70: 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20  ileFromApp",    
6a80: 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77  (SYSCALL)MapView
6a90: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 2c 20 20  OfFileFromApp,  
6aa0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6ab0: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46   "MapViewOfFileF
6ac0: 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53  romApp",    (SYS
6ad0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6af0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6b00: 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69  ne osMapViewOfFi
6b10: 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c 50 56 4f  leFromApp ((LPVO
6b20: 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  ID(WINAPI*)(HAND
6b30: 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34  LE,ULONG,ULONG64
6b40: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
6b50: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d  _T))aSyscall[65]
6b60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6b70: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6b80: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32    { "CreateFile2
6b90: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
6ba0: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
6bb0: 6c 65 32 2c 20 20 20 20 20 20 20 20 20 20 20 20  le2,            
6bc0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6bd0: 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20  "CreateFile2",  
6be0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6bf0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6c10: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6c20: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32 20  e osCreateFile2 
6c30: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
6c40: 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c  )(LPCWSTR,DWORD,
6c50: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
6c60: 20 20 20 20 20 20 20 4c 50 43 52 45 41 54 45 46         LPCREATEF
6c70: 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41  ILE2_EXTENDED_PA
6c80: 52 41 4d 45 54 45 52 53 29 29 61 53 79 73 63 61  RAMETERS))aSysca
6c90: 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[66].pCurrent)
6ca0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
6cb0: 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
6cc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
6cd0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
6ce0: 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c  { "LoadPackagedL
6cf0: 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 59  ibrary",     (SY
6d00: 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 67  SCALL)LoadPackag
6d10: 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20 20 30  edLibrary,     0
6d20: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
6d30: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
6d40: 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ry",     (SYSCAL
6d50: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6d60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6d70: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6d80: 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69  osLoadPackagedLi
6d90: 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c 45 28  brary ((HMODULE(
6da0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
6db0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
6dc0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e  D))aSyscall[67].
6dd0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
6de0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6df0: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
6e00: 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  64",          (S
6e10: 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f  YSCALL)GetTickCo
6e20: 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20 20 20  unt64,          
6e30: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6e40: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c  GetTickCount64",
6e50: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6e60: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6e80: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6e90: 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36   osGetTickCount6
6ea0: 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49  4 ((ULONGLONG(WI
6eb0: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
6ec0: 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65  scall[68].pCurre
6ed0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
6ee0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65  OS_WINRT.  { "Ge
6ef0: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
6f00: 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  o",     (SYSCALL
6f10: 29 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  )GetNativeSystem
6f20: 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a 23  Info,     0 },.#
6f30: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e 61 74  else.  { "GetNat
6f40: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  iveSystemInfo", 
6f50: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f70: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6f80: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
6f90: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
6fa0: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
6fb0: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59  ( \.        LPSY
6fc0: 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63  STEM_INFO))aSysc
6fd0: 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74  all[69].pCurrent
6fe0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
6ff0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
7000: 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74 70 75  ANSI).  { "Outpu
7010: 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20  tDebugStringA", 
7020: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75       (SYSCALL)Ou
7030: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
7040: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
7050: 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  e.  { "OutputDeb
7060: 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20  ugStringA",     
7070: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
70a0: 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74  #define osOutput
70b0: 44 65 62 75 67 53 74 72 69 6e 67 41 20 28 28 56  DebugStringA ((V
70c0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OID(WINAPI*)(LPC
70d0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 30  STR))aSyscall[70
70e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
70f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
7100: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
7110: 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67    { "OutputDebug
7120: 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28  StringW",      (
7130: 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65  SYSCALL)OutputDe
7140: 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20 20 20  bugStringW,     
7150: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7160: 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  "OutputDebugStri
7170: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
7180: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
71a0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
71b0: 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53  e osOutputDebugS
71c0: 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28 57 49  tringW ((VOID(WI
71d0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
71e0: 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75  aSyscall[71].pCu
71f0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
7200: 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20 20 20  ProcessHeap",   
7210: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7220: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 2c 20  GetProcessHeap, 
7230: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
7240: 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63  define osGetProc
7250: 65 73 73 48 65 61 70 20 28 28 48 41 4e 44 4c 45  essHeap ((HANDLE
7260: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
7270: 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75  aSyscall[72].pCu
7280: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7290: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
72a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
72b0: 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43 72  MIT_WAL).  { "Cr
72c0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
72d0: 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c  romApp", (SYSCAL
72e0: 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  L)CreateFileMapp
72f0: 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c  ingFromApp, 0 },
7300: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
7310: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
7320: 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29  mApp", (SYSCALL)
7330: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7340: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
7350: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
7360: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
7370: 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c 45  FromApp ((HANDLE
7380: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7390: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
73a0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
73b0: 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c  S,ULONG,ULONG64,
73c0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
73d0: 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[73].pCurrent).
73e0: 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68  .}; /* End of th
73f0: 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  e overrideable s
7400: 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a  ystem calls */..
7410: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
7420: 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  e xSetSystemCall
7430: 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c  () method of sql
7440: 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c  ite3_vfs for all
7450: 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33   of the.** "win3
7460: 32 22 20 56 46 53 65 73 2e 20 20 52 65 74 75 72  2" VFSes.  Retur
7470: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e  n SQLITE_OK opon
7480: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70   successfully up
7490: 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79  dating the.** sy
74a0: 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65  stem call pointe
74b0: 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54  r, or SQLITE_NOT
74c0: 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20 69  FOUND if there i
74d0: 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c  s no configurabl
74e0: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
74f0: 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f   named zName..*/
7500: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
7510: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
7520: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
7530: 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a  tUsed,        /*
7540: 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72   The VFS pointer
7550: 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  .  Not used */. 
7560: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
7570: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  me,            /
7580: 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d  * Name of system
7590: 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64   call to overrid
75a0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
75b0: 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46  yscall_ptr pNewF
75c0: 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  unc  /* Pointer 
75d0: 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61  to new system ca
75e0: 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20  ll value */.){. 
75f0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
7600: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
7610: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20  TE_NOTFOUND;..  
7620: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
7630: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  (pNotUsed);.  if
7640: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
7650: 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65    /* If no zName
7660: 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f   is given, resto
7670: 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61  re all system ca
7680: 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66  lls to their def
7690: 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74  ault.    ** sett
76a0: 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ings and return 
76b0: 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20  NULL.    */.    
76c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
76d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
76e0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
76f0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
7700: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
7710: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
7720: 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  .pDefault ){.   
7730: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
7740: 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73  .pCurrent = aSys
7750: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
7760: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7770: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
7780: 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63  If zName is spec
7790: 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f  ified, operate o
77a0: 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73  n only the one s
77b0: 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a  ystem call.    *
77c0: 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20  * specified..   
77d0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
77e0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
77f0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
7800: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
7810: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
7820: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
7830: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
7840: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73          if( aSys
7850: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
7860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7870: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
7880: 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c  fault = aSyscall
7890: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
78a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
78b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
78c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
78d0: 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75  Func==0 ) pNewFu
78e0: 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nc = aSyscall[i]
78f0: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
7900: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
7910: 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75  Current = pNewFu
7920: 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  nc;.        brea
7930: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
7940: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
7950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7960: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  n the value of a
7970: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
7980: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
7990: 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ame is not a.** 
79a0: 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65  recognized syste
79b0: 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55  m call name.  NU
79c0: 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  LL is also retur
79d0: 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65  ned if the syste
79e0: 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72  m call.** is cur
79f0: 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64  rently undefined
7a00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
7a10: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
7a20: 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
7a30: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
7a40: 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e  *pNotUsed,.  con
7a50: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
7a60: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
7a70: 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
7a80: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
7a90: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
7aa0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
7ab0: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
7ac0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
7ad0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
7ae0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
7af0: 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
7b00: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
7b10: 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrent;.  }.  ret
7b20: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7b30: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
7b40: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
7b50: 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a  tem call after z
7b60: 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d  Name.  If zName=
7b70: 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65  =NULL.** then re
7b80: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
7b90: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
7ba0: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
7bb0: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a  NULL if zName.**
7bc0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73   is the last sys
7bd0: 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a  tem call or if z
7be0: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Name is not the 
7bf0: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a  name of a valid.
7c00: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  ** system call..
7c10: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
7c20: 63 68 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73  char *winNextSys
7c30: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
7c40: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
7c50: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
7c60: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
7c70: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
7c80: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
7c90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7ca0: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
7cb0: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
7cc0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
7cd0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
7ce0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
7cf0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
7d00: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
7d10: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
7d20: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
7d30: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
7d40: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
7d50: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
7d60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
7d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
7d80: 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73  function outputs
7d90: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 28   the specified (
7da0: 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20  ANSI) string to 
7db0: 74 68 65 20 57 69 6e 33 32 20 64 65 62 75 67 67  the Win32 debugg
7dc0: 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61  er.** (if availa
7dd0: 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73  ble)..*/..void s
7de0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69  qlite3_win32_wri
7df0: 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74 20 63  te_debug(const c
7e00: 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e  har *zBuf, int n
7e10: 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a 44 62  Buf){.  char zDb
7e20: 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33  gBuf[SQLITE_WIN3
7e30: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b  2_DBG_BUF_SIZE];
7e40: 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49  .  int nMin = MI
7e50: 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54 45 5f  N(nBuf, (SQLITE_
7e60: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
7e70: 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79  ZE - 1)); /* may
7e80: 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f   be negative. */
7e90: 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29  .  if( nMin<-1 )
7ea0: 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61   nMin = -1; /* a
7eb0: 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75  ll negative valu
7ec0: 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f  es become -1. */
7ed0: 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d  .  assert( nMin=
7ee0: 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c  =-1 || nMin==0 |
7ef0: 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49  | nMin<SQLITE_WI
7f00: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
7f10: 20 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   );.#if defined(
7f20: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
7f30: 5f 41 4e 53 49 29 0a 20 20 69 66 28 20 6e 4d 69  _ANSI).  if( nMi
7f40: 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  n>0 ){.    memse
7f50: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
7f60: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
7f70: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65  UF_SIZE);.    me
7f80: 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42  mcpy(zDbgBuf, zB
7f90: 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f  uf, nMin);.    o
7fa0: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
7fb0: 6e 67 41 28 7a 44 62 67 42 75 66 29 3b 0a 20 20  ngA(zDbgBuf);.  
7fc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74  }else{.    osOut
7fd0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 28  putDebugStringA(
7fe0: 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66  zBuf);.  }.#elif
7ff0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
8000: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
8010: 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66    memset(zDbgBuf
8020: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  , 0, SQLITE_WIN3
8030: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b  2_DBG_BUF_SIZE);
8040: 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c 74 69 42  .  if ( osMultiB
8050: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 0a 20  yteToWideChar(. 
8060: 20 20 20 20 20 20 20 20 20 6f 73 41 72 65 46 69           osAreFi
8070: 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43  leApisANSI() ? C
8080: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
8090: 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20  , 0, zBuf,.     
80a0: 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53       nMin, (LPWS
80b0: 54 52 29 7a 44 62 67 42 75 66 2c 20 53 51 4c 49  TR)zDbgBuf, SQLI
80c0: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
80d0: 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48  _SIZE/sizeof(WCH
80e0: 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72  AR))<=0 ){.    r
80f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f  eturn;.  }.  osO
8100: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
8110: 57 28 28 4c 50 43 57 53 54 52 29 7a 44 62 67 42  W((LPCWSTR)zDbgB
8120: 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  uf);.#else.  if(
8130: 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d   nMin>0 ){.    m
8140: 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30  emset(zDbgBuf, 0
8150: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
8160: 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20  BG_BUF_SIZE);.  
8170: 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66    memcpy(zDbgBuf
8180: 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20  , zBuf, nMin);. 
8190: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
81a0: 72 2c 20 22 25 73 22 2c 20 7a 44 62 67 42 75 66  r, "%s", zDbgBuf
81b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
81c0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
81d0: 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d  "%s", zBuf);.  }
81e0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
81f0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
8200: 6f 75 74 69 6e 65 20 73 75 73 70 65 6e 64 73 20  outine suspends 
8210: 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
8220: 61 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  ad for at least 
8230: 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e  ms.** millisecon
8240: 64 73 2e 20 20 54 68 69 73 20 69 73 20 65 71 75  ds.  This is equ
8250: 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 57  ivalent to the W
8260: 69 6e 33 32 20 53 6c 65 65 70 28 29 20 69 6e 74  in32 Sleep() int
8270: 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53  erface..*/.#if S
8280: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73  QLITE_OS_WINRT.s
8290: 74 61 74 69 63 20 48 41 4e 44 4c 45 20 73 6c 65  tatic HANDLE sle
82a0: 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65  epObj = NULL;.#e
82b0: 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74  ndif..void sqlit
82c0: 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 44  e3_win32_sleep(D
82d0: 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  WORD millisecond
82e0: 73 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  s){.#if SQLITE_O
82f0: 53 5f 57 49 4e 52 54 0a 20 20 69 66 20 28 20 73  S_WINRT.  if ( s
8300: 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b  leepObj==NULL ){
8310: 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20  .    sleepObj = 
8320: 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45 78 57  osCreateEventExW
8330: 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45  (NULL, NULL, CRE
8340: 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c  ATE_EVENT_MANUAL
8350: 5f 52 45 53 45 54 2c 0a 20 20 20 20 20 20 20 20  _RESET,.        
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 20 20 20 20 20 20 20 20 53 59 4e 43 48 52 4f 4e          SYNCHRON
8380: 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  IZE);.  }.  asse
8390: 72 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55  rt( sleepObj!=NU
83a0: 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f  LL );.  osWaitFo
83b0: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28  rSingleObjectEx(
83c0: 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73  sleepObj, millis
83d0: 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a  econds, FALSE);.
83e0: 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65 70 28  #else.  osSleep(
83f0: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23  milliseconds);.#
8400: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
8410: 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d  eturn true (non-
8420: 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20  zero) if we are 
8430: 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69  running under Wi
8440: 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58  nNT, Win2K, WinX
8450: 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20  P,.** or WinCE. 
8460: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a   Return false (z
8470: 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20  ero) for Win95, 
8480: 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e  Win98, or WinME.
8490: 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61  .**.** Here is a
84a0: 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62  n interesting ob
84b0: 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39  servation:  Win9
84c0: 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69  5, Win98, and Wi
84d0: 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20  nME lack.** the 
84e0: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
84f0: 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74  .  But we can st
8500: 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  ill statically l
8510: 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74  ink against that
8520: 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20  .** API as long 
8530: 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c  as we don't call
8540: 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67   it when running
8550: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41   Win95/98/ME.  A
8560: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73   call to.** this
8570: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
8580: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
8590: 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e   the host is Win
85a0: 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57  95/98/ME or.** W
85b0: 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68  inNT/2K/XP so th
85c0: 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  at we will know 
85d0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77  whether or not w
85e0: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c  e can safely cal
85f0: 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  l.** the LockFil
8600: 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69  eEx() API..*/.#i
8610: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
8620: 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  E || SQLITE_OS_W
8630: 49 4e 52 54 0a 23 20 64 65 66 69 6e 65 20 69 73  INRT.# define is
8640: 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20  NT()  (1).#elif 
8650: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
8660: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
8670: 23 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29 20  # define isNT() 
8680: 20 28 30 29 0a 23 65 6c 73 65 0a 20 20 73 74 61   (0).#else.  sta
8690: 74 69 63 20 69 6e 74 20 69 73 4e 54 28 76 6f 69  tic int isNT(voi
86a0: 64 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  d){.    if( sqli
86b0: 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29  te3_os_type==0 )
86c0: 7b 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49 4f  {.      OSVERSIO
86d0: 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20  NINFOA sInfo;.  
86e0: 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65      sInfo.dwOSVe
86f0: 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20  rsionInfoSize = 
8700: 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20  sizeof(sInfo);. 
8710: 20 20 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f       osGetVersio
8720: 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20  nExA(&sInfo);.  
8730: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74      sqlite3_os_t
8740: 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c  ype = sInfo.dwPl
8750: 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c  atformId==VER_PL
8760: 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20  ATFORM_WIN32_NT 
8770: 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20  ? 2 : 1;.    }. 
8780: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
8790: 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20 20  3_os_type==2;.  
87a0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
87b0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
87c0: 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  LLOC./*.** Alloc
87d0: 61 74 65 20 6e 42 79 74 65 73 20 6f 66 20 6d 65  ate nBytes of me
87e0: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
87f0: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c  void *winMemMall
8800: 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a  oc(int nBytes){.
8810: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
8820: 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69    void *p;..  wi
8830: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
8840: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
8850: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
8860: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
8870: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
8880: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
8890: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
88a0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
88b0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
88c0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
88d0: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
88e0: 65 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69  ert ( osHeapVali
88f0: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
8900: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
8910: 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65  AGS, NULL) );.#e
8920: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e  ndif.  assert( n
8930: 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20  Bytes>=0 );.  p 
8940: 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48  = osHeapAlloc(hH
8950: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
8960: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53  2_HEAP_FLAGS, (S
8970: 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20  IZE_T)nBytes);. 
8980: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73   if( !p ){.    s
8990: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
89a0: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
89b0: 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75   to HeapAlloc %u
89c0: 20 62 79 74 65 73 20 28 25 64 29 2c 20 68 65 61   bytes (%d), hea
89d0: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
89e0: 20 20 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f         nBytes, o
89f0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
8a00: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
8a10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
8a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65  }../*.** Free me
8a30: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
8a40: 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28  void winMemFree(
8a50: 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20  void *pPrior){. 
8a60: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a   HANDLE hHeap;..
8a70: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
8a80: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
8a90: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
8aa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
8ab0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
8ac0: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
8ad0: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
8ae0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
8af0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
8b00: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
8b10: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
8b20: 20 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70   assert ( osHeap
8b30: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
8b40: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
8b50: 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29  P_FLAGS, pPrior)
8b60: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   );.#endif.  if(
8b70: 20 21 70 50 72 69 6f 72 20 29 20 72 65 74 75 72   !pPrior ) retur
8b80: 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20 4e 55  n; /* Passing NU
8b90: 4c 4c 20 74 6f 20 48 65 61 70 46 72 65 65 20 69  LL to HeapFree i
8ba0: 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a 2f 0a  s undefined. */.
8bb0: 20 20 69 66 28 20 21 6f 73 48 65 61 70 46 72 65    if( !osHeapFre
8bc0: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
8bd0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
8be0: 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20  , pPrior) ){.   
8bf0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
8c00: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
8c10: 65 64 20 74 6f 20 48 65 61 70 46 72 65 65 20 62  ed to HeapFree b
8c20: 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c 20 68 65  lock %p (%d), he
8c30: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
8c40: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20          pPrior, 
8c50: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
8c60: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
8c70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
8c80: 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ange the size of
8c90: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d   an existing mem
8ca0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
8cb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
8cc0: 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69  inMemRealloc(voi
8cd0: 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e  d *pPrior, int n
8ce0: 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45  Bytes){.  HANDLE
8cf0: 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a   hHeap;.  void *
8d00: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
8d10: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
8d20: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
8d30: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
8d40: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
8d50: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
8d60: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
8d70: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
8d80: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
8d90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
8da0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
8db0: 45 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73  E).  assert ( os
8dc0: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
8dd0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
8de0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
8df0: 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ior) );.#endif. 
8e00: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e   assert( nBytes>
8e10: 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72  =0 );.  if( !pPr
8e20: 69 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f  ior ){.    p = o
8e30: 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70  sHeapAlloc(hHeap
8e40: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
8e50: 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45  EAP_FLAGS, (SIZE
8e60: 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65  _T)nBytes);.  }e
8e70: 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48  lse{.    p = osH
8e80: 65 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70  eapReAlloc(hHeap
8e90: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
8ea0: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
8eb0: 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  r, (SIZE_T)nByte
8ec0: 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  s);.  }.  if( !p
8ed0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8ee0: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
8ef0: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20  , "failed to %s 
8f00: 25 75 20 62 79 74 65 73 20 28 25 64 29 2c 20 68  %u bytes (%d), h
8f10: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
8f20: 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20           pPrior 
8f30: 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20  ? "HeapReAlloc" 
8f40: 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e  : "HeapAlloc", n
8f50: 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74  Bytes, osGetLast
8f60: 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
8f70: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
8f80: 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65  hHeap);.  }.  re
8f90: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
8fa0: 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
8fb0: 20 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69   of an outstandi
8fc0: 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  ng allocation, i
8fd0: 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  n bytes..*/.stat
8fe0: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a  ic int winMemSiz
8ff0: 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41  e(void *p){.  HA
9000: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53 49  NDLE hHeap;.  SI
9010: 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65  ZE_T n;..  winMe
9020: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
9030: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
9040: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
9050: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
9060: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
9070: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
9080: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
9090: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
90a0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
90b0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
90c0: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
90d0: 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74   ( osHeapValidat
90e0: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
90f0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
9100: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
9110: 66 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  f.  if( !p ) ret
9120: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48  urn 0;.  n = osH
9130: 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53  eapSize(hHeap, S
9140: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
9150: 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66  _FLAGS, p);.  if
9160: 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20  ( n==(SIZE_T)-1 
9170: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
9180: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
9190: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
91a0: 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25  Size block %p (%
91b0: 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  d), heap=%p",.  
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
91d0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
91e0: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29  ), (void*)hHeap)
91f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
9200: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
9210: 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  t)n;.}../*.** Ro
9220: 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74  und up a request
9230: 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78   size to the nex
9240: 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69  t valid allocati
9250: 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  on size..*/.stat
9260: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75  ic int winMemRou
9270: 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72  ndup(int n){.  r
9280: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
9290: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
92a0: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
92b0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e  tic int winMemIn
92c0: 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  it(void *pAppDat
92d0: 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61  a){.  winMemData
92e0: 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20   *pWinMemData = 
92f0: 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41  (winMemData *)pA
9300: 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21  ppData;..  if( !
9310: 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65  pWinMemData ) re
9320: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
9330: 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  R;.  assert( pWi
9340: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d  nMemData->magic=
9350: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b  =WINMEM_MAGIC );
9360: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
9370: 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45  _WINRT && SQLITE
9380: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41  _WIN32_HEAP_CREA
9390: 54 45 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  TE.  if( !pWinMe
93a0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a  mData->hHeap ){.
93b0: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
93c0: 3e 68 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43  >hHeap = osHeapC
93d0: 72 65 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e  reate(SQLITE_WIN
93e0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20  32_HEAP_FLAGS,. 
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9410: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
9420: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
9430: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9450: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
9460: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
9470: 5a 45 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57  ZE);.    if( !pW
9480: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
9490: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
94a0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
94b0: 45 4d 2c 0a 20 20 20 20 20 20 20 20 20 20 22 66  EM,.          "f
94c0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65  ailed to HeapCre
94d0: 61 74 65 20 28 25 64 29 2c 20 66 6c 61 67 73 3d  ate (%d), flags=
94e0: 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c  %u, initSize=%u,
94f0: 20 6d 61 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20   maxSize=%u",.  
9500: 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
9510: 74 45 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45  tError(), SQLITE
9520: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
9530: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  S,.          SQL
9540: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
9550: 4e 49 54 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45  NIT_SIZE, SQLITE
9560: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
9570: 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 65 74  SIZE);.      ret
9580: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9590: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e  ;.    }.    pWin
95a0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
95b0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 61 73 73 65  = TRUE;.    asse
95c0: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
95d0: 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23  >bOwned );.  }.#
95e0: 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61  else.  pWinMemDa
95f0: 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47 65  ta->hHeap = osGe
9600: 74 50 72 6f 63 65 73 73 48 65 61 70 28 29 3b 0a  tProcessHeap();.
9610: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
9620: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
9630: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
9640: 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20  ITE_NOMEM,.     
9650: 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 47 65     "failed to Ge
9660: 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 25 64  tProcessHeap (%d
9670: 29 22 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  )", osGetLastErr
9680: 6f 72 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72  or());.    retur
9690: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
96a0: 20 20 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74    }.  pWinMemDat
96b0: 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53  a->bOwned = FALS
96c0: 45 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 57  E;.  assert( !pW
96d0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
96e0: 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  d );.#endif.  as
96f0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
9700: 61 2d 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  a->hHeap!=0 );. 
9710: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
9720: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56  Data->hHeap!=INV
9730: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
9740: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
9750: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
9760: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
9770: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
9780: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
9790: 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e  eapValidate(pWin
97a0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20  MemData->hHeap, 
97b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
97c0: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
97d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
97e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
97f0: 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69  /*.** Deinitiali
9800: 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  ze this module..
9810: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
9820: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f  inMemShutdown(vo
9830: 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20  id *pAppData){. 
9840: 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69   winMemData *pWi
9850: 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d  nMemData = (winM
9860: 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74  emData *)pAppDat
9870: 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d  a;..  if( !pWinM
9880: 65 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 3b  emData ) return;
9890: 0a 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61  .  if( pWinMemDa
98a0: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
98b0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
98c0: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56  Data->hHeap!=INV
98d0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
98e0: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
98f0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
9900: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
9910: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
9920: 45 29 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  E).    assert( o
9930: 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57  sHeapValidate(pW
9940: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
9950: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
9960: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29  EAP_FLAGS, NULL)
9970: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69   );.#endif.    i
9980: 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  f( pWinMemData->
9990: 62 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20  bOwned ){.      
99a0: 69 66 28 20 21 6f 73 48 65 61 70 44 65 73 74 72  if( !osHeapDestr
99b0: 6f 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  oy(pWinMemData->
99c0: 68 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20  hHeap) ){.      
99d0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
99e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
99f0: 6c 65 64 20 74 6f 20 48 65 61 70 44 65 73 74 72  led to HeapDestr
9a00: 6f 79 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  oy (%d), heap=%p
9a10: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
9a20: 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74         osGetLast
9a30: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
9a40: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
9a50: 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ap);.      }.   
9a60: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
9a70: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
9a80: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
9a90: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e  mData->hHeap = N
9aa0: 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ULL;.  }.}../*.*
9ab0: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c  * Populate the l
9ac0: 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20  ow-level memory 
9ad0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74  allocation funct
9ae0: 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a  ion pointers in.
9af0: 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ** sqlite3Global
9b00: 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f  Config.m with po
9b10: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f  inters to the ro
9b20: 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66  utines in this f
9b30: 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75  ile. The.** argu
9b40: 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68  ments specify th
9b50: 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
9b60: 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a  y to manage..**.
9b70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9b80: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
9b90: 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  y sqlite3_config
9ba0: 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72  (), and therefor
9bb0: 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75  e.** is not requ
9bc0: 69 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61  ired to be threa
9bd0: 64 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74  dsafe (it is not
9be0: 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69  )..*/.const sqli
9bf0: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
9c00: 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69  *sqlite3MemGetWi
9c10: 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  n32(void){.  sta
9c20: 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
9c30: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69  3_mem_methods wi
9c40: 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a  nMemMethods = {.
9c50: 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63      winMemMalloc
9c60: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65  ,.    winMemFree
9c70: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c  ,.    winMemReal
9c80: 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53  loc,.    winMemS
9c90: 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52  ize,.    winMemR
9ca0: 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d  oundup,.    winM
9cb0: 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d  emInit,.    winM
9cc0: 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20  emShutdown,.    
9cd0: 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20  &win_mem_data.  
9ce0: 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e  };.  return &win
9cf0: 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76  MemMethods;.}..v
9d00: 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65  oid sqlite3MemSe
9d10: 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a  tDefault(void){.
9d20: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
9d30: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d  (SQLITE_CONFIG_M
9d40: 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65  ALLOC, sqlite3Me
9d50: 6d 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a  mGetWin32());.}.
9d60: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
9d70: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f  _WIN32_MALLOC */
9d80: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
9d90: 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74  a UTF-8 string t
9da0: 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  o Microsoft Unic
9db0: 6f 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a  ode (UTF-16?). .
9dc0: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
9dd0: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
9de0: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
9df0: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e  ned from malloc.
9e00: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54  .*/.static LPWST
9e10: 52 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  R utf8ToUnicode(
9e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
9e30: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43  ename){.  int nC
9e40: 68 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57  har;.  LPWSTR zW
9e50: 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20  ideFilename;..  
9e60: 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42  nChar = osMultiB
9e70: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
9e80: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
9e90: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30  ame, -1, NULL, 0
9ea0: 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
9eb0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
9ec0: 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69  0;.  }.  zWideFi
9ed0: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
9ee0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61  MallocZero( nCha
9ef0: 72 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69  r*sizeof(zWideFi
9f00: 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20  lename[0]) );.  
9f10: 69 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  if( zWideFilenam
9f20: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
9f30: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61  rn 0;.  }.  nCha
9f40: 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  r = osMultiByteT
9f50: 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46  oWideChar(CP_UTF
9f60: 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  8, 0, zFilename,
9f70: 20 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61   -1, zWideFilena
9f80: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66      nChar);.  if
9fb0: 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
9fc0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9fd0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  WideFilename);. 
9fe0: 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65     zWideFilename
9ff0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
a000: 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  rn zWideFilename
a010: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
a020: 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  rt Microsoft Uni
a030: 63 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20  code to UTF-8.  
a040: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
a050: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
a060: 67 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64  g is.** obtained
a070: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
a080: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
a090: 63 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54  c char *unicodeT
a0a0: 6f 55 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57  oUtf8(LPCWSTR zW
a0b0: 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20  ideFilename){.  
a0c0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61  int nByte;.  cha
a0d0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20  r *zFilename;.. 
a0e0: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
a0f0: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43  harToMultiByte(C
a100: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65  P_UTF8, 0, zWide
a110: 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c  Filename, -1, 0,
a120: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
a130: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
a140: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
a150: 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73  .  zFilename = s
a160: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
a170: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
a180: 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b   zFilename==0 ){
a190: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a1a0: 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57   }.  nByte = osW
a1b0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
a1c0: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
a1d0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
a1e0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79  , zFilename, nBy
a1f0: 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a210: 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28      0, 0);.  if(
a220: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
a230: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a240: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
a250: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
a260: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c   }.  return zFil
a270: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
a280: 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53 49 20  Convert an ANSI 
a290: 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73  string to Micros
a2a0: 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20 62 61 73  oft Unicode, bas
a2b0: 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72  ed on the.** cur
a2c0: 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20 73 65  rent codepage se
a2d0: 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c 65 20  ttings for file 
a2e0: 61 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61  apis..** .** Spa
a2f0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
a300: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
a310: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
a320: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
a330: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57  c..*/.static LPW
a340: 53 54 52 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64  STR mbcsToUnicod
a350: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
a360: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
a370: 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20  nByte;.  LPWSTR 
a380: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20  zMbcsFilename;. 
a390: 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20   int codepage = 
a3a0: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
a3b0: 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43  I() ? CP_ACP : C
a3c0: 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74  P_OEMCP;..  nByt
a3d0: 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  e = osMultiByteT
a3e0: 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61  oWideChar(codepa
a3f0: 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65  ge, 0, zFilename
a400: 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  , -1, NULL,.    
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a420: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 2a 73              0)*s
a430: 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20  izeof(WCHAR);.  
a440: 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
a450: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a460: 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  }.  zMbcsFilenam
a470: 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
a480: 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a  cZero( nByte*siz
a490: 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  eof(zMbcsFilenam
a4a0: 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a  e[0]) );.  if( z
a4b0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  MbcsFilename==0 
a4c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
a4d0: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
a4e0: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
a4f0: 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30  Char(codepage, 0
a500: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  , zFilename, -1,
a510: 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a   zMbcsFilename,.
a520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42  nByte);.  if( nB
a550: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  yte==0 ){.    sq
a560: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73  lite3_free(zMbcs
a570: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
a580: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30  MbcsFilename = 0
a590: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
a5a0: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  MbcsFilename;.}.
a5b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d  ./*.** Convert M
a5c0: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
a5d0: 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20 63   to multi-byte c
a5e0: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c  haracter string,
a5f0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a   based on the.**
a600: 20 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f 64   user's ANSI cod
a610: 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  epage..**.** Spa
a620: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
a630: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
a640: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  s obtained from.
a650: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
a660: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
a670: 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d 62  har *unicodeToMb
a680: 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  cs(LPCWSTR zWide
a690: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74  Filename){.  int
a6a0: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
a6b0: 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74  zFilename;.  int
a6c0: 20 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72   codepage = osAr
a6d0: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20  eFileApisANSI() 
a6e0: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
a6f0: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
a700: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
a710: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
a720: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
a730: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
a740: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
a750: 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  = 0 ){.    retur
a760: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  n 0;.  }.  zFile
a770: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
a780: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20  llocZero( nByte 
a790: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
a7a0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
a7b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
a7c0: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
a7d0: 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70  oMultiByte(codep
a7e0: 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c  age, 0, zWideFil
a7f0: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65  ename, -1, zFile
a800: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
a810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a820: 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20        nByte, 0, 
a830: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
a840: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
a850: 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61  te3_free(zFilena
a860: 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  me);.    zFilena
a870: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
a880: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  turn zFilename;.
a890: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
a8a0: 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61   multibyte chara
a8b0: 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55  cter string to U
a8c0: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
a8d0: 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75  hold the.** retu
a8e0: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
a8f0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
a900: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
a910: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
a920: 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
a930: 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  f8(const char *z
a940: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61  Filename){.  cha
a950: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38  r *zFilenameUtf8
a960: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57  ;.  LPWSTR zTmpW
a970: 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65  ide;..  zTmpWide
a980: 20 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65   = mbcsToUnicode
a990: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
a9a0: 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29  f( zTmpWide==0 )
a9b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a9c0: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55    }.  zFilenameU
a9d0: 74 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  tf8 = unicodeToU
a9e0: 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  tf8(zTmpWide);. 
a9f0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
aa00: 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72  mpWide);.  retur
aa10: 6e 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b  n zFilenameUtf8;
aa20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
aa30: 74 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69  t UTF-8 to multi
aa40: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
aa50: 74 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f  tring.  Space to
aa60: 20 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65   hold the .** re
aa70: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
aa80: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
aa90: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
aaa0: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
aab0: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
aac0: 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20  mbcs(const char 
aad0: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
aae0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62  har *zFilenameMb
aaf0: 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d  cs;.  LPWSTR zTm
ab00: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
ab10: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  de = utf8ToUnico
ab20: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
ab30: 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30   if( zTmpWide==0
ab40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
ab50: 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
ab60: 65 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54  eMbcs = unicodeT
ab70: 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b  oMbcs(zTmpWide);
ab80: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
ab90: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74  zTmpWide);.  ret
aba0: 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63  urn zFilenameMbc
abb0: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s;.}../*.** This
abc0: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74   function sets t
abd0: 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
abe0: 79 20 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61  y or the tempora
abf0: 72 79 20 64 69 72 65 63 74 6f 72 79 20 62 61 73  ry directory bas
ac00: 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 72 6f  ed on.** the pro
ac10: 76 69 64 65 64 20 61 72 67 75 6d 65 6e 74 73 2e  vided arguments.
ac20: 20 20 54 68 65 20 74 79 70 65 20 61 72 67 75 6d    The type argum
ac30: 65 6e 74 20 6d 75 73 74 20 62 65 20 31 20 69 6e  ent must be 1 in
ac40: 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68   order to set th
ac50: 65 0a 2a 2a 20 64 61 74 61 20 64 69 72 65 63 74  e.** data direct
ac60: 6f 72 79 20 6f 72 20 32 20 69 6e 20 6f 72 64 65  ory or 2 in orde
ac70: 72 20 74 6f 20 73 65 74 20 74 68 65 20 74 65 6d  r to set the tem
ac80: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
ac90: 2e 20 20 54 68 65 20 7a 56 61 6c 75 65 0a 2a 2a  .  The zValue.**
aca0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
acb0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72   name of the dir
acc0: 65 63 74 6f 72 79 20 74 6f 20 75 73 65 2e 20 20  ectory to use.  
acd0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
ace0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c 49   will be.** SQLI
acf0: 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
ad00: 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ful..*/.int sqli
ad10: 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
ad20: 72 65 63 74 6f 72 79 28 44 57 4f 52 44 20 74 79  rectory(DWORD ty
ad30: 70 65 2c 20 4c 50 43 57 53 54 52 20 7a 56 61 6c  pe, LPCWSTR zVal
ad40: 75 65 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70  ue){.  char **pp
ad50: 44 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23  Directory = 0;.#
ad60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ad70: 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e  IT_AUTOINIT.  in
ad80: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69  t rc = sqlite3_i
ad90: 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69  nitialize();.  i
ada0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
adb0: 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  c;.#endif.  if( 
adc0: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e  type==SQLITE_WIN
add0: 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52  32_DATA_DIRECTOR
ade0: 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70  Y_TYPE ){.    pp
adf0: 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c  Directory = &sql
ae00: 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
ae10: 6f 72 79 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ory;.  }else if(
ae20: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
ae30: 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f  N32_TEMP_DIRECTO
ae40: 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70  RY_TYPE ){.    p
ae50: 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71  pDirectory = &sq
ae60: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
ae70: 74 6f 72 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65  tory;.  }.  asse
ae80: 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79  rt( !ppDirectory
ae90: 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45   || type==SQLITE
aea0: 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45  _WIN32_DATA_DIRE
aeb0: 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 20 20 20  CTORY_TYPE.     
aec0: 20 20 20 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51       || type==SQ
aed0: 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f  LITE_WIN32_TEMP_
aee0: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20  DIRECTORY_TYPE. 
aef0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
af00: 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 73 71  pDirectory || sq
af10: 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73  lite3MemdebugHas
af20: 54 79 70 65 28 2a 70 70 44 69 72 65 63 74 6f 72  Type(*ppDirector
af30: 79 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41 50 29  y, MEMTYPE_HEAP)
af40: 20 29 3b 0a 20 20 69 66 28 20 70 70 44 69 72 65   );.  if( ppDire
af50: 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 63 68 61  ctory ){.    cha
af60: 72 20 2a 7a 56 61 6c 75 65 55 74 66 38 20 3d 20  r *zValueUtf8 = 
af70: 30 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 6c 75  0;.    if( zValu
af80: 65 20 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29  e && zValue[0] )
af90: 7b 0a 20 20 20 20 20 20 7a 56 61 6c 75 65 55 74  {.      zValueUt
afa0: 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  f8 = unicodeToUt
afb0: 66 38 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20  f8(zValue);.    
afc0: 20 20 69 66 20 28 20 7a 56 61 6c 75 65 55 74 66    if ( zValueUtf
afd0: 38 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  8==0 ){.        
afe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
aff0: 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
b000: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
b010: 72 65 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79  ree(*ppDirectory
b020: 29 3b 0a 20 20 20 20 2a 70 70 44 69 72 65 63 74  );.    *ppDirect
b030: 6f 72 79 20 3d 20 7a 56 61 6c 75 65 55 74 66 38  ory = zValueUtf8
b040: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
b050: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65  ITE_OK;.  }.  re
b060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
b070: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  R;.}../*.** The 
b080: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
b090: 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a  getLastErrorMsg.
b0a0: 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
b0b0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
b0c0: 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
b0d0: 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
b0e0: 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
b0f0: 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
b100: 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a   truncated)..*/.
b110: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4c 61  static int getLa
b120: 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44  stErrorMsg(DWORD
b130: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20   lastErrno, int 
b140: 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
b150: 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65  ){.  /* FormatMe
b160: 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20  ssage returns 0 
b170: 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68  on failure.  Oth
b180: 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72  erwise it.  ** r
b190: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
b1a0: 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74  r of TCHARs writ
b1b0: 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ten to the outpu
b1c0: 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65  t.  ** buffer, e
b1d0: 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72  xcluding the ter
b1e0: 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68  minating null ch
b1f0: 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44  ar..  */.  DWORD
b200: 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68   dwLen = 0;.  ch
b210: 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20  ar *zOut = 0;.. 
b220: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23   if( isNT() ){.#
b230: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
b240: 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65  RT.    WCHAR zTe
b250: 6d 70 57 69 64 65 5b 4d 41 58 5f 50 41 54 48 2b  mpWide[MAX_PATH+
b260: 31 5d 3b 20 2f 2a 20 4e 4f 54 45 3a 20 53 6f 6d  1]; /* NOTE: Som
b270: 65 77 68 61 74 20 61 72 62 69 74 72 61 72 79 2e  ewhat arbitrary.
b280: 20 2a 2f 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20   */.    dwLen = 
b290: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  osFormatMessageW
b2a0: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
b2b0: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
b2e0: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
b2f0: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b310: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b330: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72            lastEr
b340: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
b370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b380: 20 20 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20    zTempWide,.   
b390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3a0: 20 20 20 20 20 20 20 20 20 20 4d 41 58 5f 50 41            MAX_PA
b3b0: 54 48 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TH,.            
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3d0: 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c   0);.#else.    L
b3e0: 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20  PWSTR zTempWide 
b3f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65  = NULL;.    dwLe
b400: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
b410: 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageW(FORMAT_MESS
b420: 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46  AGE_ALLOCATE_BUF
b430: 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20  FER |.          
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b450: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
b460: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
b490: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
b4a0: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74              last
b4f0: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 20 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54      (LPWSTR) &zT
b540: 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20  empWide,.       
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b580: 20 20 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66        0);.#endif
b590: 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e  .    if( dwLen >
b5a0: 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61   0 ){.      /* a
b5b0: 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72  llocate a buffer
b5c0: 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20   and convert to 
b5d0: 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71  UTF8 */.      sq
b5e0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
b5f0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
b600: 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f  zOut = unicodeTo
b610: 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b  Utf8(zTempWide);
b620: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
b630: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
b640: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
b650: 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66  WINRT.      /* f
b660: 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62  ree the system b
b670: 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
b680: 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  by FormatMessage
b690: 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61   */.      osLoca
b6a0: 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29  lFree(zTempWide)
b6b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
b6c0: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
b6d0: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
b6e0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72    else{.    char
b6f0: 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a   *zTemp = NULL;.
b700: 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f      dwLen = osFo
b710: 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52  rmatMessageA(FOR
b720: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f  MAT_MESSAGE_ALLO
b730: 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20  CATE_BUFFER |.  
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b750: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
b760: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
b770: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b790: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
b7a0: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
b7b0: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7d0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b830: 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 53              (LPS
b840: 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20  TR) &zTemp,.    
b850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b860: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20           0);.   
b890: 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29   if( dwLen > 0 )
b8a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  {.      /* alloc
b8b0: 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64  ate a buffer and
b8c0: 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38   convert to UTF8
b8d0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
b8e0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
b8f0: 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74  oc();.      zOut
b900: 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
b910: 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54  _mbcs_to_utf8(zT
b920: 65 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  emp);.      sqli
b930: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
b940: 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66  oc();.      /* f
b950: 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62  ree the system b
b960: 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
b970: 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  by FormatMessage
b980: 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61   */.      osLoca
b990: 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  lFree(zTemp);.  
b9a0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
b9b0: 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20   if( 0 == dwLen 
b9c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
b9d0: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
b9e0: 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25  uf, "OsError 0x%
b9f0: 78 20 28 25 75 29 22 2c 20 6c 61 73 74 45 72 72  x (%u)", lastErr
ba00: 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a  no, lastErrno);.
ba10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
ba20: 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f  copy a maximum o
ba30: 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20  f nBuf chars to 
ba40: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  output buffer */
ba50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
ba60: 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
ba70: 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
ba80: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55     /* free the U
ba90: 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  TF8 buffer */.  
baa0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
bab0: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Out);.  }.  retu
bac0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  rn 0;.}../*.**.*
bad0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
bae0: 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c  - winLogErrorAtL
baf0: 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20  ine() - is only 
bb00: 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20  ever called via 
bb10: 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e  the macro.** win
bb20: 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a  LogError()..**.*
bb30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
bb40: 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20  s invoked after 
bb50: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
bb60: 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f  in an OS functio
bb70: 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20  n..** It logs a 
bb80: 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
bb90: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74  lite3_log() cont
bba0: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
bbb0: 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65  nt value of.** e
bbc0: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69  rror code and, i
bbd0: 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
bbe0: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
bbf0: 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a  quivalent from .
bc00: 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  ** FormatMessage
bc10: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
bc20: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
bc30: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
bc40: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
bc50: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
bc60: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
bc70: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
bc80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
bc90: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
bca0: 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20  TOPEN). .** The 
bcb0: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
bcc0: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
bcd0: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
bce0: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
bcf0: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e  hat.** failed an
bd00: 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  d the associated
bd10: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74   file-system pat
bd20: 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  h, if any..*/.#d
bd30: 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f  efine winLogErro
bd40: 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e  r(a,b,c,d)   win
bd50: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
bd60: 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29  ,b,c,d,__LINE__)
bd70: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
bd80: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20  ogErrorAtLine(. 
bd90: 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20   int errcode,   
bda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdb0: 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72   /* SQLite error
bdc0: 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44   code */.  DWORD
bdd0: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20   lastErrno,     
bde0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69             /* Wi
bdf0: 6e 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a  n32 last error *
be00: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
be10: 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20  zFunc,          
be20: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f      /* Name of O
be30: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  S function that 
be40: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  failed */.  cons
be50: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
be60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
be70: 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61  ile path associa
be80: 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a  ted with error *
be90: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20  /.  int iLine   
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
beb0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69      /* Source li
bec0: 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  ne number where 
bed0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
bee0: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67  /.){.  char zMsg
bef0: 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [500];          
bf00: 20 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20         /* Human 
bf10: 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74  readable error t
bf20: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ext */.  int i; 
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
bf50: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a   counter */..  z
bf60: 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 67 65  Msg[0] = 0;.  ge
bf70: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6c 61  tLastErrorMsg(la
bf80: 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28  stErrno, sizeof(
bf90: 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20  zMsg), zMsg);.  
bfa0: 61 73 73 65 72 74 28 20 65 72 72 63 6f 64 65 21  assert( errcode!
bfb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
bfc0: 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a  if( zPath==0 ) z
bfd0: 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72  Path = "";.  for
bfe0: 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26  (i=0; zMsg[i] &&
bff0: 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26   zMsg[i]!='\r' &
c000: 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b  & zMsg[i]!='\n';
c010: 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69   i++){}.  zMsg[i
c020: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
c030: 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20  _log(errcode,.  
c040: 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64      "os_win.c:%d
c050: 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20  : (%d) %s(%s) - 
c060: 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65  %s",.      iLine
c070: 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75  , lastErrno, zFu
c080: 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a  nc, zPath, zMsg.
c090: 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65    );..  return e
c0a0: 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrcode;.}../*.**
c0b0: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
c0c0: 69 6d 65 73 20 74 68 61 74 20 61 20 52 65 61 64  imes that a Read
c0d0: 46 69 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c  File(), WriteFil
c0e0: 65 28 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46  e(), and DeleteF
c0f0: 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65  ile().** will be
c100: 20 72 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69   retried followi
c110: 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72  ng a locking err
c120: 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61  or - probably ca
c130: 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e 74 69  used by .** anti
c140: 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 2e 20  virus software. 
c150: 20 41 6c 73 6f 20 74 68 65 20 69 6e 69 74 69 61   Also the initia
c160: 6c 20 64 65 6c 61 79 20 62 65 66 6f 72 65 20 74  l delay before t
c170: 68 65 20 66 69 72 73 74 20 72 65 74 72 79 2e 0a  he first retry..
c180: 2a 2a 20 54 68 65 20 64 65 6c 61 79 20 69 6e 63  ** The delay inc
c190: 72 65 61 73 65 73 20 6c 69 6e 65 61 72 6c 79 20  reases linearly 
c1a0: 77 69 74 68 20 65 61 63 68 20 72 65 74 72 79 2e  with each retry.
c1b0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
c1c0: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
c1d0: 45 54 52 59 0a 23 20 64 65 66 69 6e 65 20 53 51  ETRY.# define SQ
c1e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
c1f0: 5f 52 45 54 52 59 20 31 30 0a 23 65 6e 64 69 66  _RETRY 10.#endif
c200: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c210: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
c220: 59 5f 44 45 4c 41 59 0a 23 20 64 65 66 69 6e 65  Y_DELAY.# define
c230: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
c240: 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 20  ERR_RETRY_DELAY 
c250: 32 35 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  25.#endif.static
c260: 20 69 6e 74 20 77 69 6e 33 32 49 6f 65 72 72 52   int win32IoerrR
c270: 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  etry = SQLITE_WI
c280: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 3b  N32_IOERR_RETRY;
c290: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33  .static int win3
c2a0: 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  2IoerrRetryDelay
c2b0: 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   = SQLITE_WIN32_
c2c0: 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
c2d0: 59 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52  Y;../*.** If a R
c2e0: 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69  eadFile() or Wri
c2f0: 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f  teFile() error o
c300: 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68  ccurs, invoke th
c310: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f  is routine.** to
c320: 20 73 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c   see if it shoul
c330: 64 20 62 65 20 72 65 74 72 69 65 64 2e 20 20 52  d be retried.  R
c340: 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65  eturn TRUE to re
c350: 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  try.  Return FAL
c360: 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70  SE.** to give up
c370: 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a   with an error..
c380: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
c390: 74 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e  tryIoerr(int *pn
c3a0: 52 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70 45  Retry, DWORD *pE
c3b0: 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20 65  rror){.  DWORD e
c3c0: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
c3d0: 72 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65  r();.  if( *pnRe
c3e0: 74 72 79 3e 3d 77 69 6e 33 32 49 6f 65 72 72 52  try>=win32IoerrR
c3f0: 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20  etry ){.    if( 
c400: 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  pError ){.      
c410: 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20  *pError = e;.   
c420: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b   }.    return 0;
c430: 0a 20 20 7d 0a 20 20 69 66 28 20 65 3d 3d 45 52  .  }.  if( e==ER
c440: 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45  ROR_ACCESS_DENIE
c450: 44 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52  D ||.      e==ER
c460: 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49  ROR_LOCK_VIOLATI
c470: 4f 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45  ON ||.      e==E
c480: 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f  RROR_SHARING_VIO
c490: 4c 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71  LATION ){.    sq
c4a0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
c4b0: 70 28 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72  p(win32IoerrRetr
c4c0: 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74  yDelay*(1+*pnRet
c4d0: 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52  ry));.    ++*pnR
c4e0: 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e  etry;.    return
c4f0: 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45   1;.  }.  if( pE
c500: 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72  rror ){.    *pEr
c510: 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72  ror = e;.  }.  r
c520: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
c530: 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f  * Log a I/O erro
c540: 72 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e  r retry episode.
c550: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c560: 6c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65  logIoerr(int nRe
c570: 74 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74  try){.  if( nRet
c580: 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ry ){.    sqlite
c590: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45  3_log(SQLITE_IOE
c5a0: 52 52 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61  RR, .      "dela
c5b0: 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63  yed %dms for loc
c5c0: 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69  k/sharing confli
c5d0: 63 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 33 32  ct",.      win32
c5e0: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
c5f0: 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31  nRetry*(nRetry+1
c600: 29 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  )/2.    );.  }.}
c610: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
c620: 57 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  WINCE./*********
c630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c670: 0a 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e  .** This section
c680: 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66   contains code f
c690: 6f 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a  or WinCE only..*
c6a0: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
c6b0: 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c  QLITE_MSVC_LOCAL
c6c0: 54 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51  TIME_API) || !SQ
c6d0: 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
c6e0: 49 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68  IME_API./*.** Th
c6f0: 65 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69  e MSVC CRT on Wi
c700: 6e 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74  ndows CE may not
c710: 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d   have a localtim
c720: 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  e() function.  S
c730: 6f 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75  o.** create a su
c740: 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e  bstitute..*/.#in
c750: 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73  clude <time.h>.s
c760: 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63  truct tm *__cdec
c770: 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73  l localtime(cons
c780: 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20  t time_t *t).{. 
c790: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74   static struct t
c7a0: 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20  m y;.  FILETIME 
c7b0: 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54  uTm, lTm;.  SYST
c7c0: 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71  EMTIME pTm;.  sq
c7d0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b  lite3_int64 t64;
c7e0: 0a 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74  .  t64 = *t;.  t
c7f0: 36 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34  64 = (t64 + 1164
c800: 34 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30  4473600)*1000000
c810: 30 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61  0;.  uTm.dwLowDa
c820: 74 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29  teTime = (DWORD)
c830: 28 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46  (t64 & 0xFFFFFFF
c840: 46 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68  F);.  uTm.dwHigh
c850: 44 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44  DateTime= (DWORD
c860: 29 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20  )(t64 >> 32);.  
c870: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
c880: 6c 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26  lFileTime(&uTm,&
c890: 6c 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69  lTm);.  osFileTi
c8a0: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26  meToSystemTime(&
c8b0: 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74  lTm,&pTm);.  y.t
c8c0: 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65  m_year = pTm.wYe
c8d0: 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74  ar - 1900;.  y.t
c8e0: 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e  m_mon = pTm.wMon
c8f0: 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77  th - 1;.  y.tm_w
c900: 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66  day = pTm.wDayOf
c910: 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61  Week;.  y.tm_mda
c920: 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20  y = pTm.wDay;.  
c930: 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e  y.tm_hour = pTm.
c940: 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69  wHour;.  y.tm_mi
c950: 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b  n = pTm.wMinute;
c960: 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54  .  y.tm_sec = pT
c970: 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74  m.wSecond;.  ret
c980: 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66  urn &y;.}.#endif
c990: 0a 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45  ..#define HANDLE
c9a0: 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28  _TO_WINFILE(a) (
c9b0: 77 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72  winFile*)&((char
c9c0: 2a 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65  *)a)[-(int)offse
c9d0: 74 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a  tof(winFile,h)].
c9e0: 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
c9f0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e   lock on the han
ca00: 64 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20  dle h.*/.static 
ca10: 76 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41  void winceMutexA
ca20: 63 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29  cquire(HANDLE h)
ca30: 7b 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72  {.   DWORD dwErr
ca40: 3b 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64  ;.   do {.     d
ca50: 77 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72  wErr = osWaitFor
ca60: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20  SingleObject(h, 
ca70: 49 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20  INFINITE);.   } 
ca80: 77 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20  while (dwErr != 
ca90: 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26  WAIT_OBJECT_0 &&
caa0: 20 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41   dwErr != WAIT_A
cab0: 42 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a  BANDONED);.}./*.
cac0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63  ** Release a loc
cad0: 6b 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69  k acquired by wi
cae0: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
caf0: 29 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ).*/.#define win
cb00: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68  ceMutexRelease(h
cb10: 29 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68  ) ReleaseMutex(h
cb20: 29 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  )../*.** Create 
cb30: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68  the mutex and sh
cb40: 61 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64  ared memory used
cb50: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20   for locking in 
cb60: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  the file.** desc
cb70: 72 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a  riptor pFile.*/.
cb80: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65  static int wince
cb90: 43 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74  CreateLock(const
cba0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
cbb0: 2c 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  , winFile *pFile
cbc0: 29 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b  ){.  LPWSTR zTok
cbd0: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65  ;.  LPWSTR zName
cbe0: 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
cbf0: 72 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67  rno;.  BOOL bLog
cc00: 67 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42  ged = FALSE;.  B
cc10: 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45  OOL bInit = TRUE
cc20: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 75 74 66  ;..  zName = utf
cc30: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
cc40: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  name);.  if( zNa
cc50: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
cc60: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f  out of memory */
cc70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
cc80: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
cc90: 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
cca0: 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c  lize the local l
ccb0: 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d  ockdata */.  mem
ccc0: 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61  set(&pFile->loca
ccd0: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69  l, 0, sizeof(pFi
cce0: 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20  le->local));..  
ccf0: 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 62  /* Replace the b
cd00: 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20  ackslashes from 
cd10: 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  the filename and
cd20: 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20   lowercase it.  
cd30: 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d  ** to derive a m
cd40: 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20  utex name. */.  
cd50: 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77  zTok = osCharLow
cd60: 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f  erW(zName);.  fo
cd70: 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b  r (;*zTok;zTok++
cd80: 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b  ){.    if (*zTok
cd90: 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20   == '\\') *zTok 
cda0: 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  = '_';.  }..  /*
cdb0: 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65   Create/open the
cdc0: 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a   named mutex */.
cdd0: 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20    pFile->hMutex 
cde0: 3d 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57  = osCreateMutexW
cdf0: 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e  (NULL, FALSE, zN
ce00: 61 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69  ame);.  if (!pFi
ce10: 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20  le->hMutex){.   
ce20: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
ce30: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
ce40: 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  or();.    winLog
ce50: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
ce60: 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  RR, pFile->lastE
ce70: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
ce80: 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61        "winceCrea
ce90: 74 65 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e  teLock1", zFilen
cea0: 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
ceb0: 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20  3_free(zName);. 
cec0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ced0: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _IOERR;.  }..  /
cee0: 2a 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75  * Acquire the mu
cef0: 74 65 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69  tex before conti
cf00: 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65  nuing */.  wince
cf10: 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
cf20: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a  le->hMutex);.  .
cf30: 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e    /* Since the n
cf40: 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75  ames of named mu
cf50: 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65  texes, semaphore
cf60: 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73  s, file mappings
cf70: 20 65 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63   etc are .  ** c
cf80: 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74  ase-sensitive, t
cf90: 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
cfa0: 20 74 68 61 74 20 62 79 20 75 70 70 65 72 63 61   that by upperca
cfb0: 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e  sing the mutex n
cfc0: 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69  ame.  ** and usi
cfd0: 6e 67 20 74 68 61 74 20 61 73 20 74 68 65 20 73  ng that as the s
cfe0: 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e  hared filemappin
cff0: 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f  g name..  */.  o
d000: 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d  sCharUpperW(zNam
d010: 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68  e);.  pFile->hSh
d020: 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46  ared = osCreateF
d030: 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41  ileMappingW(INVA
d040: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
d050: 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d080: 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
d090: 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
d0a0: 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ock),.          
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
d0d0: 61 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65  ame);  ..  /* Se
d0e0: 74 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e  t a flag that in
d0f0: 64 69 63 61 74 65 73 20 77 65 27 72 65 20 74 68  dicates we're th
d100: 65 20 66 69 72 73 74 20 74 6f 20 63 72 65 61 74  e first to creat
d110: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20  e the memory so 
d120: 69 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65  it .  ** must be
d130: 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65   zero-initialize
d140: 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f  d */.  lastErrno
d150: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
d160: 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73 74 45  r();.  if (lastE
d170: 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c  rrno == ERROR_AL
d180: 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20  READY_EXISTS){. 
d190: 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45     bInit = FALSE
d1a0: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
d1b0: 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20  _free(zName);.. 
d1c0: 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65 65   /* If we succee
d1d0: 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68  ded in making th
d1e0: 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
d1f0: 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20  handle, map it. 
d200: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
d210: 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 70  hShared ){.    p
d220: 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28  File->shared = (
d230: 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70  winceLock*)osMap
d240: 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
d250: 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20 20 20  ->hShared, .    
d260: 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41           FILE_MA
d270: 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f  P_READ|FILE_MAP_
d280: 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a  WRITE, 0, 0, siz
d290: 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b  eof(winceLock));
d2a0: 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69  .    /* If mappi
d2b0: 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65  ng failed, close
d2c0: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
d2d0: 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72  ry handle and er
d2e0: 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ase it */.    if
d2f0: 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ( !pFile->shared
d300: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
d310: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
d320: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
d330: 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72       winLogError
d340: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70  (SQLITE_IOERR, p
d350: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
d360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d370: 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c     "winceCreateL
d380: 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ock2", zFilename
d390: 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64  );.      bLogged
d3a0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 6f   = TRUE;.      o
d3b0: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
d3c0: 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20  le->hShared);.  
d3d0: 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72      pFile->hShar
d3e0: 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ed = NULL;.    }
d3f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68  .  }..  /* If sh
d400: 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c  ared memory coul
d410: 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64  d not be created
d420: 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
d430: 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20   mutex and fail 
d440: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
d450: 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b  hShared==NULL ){
d460: 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67 65  .    if( !bLogge
d470: 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d ){.      pFile
d480: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
d490: 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 77  stErrno;.      w
d4a0: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
d4b0: 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e  E_IOERR, pFile->
d4c0: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
d4e0: 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22 2c  nceCreateLock3",
d4f0: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
d500: 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55     bLogged = TRU
d510: 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6e  E;.    }.    win
d520: 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
d530: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
d540: 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
d550: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
d560: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  .    pFile->hMut
d570: 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72  ex = NULL;.    r
d580: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
d590: 52 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  RR;.  }.  .  /* 
d5a0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
d5b0: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20  hared memory if 
d5c0: 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74  we're supposed t
d5d0: 6f 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74  o */.  if( bInit
d5e0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
d5f0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c  File->shared, 0,
d600: 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
d610: 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63  k));.  }..  winc
d620: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
d630: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
d640: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d650: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72  ;.}../*.** Destr
d660: 6f 79 20 74 68 65 20 70 61 72 74 20 6f 66 20 77  oy the part of w
d670: 69 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c  inFile that deal
d680: 73 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63  s with wince loc
d690: 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ks.*/.static voi
d6a0: 64 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f  d winceDestroyLo
d6b0: 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  ck(winFile *pFil
d6c0: 65 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d  e){.  if (pFile-
d6d0: 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a  >hMutex){.    /*
d6e0: 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74   Acquire the mut
d6f0: 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d  ex */.    winceM
d700: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
d710: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20  e->hMutex);..   
d720: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
d730: 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20  g blocks should 
d740: 70 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20  probably assert 
d750: 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62  in debug mode, b
d760: 75 74 20 74 68 65 79 0a 20 20 20 20 20 20 20 61  ut they.       a
d770: 72 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e  re to cleanup in
d780: 20 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20   case any locks 
d790: 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f  remained open */
d7a0: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
d7b0: 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b  local.nReaders){
d7c0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
d7d0: 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
d7e0: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  -;.    }.    if 
d7f0: 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52  (pFile->local.bR
d800: 65 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20  eserved){.      
d810: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
d820: 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
d830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
d840: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
d850: 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46  nding){.      pF
d860: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
d870: 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
d880: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
d890: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
d8a0: 73 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69  sive){.      pFi
d8b0: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
d8c0: 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
d8d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
d8e0: 2d 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63  -reference and c
d8f0: 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66  lose our copy of
d900: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
d910: 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20  ry handle */.   
d920: 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   osUnmapViewOfFi
d930: 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  le(pFile->shared
d940: 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  );.    osCloseHa
d950: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
d960: 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  red);..    /* Do
d970: 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65  ne with the mute
d980: 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
d990: 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
d9a0: 2d 3e 68 4d 75 74 65 78 29 3b 20 20 20 20 0a 20  ->hMutex);    . 
d9b0: 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
d9c0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
d9d0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  .    pFile->hMut
d9e0: 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d  ex = NULL;.  }.}
d9f0: 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c  ../* .** An impl
da00: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
da10: 65 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49  e LockFile() API
da20: 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20   of Windows for 
da30: 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  CE.*/.static BOO
da40: 4c 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28  L winceLockFile(
da50: 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69  .  LPHANDLE phFi
da60: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
da70: 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
da80: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
da90: 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
daa0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
dab0: 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  ockLow,.  DWORD 
dac0: 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
dad0: 4c 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69  LockHigh.){.  wi
dae0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48  nFile *pFile = H
daf0: 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
db00: 28 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c  (phFile);.  BOOL
db10: 20 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45   bReturn = FALSE
db20: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
db30: 4d 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73  METER(dwFileOffs
db40: 65 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45  etHigh);.  UNUSE
db50: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d  D_PARAMETER(nNum
db60: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
db70: 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
db80: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
db90: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
dba0: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
dbb0: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
dbc0: 20 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20    /* Wanting an 
dbd0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20  exclusive lock? 
dbe0: 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f  */.  if (dwFileO
dbf0: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
dc00: 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a  RD)SHARED_FIRST.
dc10: 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
dc20: 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
dc30: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
dc40: 45 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66  ED_SIZE){.    if
dc50: 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
dc60: 3e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26  >nReaders == 0 &
dc70: 26 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d  & pFile->shared-
dc80: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30  >bExclusive == 0
dc90: 29 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ){.       pFile-
dca0: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
dcb0: 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
dcc0: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
dcd0: 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55  bExclusive = TRU
dce0: 45 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75 72  E;.       bRetur
dcf0: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
dd00: 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
dd10: 20 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f   read-only lock?
dd20: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
dd30: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
dd40: 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
dd50: 46 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 20  FIRST &&.       
dd60: 20 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74      nNumberOfByt
dd70: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  esToLockLow == 1
dd80: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
dd90: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
dda0: 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
ddb0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e    pFile->local.n
ddc0: 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20  Readers ++;.    
ddd0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
dde0: 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31  al.nReaders == 1
ddf0: 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
de00: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
de10: 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  rs ++;.      }. 
de20: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
de30: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
de40: 20 20 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64    /* Want a pend
de50: 69 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  ing lock? */.  e
de60: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
de70: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
de80: 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 26  D)PENDING_BYTE &
de90: 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
dea0: 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
deb0: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65  .    /* If no pe
dec0: 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
ded0: 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68  een acquired, th
dee0: 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f  en acquire it */
def0: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
df00: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
df10: 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
df20: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
df30: 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20  ending = TRUE;. 
df40: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
df50: 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  l.bPending = TRU
df60: 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
df70: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
df80: 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
df90: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a  reserved lock? *
dfa0: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
dfb0: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
dfc0: 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
dfd0: 42 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f  BYTE && nNumberO
dfe0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
dff0: 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
e000: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
e010: 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a  eserved == 0) {.
e020: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
e030: 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
e040: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69   TRUE;.      pFi
e050: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
e060: 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
e070: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
e080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
e090: 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
e0a0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
e0b0: 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
e0c0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  n;.}../*.** An i
e0d0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
e0e0: 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20   the UnlockFile 
e0f0: 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66  API of Windows f
e100: 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20  or CE.*/.static 
e110: 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b  BOOL winceUnlock
e120: 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
e130: 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
e140: 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
e150: 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
e160: 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
e170: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
e180: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20  esToUnlockLow,. 
e190: 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
e1a0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67  BytesToUnlockHig
e1b0: 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
e1c0: 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
e1d0: 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
e1e0: 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
e1f0: 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
e200: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
e210: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
e220: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
e230: 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
e240: 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29  tesToUnlockHigh)
e250: 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
e260: 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
e270: 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
e280: 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
e290: 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
e2a0: 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64  Releasing a read
e2b0: 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78  er lock or an ex
e2c0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
e2d0: 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73    if (dwFileOffs
e2e0: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
e2f0: 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20  SHARED_FIRST){. 
e300: 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76     /* Did we hav
e310: 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  e an exclusive l
e320: 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28  ock? */.    if (
e330: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
e340: 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20  clusive){.      
e350: 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
e360: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
e370: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
e380: 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70  D_SIZE);.      p
e390: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
e3a0: 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
e3b0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
e3c0: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
e3d0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
e3e0: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
e3f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64     }..    /* Did
e400: 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 61 20   we just have a 
e410: 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a  reader lock? */.
e420: 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 46 69      else if (pFi
e430: 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
e440: 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  rs){.      asser
e450: 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
e460: 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
e470: 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
e480: 45 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79  E || nNumberOfBy
e490: 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
e4a0: 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  = 1);.      pFil
e4b0: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
e4c0: 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20 28  s --;.      if (
e4d0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
e4e0: 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20 20 20  aders == 0).    
e4f0: 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c    {.        pFil
e500: 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
e510: 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  ers --;.      }.
e520: 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
e530: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
e540: 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20  .  /* Releasing 
e550: 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a  a pending lock *
e560: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
e570: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
e580: 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42  (DWORD)PENDING_B
e590: 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66  YTE && nNumberOf
e5a0: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
e5b0: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
e5c0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
e5d0: 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46  nding){.      pF
e5e0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
e5f0: 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ing = FALSE;.   
e600: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
e610: 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  ->bPending = FAL
e620: 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
e630: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
e640: 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69    }.  /* Releasi
e650: 6e 67 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ng a reserved lo
e660: 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  ck */.  else if 
e670: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
e680: 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52   == (DWORD)RESER
e690: 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d  VED_BYTE && nNum
e6a0: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
e6b0: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
e6c0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
e6d0: 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a 20  l.bReserved) {. 
e6e0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
e6f0: 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41  l.bReserved = FA
e700: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
e710: 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
e720: 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ved = FALSE;.   
e730: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
e740: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
e750: 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
e760: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
e770: 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75  ;.  return bRetu
e780: 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20  rn;.}./*.** End 
e790: 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  of the special c
e7a0: 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a  ode for wince.**
e7b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e7f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e  ***********/.#en
e800: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
e810: 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _WINCE */../*.**
e820: 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67   Lock a file reg
e830: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  ion..*/.static B
e840: 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  OOL winLockFile(
e850: 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69  .  LPHANDLE phFi
e860: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61 67  le,.  DWORD flag
e870: 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65  s,.  DWORD offse
e880: 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66  tLow,.  DWORD of
e890: 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
e8a0: 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20  D numBytesLow,. 
e8b0: 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48   DWORD numBytesH
e8c0: 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54  igh.){.#if SQLIT
e8d0: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a  E_OS_WINCE.  /*.
e8e0: 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f    ** NOTE: Windo
e8f0: 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64  ws CE is handled
e900: 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72   differently her
e910: 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f  e due its lack o
e920: 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a  f the Win32.  **
e930: 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46         API LockF
e940: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  ile..  */.  retu
e950: 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65  rn winceLockFile
e960: 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c  (phFile, offsetL
e970: 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a  ow, offsetHigh,.
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e990: 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c         numBytesL
e9a0: 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
e9b0: 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 69  );.#else.  if( i
e9c0: 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45  sNT() ){.    OVE
e9d0: 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20  RLAPPED ovlp;.  
e9e0: 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20    memset(&ovlp, 
e9f0: 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
ea00: 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70  PPED));.    ovlp
ea10: 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .Offset = offset
ea20: 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  Low;.    ovlp.Of
ea30: 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65  fsetHigh = offse
ea40: 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72  tHigh;.    retur
ea50: 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 2a  n osLockFileEx(*
ea60: 70 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30  phFile, flags, 0
ea70: 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e  , numBytesLow, n
ea80: 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76  umBytesHigh, &ov
ea90: 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lp);.  }else{.  
eaa0: 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46    return osLockF
eab0: 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66  ile(*phFile, off
eac0: 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
ead0: 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  gh, numBytesLow,
eae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eaf0: 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48         numBytesH
eb00: 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  igh);.  }.#endif
eb10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
eb20: 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a   a file region..
eb30: 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20   */.static BOOL 
eb40: 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20  winUnlockFile(. 
eb50: 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
eb60: 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
eb70: 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  Low,.  DWORD off
eb80: 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
eb90: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
eba0: 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69  DWORD numBytesHi
ebb0: 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  gh.){.#if SQLITE
ebc0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20  _OS_WINCE.  /*. 
ebd0: 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77   ** NOTE: Window
ebe0: 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20  s CE is handled 
ebf0: 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65  differently here
ec00: 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66   due its lack of
ec10: 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20   the Win32.  ** 
ec20: 20 20 20 20 20 20 41 50 49 20 55 6e 6c 6f 63 6b        API Unlock
ec30: 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  File..  */.  ret
ec40: 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46  urn winceUnlockF
ec50: 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73  ile(phFile, offs
ec60: 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
ec70: 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
ec90: 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65  ytesLow, numByte
eca0: 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20  sHigh);.#else.  
ecb0: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
ecc0: 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
ecd0: 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  p;.    memset(&o
ece0: 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  vlp, 0, sizeof(O
ecf0: 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
ed00: 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f   ovlp.Offset = o
ed10: 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76  ffsetLow;.    ov
ed20: 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  lp.OffsetHigh = 
ed30: 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20  offsetHigh;.    
ed40: 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46  return osUnlockF
ed50: 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 30  ileEx(*phFile, 0
ed60: 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e  , numBytesLow, n
ed70: 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76  umBytesHigh, &ov
ed80: 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lp);.  }else{.  
ed90: 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63    return osUnloc
eda0: 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f  kFile(*phFile, o
edb0: 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74  ffsetLow, offset
edc0: 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f  High, numBytesLo
edd0: 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
ede0: 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79             numBy
edf0: 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65  tesHigh);.  }.#e
ee00: 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ndif.}../*******
ee10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ee50: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ******.** The ne
ee60: 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  xt group of rout
ee70: 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 74  ines implement t
ee80: 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 73  he I/O methods s
ee90: 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74  pecified.** by t
eea0: 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
eeb0: 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a  thods object..**
eec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ef00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
ef10: 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72 6f 73  *.** Some Micros
ef20: 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20 6c 61  oft compilers la
ef30: 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69 74 69  ck this definiti
ef40: 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 49  on..*/.#ifndef I
ef50: 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
ef60: 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69 6e 65  POINTER.# define
ef70: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
ef80: 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57 4f 52  E_POINTER ((DWOR
ef90: 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  D)-1).#endif../*
efa0: 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
efb0: 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
efc0: 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
efd0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
efe0: 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
eff0: 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66 66  t to offset iOff
f000: 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20 66  set within the f
f010: 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66  ile. If successf
f020: 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20 0a 2a  ul, return 0. .*
f030: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  * Otherwise, set
f040: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f050: 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  o and return non
f060: 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  -zero..*/.static
f070: 20 69 6e 74 20 73 65 65 6b 57 69 6e 46 69 6c 65   int seekWinFile
f080: 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c  (winFile *pFile,
f090: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
f0a0: 4f 66 66 73 65 74 29 7b 0a 23 69 66 20 21 53 51  Offset){.#if !SQ
f0b0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
f0c0: 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20  LONG upperBits; 
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0e0: 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20  /* Most sig. 32 
f0f0: 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73  bits of new offs
f100: 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77  et */.  LONG low
f110: 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20  erBits;         
f120: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74          /* Least
f130: 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66   sig. 32 bits of
f140: 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20   new offset */. 
f150: 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20   DWORD dwRet;   
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f170: 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
f180: 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69  ed by SetFilePoi
f190: 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52  nter() */.  DWOR
f1a0: 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
f1b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
f1c0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
f1d0: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
f1e0: 2a 2f 0a 0a 20 20 75 70 70 65 72 42 69 74 73 20  */..  upperBits 
f1f0: 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65  = (LONG)((iOffse
f200: 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
f210: 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74  fff);.  lowerBit
f220: 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73  s = (LONG)(iOffs
f230: 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
f240: 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64 69  ;..  /* API oddi
f250: 74 79 3a 20 49 66 20 73 75 63 63 65 73 73 66 75  ty: If successfu
f260: 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  l, SetFilePointe
f270: 72 28 29 20 72 65 74 75 72 6e 73 20 61 20 64 77  r() returns a dw
f280: 6f 72 64 20 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  ord .  ** contai
f290: 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 33  ning the lower 3
f2a0: 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e 65  2-bits of the ne
f2b0: 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f  w file-offset. O
f2c0: 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c 0a  r, if it fails,.
f2d0: 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20    ** it returns 
f2e0: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
f2f0: 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76 65  _POINTER. Howeve
f300: 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d  r according to M
f310: 53 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56 41 4c  SDN, .  ** INVAL
f320: 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
f330: 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65 20  TER may also be 
f340: 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66 73  a valid new offs
f350: 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72 6d  et. So to determ
f360: 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
f370: 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  r an error has a
f380: 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 65 64 2c  ctually occured,
f390: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65   it is also nece
f3a0: 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 20 0a 20  ssary to call . 
f3b0: 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72   ** GetLastError
f3c0: 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74  ()..  */.  dwRet
f3d0: 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e   = osSetFilePoin
f3e0: 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  ter(pFile->h, lo
f3f0: 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42  werBits, &upperB
f400: 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  its, FILE_BEGIN)
f410: 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d  ;..  if( (dwRet=
f420: 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c  =INVALID_SET_FIL
f430: 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20 20 20  E_POINTER.      
f440: 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
f450: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
f460: 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29  ))!=NO_ERROR)) )
f470: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
f480: 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
f490: 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
f4a0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
f4b0: 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  _SEEK, pFile->la
f4c0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
f4d0: 20 20 20 20 20 20 22 73 65 65 6b 57 69 6e 46 69        "seekWinFi
f4e0: 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le", pFile->zPat
f4f0: 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  h);.    return 1
f500: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
f510: 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20  0;.#else.  /*.  
f520: 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f 76 65  ** Same as above
f530: 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74 68  , except that th
f540: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  is implementatio
f550: 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52  n works for WinR
f560: 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45  T..  */..  LARGE
f570: 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20 20 20  _INTEGER x;     
f580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f590: 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a  e new offset */.
f5a0: 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20    BOOL bRet;    
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5c0: 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
f5d0: 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f  ned by SetFilePo
f5e0: 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20  interEx() */..  
f5f0: 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69 4f 66  x.QuadPart = iOf
f600: 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f  fset;.  bRet = o
f610: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  sSetFilePointerE
f620: 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30  x(pFile->h, x, 0
f630: 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a  , FILE_BEGIN);..
f640: 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20 20 20    if(!bRet){.   
f650: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
f660: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
f670: 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  or();.    winLog
f680: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
f690: 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
f6a0: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
f6b0: 20 20 20 20 20 20 20 20 22 73 65 65 6b 57 69 6e          "seekWin
f6c0: 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
f6d0: 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ath);.    return
f6e0: 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   1;.  }..  retur
f6f0: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 0;.#endif.}../
f700: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
f710: 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72  e..**.** It is r
f720: 65 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20  eported that an 
f730: 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65  attempt to close
f740: 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20   a handle might 
f750: 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69  sometimes.** fai
f760: 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20 76 65  l.  This is a ve
f770: 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  ry unreasonable 
f780: 72 65 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64  result, but Wind
f790: 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73  ows is notorious
f7a0: 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e  .** for being un
f7b0: 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20  reasonable so I 
f7c0: 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61  do not doubt tha
f7d0: 74 20 69 74 20 6d 69 67 68 74 20 68 61 70 70 65  t it might happe
f7e0: 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c  n.  If.** the cl
f7f0: 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61  ose fails, we pa
f800: 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c  use for 100 mill
f810: 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79  iseconds and try
f820: 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d   again.  As.** m
f830: 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f  any as MX_CLOSE_
f840: 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73  ATTEMPT attempts
f850: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61   to close the ha
f860: 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65  ndle are made be
f870: 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75  fore.** giving u
f880: 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  p and returning 
f890: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65  an error..*/.#de
f8a0: 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  fine MX_CLOSE_AT
f8b0: 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69  TEMPT 3.static i
f8c0: 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69  nt winClose(sqli
f8d0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
f8e0: 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30   int rc, cnt = 0
f8f0: 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
f900: 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
f910: 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  d;..  assert( id
f920: 21 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53  !=0 );.#ifndef S
f930: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
f940: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
f950: 70 53 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  pShm==0 );.#endi
f960: 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c  f.  OSTRACE(("CL
f970: 4f 53 45 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  OSE %d\n", pFile
f980: 2d 3e 68 29 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  ->h));.  do{.   
f990: 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e   rc = osCloseHan
f9a0: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  dle(pFile->h);. 
f9b0: 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49 4f     /* SimulateIO
f9c0: 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e 74  Error( rc=0; cnt
f9d0: 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50  =MX_CLOSE_ATTEMP
f9e0: 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69 6c  T; ); */.  }whil
f9f0: 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63 6e  e( rc==0 && ++cn
fa00: 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  t < MX_CLOSE_ATT
fa10: 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74 65 33  EMPT && (sqlite3
fa20: 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30  _win32_sleep(100
fa30: 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53 51 4c  ), 1) );.#if SQL
fa40: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64 65  ITE_OS_WINCE.#de
fa50: 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45 54  fine WINCE_DELET
fa60: 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a 20  ION_ATTEMPTS 3. 
fa70: 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63   winceDestroyLoc
fa80: 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  k(pFile);.  if( 
fa90: 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
faa0: 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e 74  Close ){.    int
fab0: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68   cnt = 0;.    wh
fac0: 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 20  ile(.           
fad0: 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46  osDeleteFileW(pF
fae0: 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
faf0: 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  ose)==0.        
fb00: 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  && osGetFileAttr
fb10: 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a  ibutesW(pFile->z
fb20: 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d  DeleteOnClose)!=
fb30: 30 78 66 66 66 66 66 66 66 66 20 0a 20 20 20 20  0xffffffff .    
fb40: 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57      && cnt++ < W
fb50: 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  INCE_DELETION_AT
fb60: 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20  TEMPTS.    ){.  
fb70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e       sqlite3_win
fb80: 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b 20 20  32_sleep(100);  
fb90: 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65  /* Wait a little
fba0: 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61   before trying a
fbb0: 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  gain */.    }.  
fbc0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
fbd0: 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
fbe0: 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  lose);.  }.#endi
fbf0: 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c  f.  OSTRACE(("CL
fc00: 4f 53 45 20 25 64 20 25 73 5c 6e 22 2c 20 70 46  OSE %d %s\n", pF
fc10: 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b  ile->h, rc ? "ok
fc20: 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
fc30: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
fc40: 70 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b  pFile->h = NULL;
fc50: 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  .  }.  OpenCount
fc60: 65 72 28 2d 31 29 3b 0a 20 20 72 65 74 75 72 6e  er(-1);.  return
fc70: 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a   rc ? SQLITE_OK.
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 77 69              : wi
fc90: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
fca0: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73  _IOERR_CLOSE, os
fcb0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcd0: 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 43 6c            "winCl
fce0: 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ose", pFile->zPa
fcf0: 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  th);.}../*.** Re
fd00: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
fd10: 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
fd20: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
fd30: 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
fd40: 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
fd50: 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
fd60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
fd70: 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
fd80: 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
fd90: 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20  c int winRead(. 
fda0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
fdb0: 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d,          /* F
fdc0: 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ile to read from
fdd0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
fde0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fdf0: 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e   /* Write conten
fe00: 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  t into this buff
fe10: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  er */.  int amt,
fe20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
fe40: 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
fe50: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
fe60: 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a   offset       /*
fe70: 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61   Begin reading a
fe80: 74 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f  t this offset */
fe90: 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .){.#if !SQLITE_
fea0: 4f 53 5f 57 49 4e 43 45 0a 20 20 4f 56 45 52 4c  OS_WINCE.  OVERL
feb0: 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64  APPED overlapped
fec0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
fed0: 65 20 6f 66 66 73 65 74 20 66 6f 72 20 52 65 61  e offset for Rea
fee0: 64 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66  dFile. */.#endif
fef0: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
ff00: 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
ff10: 3b 20 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c  ;  /* file handl
ff20: 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65  e */.  DWORD nRe
ff30: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
ff40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ff50: 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
ff60: 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 66 69 6c  ly read from fil
ff70: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72  e */.  int nRetr
ff80: 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
ff90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
ffa0: 20 6f 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20   of retrys */.. 
ffb0: 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
ffc0: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
ffd0: 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
ffe0: 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20  E_IOERR_READ);. 
fff0: 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
10000 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  %d lock=%d\n", p
10010 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
10020 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66  locktype));..#if
10030 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
10040 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e 46 69  .  if( seekWinFi
10050 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  le(pFile, offset
10060 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
10070 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d  SQLITE_FULL;.  }
10080 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61  .  while( !osRea
10090 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  dFile(pFile->h, 
100a0 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61  pBuf, amt, &nRea
100b0 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20  d, 0) ){.#else. 
100c0 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70   memset(&overlap
100d0 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  ped, 0, sizeof(O
100e0 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f  VERLAPPED));.  o
100f0 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
10100 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
10110 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
10120 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
10130 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29  setHigh = (LONG)
10140 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  ((offset>>32) & 
10150 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 77  0x7fffffff);.  w
10160 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c  hile( !osReadFil
10170 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66  e(pFile->h, pBuf
10180 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 26  , amt, &nRead, &
10190 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26 0a 20  overlapped) &&. 
101a0 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73          osGetLas
101b0 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f  tError()!=ERROR_
101c0 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23 65  HANDLE_EOF ){.#e
101d0 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 44 20 6c  ndif.    DWORD l
101e0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69 66  astErrno;.    if
101f0 28 20 72 65 74 72 79 49 6f 65 72 72 28 26 6e 52  ( retryIoerr(&nR
10200 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f  etry, &lastErrno
10210 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
10220 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
10230 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
10240 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
10250 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
10260 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d  ERR_READ, pFile-
10270 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
10280 20 20 20 20 20 20 20 20 20 22 77 69 6e 52 65 61           "winRea
10290 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  d", pFile->zPath
102a0 29 3b 0a 20 20 7d 0a 20 20 6c 6f 67 49 6f 65 72  );.  }.  logIoer
102b0 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 69 66 28  r(nRetry);.  if(
102c0 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29 61 6d   nRead<(DWORD)am
102d0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65  t ){.    /* Unre
102e0 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  ad parts of the 
102f0 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a  buffer must be z
10300 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ero-filled */.  
10310 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72    memset(&((char
10320 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20  *)pBuf)[nRead], 
10330 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20  0, amt-nRead);. 
10340 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10350 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
10360 44 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  D;.  }..  return
10370 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10380 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
10390 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
103a0 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
103b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
103c0 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
103d0 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
103e0 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
103f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
10400 6e 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  nWrite(.  sqlite
10410 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
10420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
10430 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  e to write into 
10440 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
10450 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
10460 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
10470 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
10480 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
104b0 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65  f bytes to write
104c0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
104d0 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20  t64 offset      
104e0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
104f0 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f  into the file to
10500 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61   begin writing a
10510 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
10520 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
10540 65 20 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f  e if error has o
10550 63 63 75 72 65 64 2c 20 65 6c 73 65 20 66 61 6c  ccured, else fal
10560 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20  se */.  winFile 
10570 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
10580 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20  e*)id;  /* File 
10590 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
105a0 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20  nRetry = 0;     
105b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
105c0 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65 73  umber of retries
105d0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61   */..  assert( a
105e0 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  mt>0 );.  assert
105f0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d  ( pFile );.  Sim
10600 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
10610 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
10620 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c  _WRITE);.  Simul
10630 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
10640 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46  (return SQLITE_F
10650 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  ULL);..  OSTRACE
10660 28 28 22 57 52 49 54 45 20 25 64 20 6c 6f 63 6b  (("WRITE %d lock
10670 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
10680 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
10690 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  e));..#if SQLITE
106a0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 72 63 20 3d  _OS_WINCE.  rc =
106b0 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69   seekWinFile(pFi
106c0 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  le, offset);.  i
106d0 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65 6c 73  f( rc==0 ){.#els
106e0 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66  e.  {.#endif.#if
106f0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
10700 45 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  E.    OVERLAPPED
10710 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20   overlapped;    
10720 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65      /* The offse
10730 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65 2e  t for WriteFile.
10740 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 75   */.#endif.    u
10750 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29  8 *aRem = (u8 *)
10760 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20  pBuf;        /* 
10770 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20 77  Data yet to be w
10780 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  ritten */.    in
10790 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20  t nRem = amt;   
107a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
107b0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 79  umber of bytes y
107c0 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  et to be written
107d0 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57   */.    DWORD nW
107e0 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
107f0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77        /* Bytes w
10800 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20 57  ritten by each W
10810 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20  riteFile() call 
10820 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73  */.    DWORD las
10830 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
10840 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65  R;   /* Value re
10850 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73  turned by GetLas
10860 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69 66  tError() */..#if
10870 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
10880 45 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  E.    memset(&ov
10890 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a  erlapped, 0, siz
108a0 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
108b0 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64  ;.    overlapped
108c0 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
108d0 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
108e0 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65 72 6c  ffff);.    overl
108f0 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
10900 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
10910 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
10920 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  fff);.#endif..  
10930 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20    while( nRem>0 
10940 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
10950 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 69 66 28  _WINCE.      if(
10960 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46   !osWriteFile(pF
10970 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52  ile->h, aRem, nR
10980 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20  em, &nWrite, 0) 
10990 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69  ){.#else.      i
109a0 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28  f( !osWriteFile(
109b0 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20  pFile->h, aRem, 
109c0 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26  nRem, &nWrite, &
109d0 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a 23  overlapped) ){.#
109e0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
109f0 28 20 72 65 74 72 79 49 6f 65 72 72 28 26 6e 52  ( retryIoerr(&nR
10a00 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f  etry, &lastErrno
10a10 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
10a20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10a30 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
10a40 74 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20  t( nWrite==0 || 
10a50 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e  nWrite<=(DWORD)n
10a60 52 65 6d 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Rem );.      if(
10a70 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57   nWrite==0 || nW
10a80 72 69 74 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d  rite>(DWORD)nRem
10a90 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
10aa0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
10ab0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
10ac0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
10ad0 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
10ae0 57 49 4e 43 45 0a 20 20 20 20 20 20 6f 66 66 73  WINCE.      offs
10af0 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  et += nWrite;.  
10b00 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
10b10 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f  ffset = (LONG)(o
10b20 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
10b30 66 66 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c  ff);.      overl
10b40 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
10b50 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
10b60 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
10b70 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  fff);.#endif.   
10b80 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74     aRem += nWrit
10b90 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d  e;.      nRem -=
10ba0 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20   nWrite;.    }. 
10bb0 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b     if( nRem>0 ){
10bc0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
10bd0 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
10be0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
10bf0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
10c00 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
10c10 28 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73  (   ( pFile->las
10c20 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41  tErrno==ERROR_HA
10c30 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29  NDLE_DISK_FULL )
10c40 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69  .       || ( pFi
10c50 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
10c60 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29  RROR_DISK_FULL )
10c70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10c80 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
10c90 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69   }.    return wi
10ca0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
10cb0 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46  _IOERR_WRITE, pF
10cc0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
10ce0 6e 57 72 69 74 65 22 2c 20 70 46 69 6c 65 2d 3e  nWrite", pFile->
10cf0 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
10d00 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52  .    logIoerr(nR
10d10 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74  etry);.  }.  ret
10d20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10d30 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
10d40 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f   an open file to
10d50 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a   a specified siz
10d60 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
10d70 77 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69  winTruncate(sqli
10d80 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71  te3_file *id, sq
10d90 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
10da0 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  e){.  winFile *p
10db0 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
10dc0 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61  )id;  /* File ha
10dd0 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndle object */. 
10de0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10df0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
10e00 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10e10 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  for this functio
10e20 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  n */..  assert( 
10e30 70 46 69 6c 65 20 29 3b 0a 0a 20 20 4f 53 54 52  pFile );..  OSTR
10e40 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 25  ACE(("TRUNCATE %
10e50 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65  d %lld\n", pFile
10e60 2d 3e 68 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20  ->h, nByte));.  
10e70 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
10e80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
10e90 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 0a  ERR_TRUNCATE);..
10ea0 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72    /* If the user
10eb0 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   has configured 
10ec0 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72  a chunk-size for
10ed0 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e   this file, trun
10ee0 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  cate the.  ** fi
10ef0 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f  le so that it co
10f00 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74  nsists of an int
10f10 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63  eger number of c
10f20 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a  hunks (i.e. the.
10f30 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65    ** actual file
10f40 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20   size after the 
10f50 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65  operation may be
10f60 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
10f70 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20   requested.  ** 
10f80 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  size)..  */.  if
10f90 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
10fa0 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  >0 ){.    nByte 
10fb0 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
10fc0 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
10fd0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
10fe0 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
10ff0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45  ;.  }..  /* SetE
11000 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72  ndOfFile() retur
11010 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  ns non-zero when
11020 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
11030 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69  zero when it fai
11040 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 65  ls. */.  if( see
11050 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20  kWinFile(pFile, 
11060 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63  nByte) ){.    rc
11070 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
11080 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
11090 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  CATE, pFile->las
110a0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
110b0 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74       "winTruncat
110c0 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e1", pFile->zPat
110d0 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  h);.  }else if( 
110e0 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c  0==osSetEndOfFil
110f0 65 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20  e(pFile->h) ){. 
11100 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
11110 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
11120 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d  rror();.    rc =
11130 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
11140 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
11150 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
11160 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
11170 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32     "winTruncate2
11180 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
11190 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  ;.  }..  OSTRACE
111a0 28 28 22 54 52 55 4e 43 41 54 45 20 25 64 20 25  (("TRUNCATE %d %
111b0 6c 6c 64 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65  lld %s\n", pFile
111c0 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 72 63 20 3f  ->h, nByte, rc ?
111d0 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
111e0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
111f0 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
11200 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
11210 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
11220 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
11230 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
11240 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
11250 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
11260 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
11270 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74  re occuring at t
11280 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a  he right times..
11290 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
112a0 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69  ync_count = 0;.i
112b0 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73  nt sqlite3_fulls
112c0 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ync_count = 0;.#
112d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  endif../*.** Mak
112e0 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65  e sure all write
112f0 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61  s to a particula
11300 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69  r file are commi
11310 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  tted to disk..*/
11320 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
11330 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
11340 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29   *id, int flags)
11350 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
11360 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20  _NO_SYNC.  /*.  
11370 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65  ** Used only whe
11380 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  n SQLITE_NO_SYNC
11390 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e   is not defined.
113a0 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63  .   */.  BOOL rc
113b0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
113c0 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c  fined(NDEBUG) ||
113d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
113e0 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20  _NO_SYNC) || \. 
113f0 20 20 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49     (defined(SQLI
11400 54 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69  TE_TEST) && defi
11410 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
11420 29 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65  )).  /*.  ** Use
11430 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f  d when SQLITE_NO
11440 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66  _SYNC is not def
11450 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68 65 20  ined and by the 
11460 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a  assert() and/or.
11470 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d    ** OSTRACE() m
11480 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77  acros..   */.  w
11490 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
114a0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65  (winFile*)id;.#e
114b0 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
114c0 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64  AMETER(id);.#end
114d0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  if..  assert( pF
114e0 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63  ile );.  /* Chec
114f0 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51  k that one of SQ
11500 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
11510 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73   or FULL was pas
11520 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
11530 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
11540 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
11550 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73  .      || (flags
11560 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
11570 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20  YNC_FULL.  );.. 
11580 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20   OSTRACE(("SYNC 
11590 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  %d lock=%d\n", p
115a0 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
115b0 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f  locktype));..  /
115c0 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
115d0 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
115e0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
115f0 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
11600 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
11610 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
11620 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
11630 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
11640 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
11650 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
11660 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
11670 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 23 69 66 6e  TE_FULL );..#ifn
11680 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
11690 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
116a0 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65  ER(flags);.#else
116b0 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26 30 78  .  if( (flags&0x
116c0 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
116d0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c  _FULL ){.    sql
116e0 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
116f0 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c  unt++;.  }.  sql
11700 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
11710 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
11720 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
11730 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
11740 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
11750 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
11760 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
11770 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
11780 53 59 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51  SYNC.  return SQ
11790 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
117a0 20 72 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c   rc = osFlushFil
117b0 65 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e  eBuffers(pFile->
117c0 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  h);.  SimulateIO
117d0 45 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20  Error( rc=FALSE 
117e0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
117f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11800 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
11810 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
11820 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
11830 72 6f 72 28 29 3b 0a 20 20 20 20 72 65 74 75 72  ror();.    retur
11840 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
11850 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
11860 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
11870 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
11880 20 22 77 69 6e 53 79 6e 63 22 2c 20 70 46 69 6c   "winSync", pFil
11890 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23  e->zPath);.  }.#
118a0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
118b0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
118c0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
118d0 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
118e0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69  static int winFi
118f0 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
11900 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
11910 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a  _int64 *pSize){.
11920 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
11930 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
11940 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
11950 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
11960 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d  ( id!=0 );.  Sim
11970 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
11980 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
11990 5f 46 53 54 41 54 29 3b 0a 23 69 66 20 53 51 4c  _FSTAT);.#if SQL
119a0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
119b0 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41  .    FILE_STANDA
119c0 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20  RD_INFO info;.  
119d0 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49    if( osGetFileI
119e0 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
119f0 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46  leEx(pFile->h, F
11a00 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c  ileStandardInfo,
11a10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a30 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69 7a        &info, siz
11a40 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20  eof(info)) ){.  
11a50 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66      *pSize = inf
11a60 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64  o.EndOfFile.Quad
11a70 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Part;.    }else{
11a80 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
11a90 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
11aa0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
11ab0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
11ac0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
11ad0 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61  FSTAT, pFile->la
11ae0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
11af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b00 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70  "winFileSize", p
11b10 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
11b20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
11b30 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70 65  {.    DWORD uppe
11b40 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44  rBits;.    DWORD
11b50 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20   lowerBits;.    
11b60 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
11b70 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20  ..    lowerBits 
11b80 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28  = osGetFileSize(
11b90 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72  pFile->h, &upper
11ba0 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a  Bits);.    *pSiz
11bb0 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69  e = (((sqlite3_i
11bc0 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29 3c  nt64)upperBits)<
11bd0 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73  <32) + lowerBits
11be0 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77  ;.    if(   (low
11bf0 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49  erBits == INVALI
11c00 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20  D_FILE_SIZE).   
11c10 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72      && ((lastErr
11c20 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
11c30 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52  ror())!=NO_ERROR
11c40 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
11c50 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
11c60 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
11c70 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
11c80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
11c90 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AT, pFile->lastE
11ca0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
11cb0 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22     "winFileSize"
11cc0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
11cd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
11ce0 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
11cf0 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45  ../*.** LOCKFILE
11d00 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
11d10 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f  Y is undefined o
11d20 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73  n some Windows s
11d30 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
11d40 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ef LOCKFILE_FAIL
11d50 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64  _IMMEDIATELY.# d
11d60 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46  efine LOCKFILE_F
11d70 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
11d80 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  1.#endif..#ifnde
11d90 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  f LOCKFILE_EXCLU
11da0 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  SIVE_LOCK.# defi
11db0 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  ne LOCKFILE_EXCL
11dc0 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e  USIVE_LOCK 2.#en
11dd0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f  dif../*.** Histo
11de0 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20  rically, SQLite 
11df0 68 61 73 20 75 73 65 64 20 62 6f 74 68 20 74 68  has used both th
11e00 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c  e LockFile and L
11e10 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69  ockFileEx functi
11e20 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ons..** When the
11e30 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69   LockFile functi
11e40 6f 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74 20  on was used, it 
11e50 77 61 73 20 61 6c 77 61 79 73 20 65 78 70 65 63  was always expec
11e60 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69  ted to fail.** i
11e70 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68  mmediately if th
11e80 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  e lock could not
11e90 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41   be obtained.  A
11ea0 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65  lso, it always e
11eb0 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62  xpected to.** ob
11ec0 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76  tain an exclusiv
11ed0 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66  e lock.  These f
11ee0 6c 61 67 73 20 61 72 65 20 75 73 65 64 20 77 69  lags are used wi
11ef0 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  th the LockFileE
11f00 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e  x function.** an
11f10 64 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20  d reflect those 
11f20 65 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68  expectations; th
11f30 65 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68  erefore, they sh
11f40 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e  ould not be chan
11f50 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ged..*/.#ifndef 
11f60 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
11f70 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53  FLAGS.# define S
11f80 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
11f90 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45  LAGS   (LOCKFILE
11fa0 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
11fb0 59 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20  Y | \.          
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fd0 20 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45          LOCKFILE
11fe0 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  _EXCLUSIVE_LOCK)
11ff0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
12000 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65  urrently, SQLite
12010 20 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65   never calls the
12020 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63   LockFileEx func
12030 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e  tion without wan
12040 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  ting the.** call
12050 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61   to fail immedia
12060 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  tely if the lock
12070 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
12080 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
12090 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
120a0 58 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65  X_FLAGS.# define
120b0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
120c0 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49  EX_FLAGS (LOCKFI
120d0 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
120e0 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ELY).#endif../*.
120f0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61  ** Acquire a rea
12100 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66  der lock..** Dif
12110 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69  ferent API routi
12120 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64  nes are called d
12130 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
12140 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a  her or not this.
12150 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57  ** is Win9x or W
12160 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inNT..*/.static 
12170 69 6e 74 20 67 65 74 52 65 61 64 4c 6f 63 6b 28  int getReadLock(
12180 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
12190 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 66  .  int res;.  if
121a0 28 20 69 73 4e 54 28 29 20 29 7b 0a 23 69 66 20  ( isNT() ){.#if 
121b0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
121c0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
121d0 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69  TE: Windows CE i
121e0 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72  s handled differ
121f0 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69  ently here due i
12200 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57  ts lack of the W
12210 69 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20 20 20  in32.    **     
12220 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78    API LockFileEx
12230 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 73  ..    */.    res
12240 20 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65   = winceLockFile
12250 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
12260 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20  ED_FIRST, 0, 1, 
12270 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65  0);.#else.    re
12280 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
12290 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
122a0 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41  E_LOCKFILEEX_FLA
122b0 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  GS, SHARED_FIRST
122c0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
122d0 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
122e0 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64  D_SIZE, 0);.#end
122f0 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  if.  }.#ifdef SQ
12300 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
12310 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
12320 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69  int lk;.    sqli
12330 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
12340 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b  izeof(lk), &lk);
12350 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72  .    pFile->shar
12360 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68  edLockByte = (sh
12370 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66  ort)((lk & 0x7ff
12380 66 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53  fffff)%(SHARED_S
12390 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72  IZE - 1));.    r
123a0 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
123b0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
123c0 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
123d0 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
123e0 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
123f0 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61  FIRST+pFile->sha
12400 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20  redLockByte, 0, 
12410 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  1, 0);.  }.#endi
12420 66 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30  f.  if( res == 0
12430 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
12440 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
12450 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
12460 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c   /* No need to l
12470 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20  og a failure to 
12480 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  lock */.  }.  re
12490 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
124a0 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f  ** Undo a readlo
124b0 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ck.*/.static int
124c0 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28   unlockReadLock(
124d0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
124e0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57  .  int res;.  DW
124f0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
12500 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
12510 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f     res = winUnlo
12520 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
12530 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
12540 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20  0, SHARED_SIZE, 
12550 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  0);.  }.#ifdef S
12560 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
12570 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
12580 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b   res = winUnlock
12590 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
125a0 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69  SHARED_FIRST+pFi
125b0 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
125c0 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  te, 0, 1, 0);.  
125d0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
125e0 65 73 3d 3d 30 20 26 26 20 28 28 6c 61 73 74 45  es==0 && ((lastE
125f0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
12600 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f  Error())!=ERROR_
12610 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20  NOT_LOCKED) ){. 
12620 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
12630 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
12640 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
12650 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e  (SQLITE_IOERR_UN
12660 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  LOCK, pFile->las
12670 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
12680 20 20 20 20 20 22 75 6e 6c 6f 63 6b 52 65 61 64       "unlockRead
12690 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Lock", pFile->zP
126a0 61 74 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ath);.  }.  retu
126b0 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
126c0 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
126d0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
126e0 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
126f0 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f  ter locktype - o
12700 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
12710 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
12720 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
12730 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
12740 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
12750 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
12760 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
12770 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
12780 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
12790 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
127a0 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
127b0 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
127c0 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
127d0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
127e0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
127f0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
12800 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
12810 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
12820 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
12830 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
12840 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
12850 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
12860 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
12870 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
12880 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
12890 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
128a0 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
128b0 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
128c0 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
128d0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
128e0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
128f0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
12900 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
12910 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
12920 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
12930 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
12940 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
12950 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
12960 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
12970 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12980 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
12990 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20  se a lock.  The 
129a0 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  winUnlock() rout
129b0 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c  ine.** erases al
129c0 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20  l locks at once 
129d0 61 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20 69  and returns us i
129e0 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f  mmediately to lo
129f0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a  cking level 0..*
12a00 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
12a10 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68  ible to lower th
12a20 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
12a30 6f 6e 65 20 73 74 65 70 20 61 74 20 61 20 74 69  one step at a ti
12a40 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74  me.  You.** must
12a50 20 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20   go straight to 
12a60 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e  locking level 0.
12a70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
12a80 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  inLock(sqlite3_f
12a90 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
12aa0 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
12ab0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
12ac0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
12ad0 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73  from subroutines
12ae0 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20   */.  int res = 
12af0 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1;           /* 
12b00 52 65 73 75 6c 74 20 6f 66 20 61 20 57 69 6e 64  Result of a Wind
12b10 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f  ows lock call */
12b20 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79  .  int newLockty
12b30 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74  pe;       /* Set
12b40 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
12b50 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62   to this value b
12b60 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
12b70 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e  .  int gotPendin
12b80 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75  gLock = 0;/* Tru
12b90 65 20 69 66 20 77 65 20 61 63 71 75 69 72 65 64  e if we acquired
12ba0 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
12bb0 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77  this time */.  w
12bc0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
12bd0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
12be0 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20  DWORD lastErrno 
12bf0 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61  = NO_ERROR;..  a
12c00 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
12c10 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
12c20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64   %d %d was %d(%d
12c30 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
12c40 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74   pFile->h, lockt
12c50 79 70 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ype, pFile->lock
12c60 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61  type, pFile->sha
12c70 72 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 0a  redLockByte));..
12c80 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
12c90 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
12ca0 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
12cb0 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
12cc0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46   on the.  ** OsF
12cd0 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e  ile, do nothing.
12ce0 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65   Don't use the e
12cf0 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
12d00 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69  th, as.  ** sqli
12d10 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  te3OsEnterMutex(
12d20 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
12d30 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
12d40 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
12d50 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29  type>=locktype )
12d60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
12d70 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
12d80 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
12d90 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
12da0 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f   is correct.  */
12db0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12dc0 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
12dd0 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d  OCK || locktype=
12de0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
12df0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
12e00 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe!=PENDING_LOCK
12e10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
12e20 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44  cktype!=RESERVED
12e30 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
12e40 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
12e50 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c  _LOCK );..  /* L
12e60 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f  ock the PENDING_
12e70 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65 20  LOCK byte if we 
12e80 6e 65 65 64 20 74 6f 20 61 63 71 75 69 72 65 20  need to acquire 
12e90 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f  a PENDING lock o
12ea0 72 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20  r.  ** a SHARED 
12eb0 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65  lock.  If we are
12ec0 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
12ed0 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63  RED lock, the ac
12ee0 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a  quisition of.  *
12ef0 2a 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f  * the PENDING_LO
12f00 43 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f  CK byte is tempo
12f10 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77  rary..  */.  new
12f20 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65  Locktype = pFile
12f30 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66  ->locktype;.  if
12f40 28 20 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  (   (pFile->lock
12f50 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20  type==NO_LOCK). 
12f60 20 20 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b      || (   (lock
12f70 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
12f80 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26  LOCK).         &
12f90 26 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  & (pFile->lockty
12fa0 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
12fb0 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  K)).  ){.    int
12fc0 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68   cnt = 3;.    wh
12fd0 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20  ile( cnt-->0 && 
12fe0 28 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69  (res = winLockFi
12ff0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
13000 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
13010 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AGS,.           
13020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45                PE
13040 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
13050 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 0))==0 ){.    
13060 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73    /* Try 3 times
13070 20 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64   to get the pend
13080 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20  ing lock.  This 
13090 69 73 20 6e 65 65 64 65 64 20 74 6f 20 77 6f 72  is needed to wor
130a0 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e  k.      ** aroun
130b0 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65  d problems cause
130c0 64 20 62 79 20 69 6e 64 65 78 69 6e 67 20 61 6e  d by indexing an
130d0 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75 73 20  d/or anti-virus 
130e0 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20 20 20  software on.    
130f0 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73    ** Windows sys
13100 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  tems..      ** I
13110 66 20 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20  f you are using 
13120 74 68 69 73 20 63 6f 64 65 20 61 73 20 61 20 6d  this code as a m
13130 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61  odel for alterna
13140 74 69 76 65 20 56 46 53 65 73 2c 20 64 6f 20 6e  tive VFSes, do n
13150 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  ot.      ** copy
13160 20 74 68 69 73 20 72 65 74 72 79 20 6c 6f 67 69   this retry logi
13170 63 2e 20 20 49 74 20 69 73 20 61 20 68 61 63 6b  c.  It is a hack
13180 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 69   intended for Wi
13190 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20  ndows only..    
131a0 20 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41    */.      OSTRA
131b0 43 45 28 28 22 63 6f 75 6c 64 20 6e 6f 74 20 67  CE(("could not g
131c0 65 74 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  et a PENDING loc
131d0 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e  k. cnt=%d\n", cn
131e0 74 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63  t));.      if( c
131f0 6e 74 20 29 20 73 71 6c 69 74 65 33 5f 77 69 6e  nt ) sqlite3_win
13200 33 32 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20 20  32_sleep(1);.   
13210 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e   }.    gotPendin
13220 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20  gLock = res;.   
13230 20 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20   if( !res ){.   
13240 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
13250 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
13260 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13270 20 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65   Acquire a share
13280 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  d lock.  */.  if
13290 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
132a0 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  ED_LOCK && res )
132b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
132c0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
132d0 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  O_LOCK );.    re
132e0 73 20 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28  s = getReadLock(
132f0 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  pFile);.    if( 
13300 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
13310 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  Locktype = SHARE
13320 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
13330 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  e{.      lastErr
13340 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
13350 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
13360 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
13370 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20   RESERVED lock. 
13380 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
13390 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
133a0 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
133b0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
133c0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
133d0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
133e0 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
133f0 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
13400 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20  LOCKFILE_FLAGS, 
13410 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
13420 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
13430 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
13440 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45  wLocktype = RESE
13450 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  RVED_LOCK;.    }
13460 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
13470 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
13480 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
13490 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
134a0 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  e a PENDING lock
134b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
134c0 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
134d0 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
134e0 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
134f0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
13500 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63     gotPendingLoc
13510 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k = 0;.  }..  /*
13520 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c   Acquire an EXCL
13530 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  USIVE lock.  */.
13540 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
13550 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
13560 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
13570 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
13580 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  type>=SHARED_LOC
13590 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 75  K );.    res = u
135a0 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46  nlockReadLock(pF
135b0 69 6c 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ile);.    OSTRAC
135c0 45 28 28 22 75 6e 72 65 61 64 6c 6f 63 6b 20 3d  E(("unreadlock =
135d0 20 25 64 5c 6e 22 2c 20 72 65 73 29 29 3b 0a 20   %d\n", res));. 
135e0 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b     res = winLock
135f0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
13600 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
13610 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49  FLAGS, SHARED_FI
13620 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  RST, 0,.        
13630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
13640 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
13650 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
13660 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
13670 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
13680 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13690 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
136a0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
136b0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
136c0 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64  "error-code = %d
136d0 5c 6e 22 2c 20 6c 61 73 74 45 72 72 6e 6f 29 29  \n", lastErrno))
136e0 3b 0a 20 20 20 20 20 20 67 65 74 52 65 61 64 4c  ;.      getReadL
136f0 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
13700 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77  }.  }..  /* If w
13710 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20  e are holding a 
13720 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61  PENDING lock tha
13730 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 72 65  t ought to be re
13740 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a  leased, then.  *
13750 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e 6f 77  * release it now
13760 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74  ..  */.  if( got
13770 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c  PendingLock && l
13780 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
13790 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
137a0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
137b0 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
137c0 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
137d0 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
137e0 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c  e state of the l
137f0 6f 63 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20  ock has held in 
13800 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
13810 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  tor then.  ** re
13820 74 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72  turn the appropr
13830 69 61 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65  iate result code
13840 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73  ..  */.  if( res
13850 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
13860 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
13870 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
13880 4f 43 4b 20 46 41 49 4c 45 44 20 25 64 20 74 72  OCK FAILED %d tr
13890 79 69 6e 67 20 66 6f 72 20 25 64 20 62 75 74 20  ying for %d but 
138a0 67 6f 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  got %d\n", pFile
138b0 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
138c0 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63  locktype, newLoc
138d0 6b 74 79 70 65 29 29 3b 0a 20 20 20 20 70 46 69  ktype));.    pFi
138e0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
138f0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72  lastErrno;.    r
13900 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
13910 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f  .  }.  pFile->lo
13920 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6e 65 77  cktype = (u8)new
13930 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  Locktype;.  retu
13940 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13950 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
13960 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
13970 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
13980 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
13990 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
139a0 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
139b0 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
139c0 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
139d0 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  ld, return.** no
139e0 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  n-zero, otherwis
139f0 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  e zero..*/.stati
13a00 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65  c int winCheckRe
13a10 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
13a20 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
13a30 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
13a40 74 20 72 63 3b 0a 20 20 77 69 6e 46 69 6c 65 20  t rc;.  winFile 
13a50 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
13a60 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
13a70 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
13a80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
13a90 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
13aa0 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ; );..  assert( 
13ab0 69 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  id!=0 );.  if( p
13ac0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
13ad0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
13ae0 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20  .    rc = 1;.   
13af0 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
13b00 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 6c  WR-LOCK %d %d (l
13b10 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  ocal)\n", pFile-
13b20 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 65 6c 73  >h, rc));.  }els
13b30 65 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  e{.    rc = winL
13b40 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
13b50 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
13b60 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56  LE_FLAGS, RESERV
13b70 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
13b80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
13b90 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b  .      winUnlock
13ba0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
13bb0 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
13bc0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
13bd0 20 20 20 72 63 20 3d 20 21 72 63 3b 0a 20 20 20     rc = !rc;.   
13be0 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
13bf0 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 28 72  WR-LOCK %d %d (r
13c00 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65  emote)\n", pFile
13c10 2d 3e 68 2c 20 72 63 29 29 3b 0a 20 20 7d 0a 20  ->h, rc));.  }. 
13c20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a   *pResOut = rc;.
13c30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13c40 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  OK;.}../*.** Low
13c50 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
13c60 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
13c70 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f  criptor id to lo
13c80 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70  cktype.  locktyp
13c90 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  e.** must be eit
13ca0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
13cb0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
13cc0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
13cd0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
13ce0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
13cf0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
13d00 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
13d10 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
13d20 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
13d30 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
13d40 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  .** It is not po
13d50 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73 20  ssible for this 
13d60 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c 20  routine to fail 
13d70 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  if the second ar
13d80 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f  gument.** is NO_
13d90 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73 65  LOCK.  If the se
13da0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
13db0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65   SHARED_LOCK the
13dc0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
13dd0 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20 53  * might return S
13de0 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a  QLITE_IOERR;.*/.
13df0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
13e00 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
13e10 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
13e20 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70 65  ype){.  int type
13e30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
13e40 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
13e50 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
13e60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
13e70 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
13e80 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70   assert( locktyp
13e90 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e<=SHARED_LOCK )
13ea0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
13eb0 4c 4f 43 4b 20 25 64 20 74 6f 20 25 64 20 77 61  LOCK %d to %d wa
13ec0 73 20 25 64 28 25 64 29 5c 6e 22 2c 20 70 46 69  s %d(%d)\n", pFi
13ed0 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
13ee0 0a 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65  .          pFile
13ef0 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c  ->locktype, pFil
13f00 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
13f10 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46  e));.  type = pF
13f20 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
13f30 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55   if( type>=EXCLU
13f40 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
13f50 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
13f60 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
13f70 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
13f80 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
13f90 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
13fa0 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65  ARED_LOCK && !ge
13fb0 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
13fc0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
13fd0 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
13fe0 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c  appen.  We shoul
13ff0 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65  d always be able
14000 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
14010 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
14020 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63  lock */.      rc
14030 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
14040 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
14050 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  CK, osGetLastErr
14060 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
14070 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22       "winUnlock"
14080 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
14090 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
140a0 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f   type>=RESERVED_
140b0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
140c0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
140d0 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
140e0 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
140f0 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  }.  if( locktype
14100 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70  ==NO_LOCK && typ
14110 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
14120 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 52 65 61 64  {.    unlockRead
14130 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d  Lock(pFile);.  }
14140 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e  .  if( type>=PEN
14150 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  DING_LOCK ){.   
14160 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
14170 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e  pFile->h, PENDIN
14180 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
14190 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c  ;.  }.  pFile->l
141a0 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f  ocktype = (u8)lo
141b0 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75 72 6e  cktype;.  return
141c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
141d0 20 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 74   *pArg is initit
141e0 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65 20 74  ially negative t
141f0 68 65 6e 20 74 68 69 73 20 69 73 20 61 20 71 75  hen this is a qu
14200 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72 67 20  ery.  Set *pArg 
14210 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64 65 70  to.** 1 or 0 dep
14220 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
14230 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d 61 73  r or not bit mas
14240 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c  k of pFile->ctrl
14250 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a  Flags is set..**
14260 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20  .** If *pArg is 
14270 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63 6c 65  0 or 1, then cle
14280 61 72 20 6f 72 20 73 65 74 20 74 68 65 20 6d 61  ar or set the ma
14290 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c 65 2d  sk bit of pFile-
142a0 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73  >ctrlFlags..*/.s
142b0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 6f  tatic void winMo
142c0 64 65 42 69 74 28 77 69 6e 46 69 6c 65 20 2a 70  deBit(winFile *p
142d0 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  File, unsigned c
142e0 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70  har mask, int *p
142f0 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72  Arg){.  if( *pAr
14300 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67  g<0 ){.    *pArg
14310 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46   = (pFile->ctrlF
14320 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b  lags & mask)!=0;
14330 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70  .  }else if( (*p
14340 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Arg)==0 ){.    p
14350 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
14360 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73  &= ~mask;.  }els
14370 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  e{.    pFile->ct
14380 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b  rlFlags |= mask;
14390 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  .  }.}../* Forwa
143a0 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
143b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
143c0 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
143d0 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a  f, char *zBuf);.
143e0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61  ./*.** Control a
143f0 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68 65 20  nd query of the 
14400 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
14410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14420 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  winFileControl(s
14430 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
14440 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
14450 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  Arg){.  winFile 
14460 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
14470 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28  e*)id;.  switch(
14480 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
14490 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
144a0 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
144b0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
144c0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
144d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
144e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
144f0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53   case SQLITE_LAS
14500 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
14510 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28   *(int*)pArg = (
14520 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45  int)pFile->lastE
14530 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
14540 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14550 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
14560 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f  ITE_FCNTL_CHUNK_
14570 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46  SIZE: {.      pF
14580 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a  ile->szChunk = *
14590 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20  (int *)pArg;.   
145a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
145b0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
145c0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
145d0 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20  _SIZE_HINT: {.  
145e0 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73      if( pFile->s
145f0 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
14600 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
14610 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20  4 oldSz;.       
14620 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c   int rc = winFil
14630 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a  eSize(id, &oldSz
14640 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
14650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14660 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14670 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20  3_int64 newSz = 
14680 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a  *(sqlite3_int64*
14690 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20  )pArg;.         
146a0 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a   if( newSz>oldSz
146b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
146c0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
146d0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
146e0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
146f0 75 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a  uncate(id, newSz
14700 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  );.            S
14710 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
14720 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20  nign(0);.       
14730 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
14740 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
14750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14780 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45   SQLITE_FCNTL_PE
14790 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20  RSIST_WAL: {.   
147a0 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46     winModeBit(pF
147b0 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52  ile, WINFILE_PER
147c0 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29  SIST_WAL, (int*)
147d0 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74  pArg);.      ret
147e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
147f0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
14800 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
14810 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20  SAFE_OVERWRITE: 
14820 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42  {.      winModeB
14830 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c  it(pFile, WINFIL
14840 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41  E_PSOW, (int*)pA
14850 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rg);.      retur
14860 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
14870 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
14880 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
14890 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72  : {.      *(char
148a0 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
148b0 33 5f 6d 70 72 69 6e 74 66 28 22 77 69 6e 33 32  3_mprintf("win32
148c0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
148d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
148e0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
148f0 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56  E_FCNTL_WIN32_AV
14900 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20 20 20 20  _RETRY: {.      
14910 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70  int *a = (int*)p
14920 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 61  Arg;.      if( a
14930 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  [0]>0 ){.       
14940 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79   win32IoerrRetry
14950 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d   = a[0];.      }
14960 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b  else{.        a[
14970 30 5d 20 3d 20 77 69 6e 33 32 49 6f 65 72 72 52  0] = win32IoerrR
14980 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20  etry;.      }.  
14990 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30 20 29      if( a[1]>0 )
149a0 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33 32 49  {.        win32I
149b0 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
149c0 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c   a[1];.      }el
149d0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d  se{.        a[1]
149e0 20 3d 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74   = win32IoerrRet
149f0 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d  ryDelay;.      }
14a00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
14a10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
14a20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
14a30 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d  CNTL_TEMPFILENAM
14a40 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  E: {.      char 
14a50 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  *zTFile = sqlite
14a60 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 46 69  3MallocZero( pFi
14a70 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  le->pVfs->mxPath
14a80 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66  name );.      if
14a90 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20  ( zTFile ){.    
14aa0 20 20 20 20 67 65 74 54 65 6d 70 6e 61 6d 65 28      getTempname(
14ab0 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50  pFile->pVfs->mxP
14ac0 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29  athname, zTFile)
14ad0 3b 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72  ;.        *(char
14ae0 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65  **)pArg = zTFile
14af0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14b00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14b10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
14b20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
14b30 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OUND;.}../*.** R
14b40 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
14b50 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
14b60 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
14b70 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
14b80 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
14b90 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
14ba0 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
14bb0 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
14bc0 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
14bd0 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
14be0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
14bf0 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
14c00 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
14c10 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
14c20 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
14c30 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
14c40 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
14c50 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
14c60 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
14c70 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
14c80 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
14c90 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
14ca0 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
14cb0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
14cc0 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
14cd0 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  int winSectorSiz
14ce0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
14cf0 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b  id){.  (void)id;
14d00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14d10 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
14d20 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  SIZE;.}../*.** R
14d30 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f  eturn a vector o
14d40 66 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  f device charact
14d50 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61  eristics..*/.sta
14d60 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63  tic int winDevic
14d70 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
14d80 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14d90 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  d){.  winFile *p
14da0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
14db0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14dc0 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
14dd0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20  LE_WHEN_OPEN |. 
14de0 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72          ((p->ctr
14df0 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45  lFlags & WINFILE
14e00 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f  _PSOW)?SQLITE_IO
14e10 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
14e20 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 23  ERWRITE:0);.}..#
14e30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14e40 49 54 5f 57 41 4c 0a 0a 2f 2a 20 0a 2a 2a 20 57  IT_WAL../* .** W
14e50 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79  indows will only
14e60 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65 20   let you create 
14e70 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e  file view mappin
14e80 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74  gs.** on allocat
14e90 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61  ion size granula
14ea0 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e  rity boundaries.
14eb0 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74  .** During sqlit
14ec0 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20  e3_os_init() we 
14ed0 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e  do a GetSystemIn
14ee0 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74  fo().** to get t
14ef0 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73  he granularity s
14f00 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f 49  ize..*/.SYSTEM_I
14f10 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a  NFO winSysInfo;.
14f20 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
14f30 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
14f40 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
14f50 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
14f60 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
14f70 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
14f80 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 77 69  o protect the wi
14f90 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74  nLockInfo object
14fa0 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74 68  s used by .** th
14fb0 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20  is file, all of 
14fc0 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 68 61  which may be sha
14fd0 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
14fe0 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
14ff0 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75  unction winShmMu
15000 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65  texHeld() is use
15010 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  d to assert() th
15020 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  at the global mu
15030 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64 20  tex .** is held 
15040 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54  when required. T
15050 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
15060 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
15070 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a 2a  t of assert() .*
15080 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e  * statements. e.
15090 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68  g..**.**   winSh
150a0 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a  mEnterMutex().**
150b0 20 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e       assert( win
150c0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
150d0 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61  ;.**   winShmLea
150e0 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61  veMutex().*/.sta
150f0 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45  tic void winShmE
15100 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
15110 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15120 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
15130 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
15140 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
15150 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  TER));.}.static 
15160 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65  void winShmLeave
15170 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
15180 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
15190 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  ve(sqlite3MutexA
151a0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
151b0 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
151c0 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  );.}.#ifdef SQLI
151d0 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
151e0 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  int winShmMutexH
151f0 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
15200 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
15210 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d  ex_held(sqlite3M
15220 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
15230 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
15240 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  STER));.}.#endif
15250 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75  ../*.** Object u
15260 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
15270 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f   a single file o
15280 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65  pened and mmappe
15290 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20  d to provide.** 
152a0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
152b0 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68  When multiple th
152c0 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65  reads all refere
152d0 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  nce the same.** 
152e0 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63  log-summary, eac
152f0 68 20 74 68 72 65 61 64 20 68 61 73 20 69 74 73  h thread has its
15300 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a   own winFile obj
15310 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c  ect, but they al
15320 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20  l.** point to a 
15330 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20  single instance 
15340 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20  of this object. 
15350 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
15360 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d   each.** log-sum
15370 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f  mary is opened o
15380 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f  nly once per pro
15390 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53  cess..**.** winS
153a0 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
153b0 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20  st be true when 
153c0 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74  creating or dest
153d0 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f  roying.** this o
153e0 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72  bject or while r
153f0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
15400 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
15410 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  fields:.**.**   
15420 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20     nRef.**      
15430 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68 65  pNext .**.** The
15440 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
15450 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  s are read-only 
15460 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74  after the object
15470 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20   is created:.** 
15480 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20  .**      fid.** 
15490 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a       zFilename.*
154a0 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69 6e 53  *.** Either winS
154b0 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73  hmNode.mutex mus
154c0 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77 69 6e  t be held or win
154d0 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20  ShmNode.nRef==0 
154e0 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74  and.** winShmMut
154f0 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65  exHeld() is true
15500 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72   when reading or
15510 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68   writing any oth
15520 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74  er field.** in t
15530 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  his structure..*
15540 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53  *.*/.struct winS
15550 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74  hmNode {.  sqlit
15560 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b  e3_mutex *mutex;
15570 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74        /* Mutex t
15580 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62  o access this ob
15590 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ject */.  char *
155a0 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  zFilename;      
155b0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
155c0 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69  the file */.  wi
155d0 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 20  nFile hFile;    
155e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
155f0 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e   handle from win
15600 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73  Open */..  int s
15610 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  zRegion;        
15620 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
15630 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
15640 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  egions */.  int 
15650 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  nRegion;        
15660 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
15670 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e  f array apRegion
15680 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 68 6d   */.  struct Shm
15690 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e  Region {.    HAN
156a0 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20  DLE hMap;       
156b0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61        /* File ha
156c0 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65  ndle from Create
156d0 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20  FileMapping */. 
156e0 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20     void *pMap;. 
156f0 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44   } *aRegion;.  D
15700 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
15710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15720 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66   Windows errno f
15730 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f  rom the last I/O
15740 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74   error */..  int
15750 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
15760 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15770 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65  r of winShm obje
15780 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
15790 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  this */.  winShm
157a0 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
157b0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53       /* All winS
157c0 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
157d0 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
157e0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65   winShmNode *pNe
157f0 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  xt;         /* N
15800 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61  ext in list of a
15810 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ll winShmNode ob
15820 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 65 66 20  jects */.#ifdef 
15830 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
15840 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20  8 nextShmId;    
15850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
15860 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e 53  t available winS
15870 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23  hm.id value */.#
15880 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
15890 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f  A global array o
158a0 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65  f all winShmNode
158b0 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20   objects..**.** 
158c0 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  The winShmMutexH
158d0 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
158e0 75 65 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ue while reading
158f0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 69 73   or writing this
15900 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
15910 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e   winShmNode *win
15920 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b  ShmNodeList = 0;
15930 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72  ../*.** Structur
15940 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  e used internall
15950 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74 6f  y by this VFS to
15960 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61 74   record the stat
15970 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20  e of an.** open 
15980 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
15990 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nnection..**.** 
159a0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
159b0 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c  elds are initial
159c0 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f  ized when this o
159d0 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
159e0 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64   and.** are read
159f0 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72  -only thereafter
15a00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68  :.**.**    winSh
15a10 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20  m.pShmNode.**   
15a20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a   winShm.id.**.**
15a30 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c 64   All other field
15a40 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74 65  s are read/write
15a50 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e 70 53  .  The winShm.pS
15a60 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75  hmNode->mutex mu
15a70 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
15a80 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e  ile accessing an
15a90 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65  y read/write fie
15aa0 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77  lds..*/.struct w
15ab0 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d  inShm {.  winShm
15ac0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
15ad0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
15ae0 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  rlying winShmNod
15af0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69  e object */.  wi
15b00 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20  nShm *pNext;    
15b10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
15b20 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74 68 65   winShm with the
15b30 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65   same winShmNode
15b40 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65   */.  u8 hasMute
15b50 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
15b60 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64   /* True if hold
15b70 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f  ing the winShmNo
15b80 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31  de mutex */.  u1
15b90 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  6 sharedMask;   
15ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
15bb0 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
15bc0 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65   held */.  u16 e
15bd0 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
15be0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
15bf0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
15c00 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66 20   held */.#ifdef 
15c10 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
15c20 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  8 id;           
15c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20            /* Id 
15c40 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
15c50 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e 53  on with its winS
15c60 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66  hmNode */.#endif
15c70 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
15c80 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
15c90 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
15ca0 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20   WIN_SHM_BASE   
15cb0 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  ((22+SQLITE_SHM_
15cc0 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20  NLOCK)*4)       
15cd0 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62   /* first lock b
15ce0 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  yte */.#define W
15cf0 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 57  IN_SHM_DMS    (W
15d00 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49  IN_SHM_BASE+SQLI
15d10 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f  TE_SHM_NLOCK)  /
15d20 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68  * deadman switch
15d30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
15d40 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
15d50 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73 20  for all n bytes 
15d60 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73  beginning at ofs
15d70 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53  t..*/.#define _S
15d80 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66  HM_UNLCK  1.#def
15d90 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20  ine _SHM_RDLCK  
15da0 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57  2.#define _SHM_W
15db0 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20 69  RLCK  3.static i
15dc0 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  nt winShmSystemL
15dd0 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  ock(.  winShmNod
15de0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20  e *pFile,    /* 
15df0 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74  Apply locks to t
15e00 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d  his open shared-
15e10 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
15e20 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  /.  int lockType
15e30 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53 48  ,         /* _SH
15e40 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44  M_UNLCK, _SHM_RD
15e50 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c  LCK, or _SHM_WRL
15e60 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  CK */.  int ofst
15e70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
15e80 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   Offset to first
15e90 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b   byte to be lock
15ea0 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20  ed/unlocked */. 
15eb0 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20   int nByte      
15ec0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15ed0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
15ee0 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29  k or unlock */.)
15ef0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  {.  int rc = 0; 
15f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
15f10 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f  ult code form Lo
15f20 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28  ck/UnlockFileEx(
15f30 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
15f40 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e  s to the winShmN
15f50 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65  ode object is se
15f60 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20  rialized by the 
15f70 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65  caller */.  asse
15f80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15f90 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75  x_held(pFile->mu
15fa0 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e  tex) || pFile->n
15fb0 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
15fc0 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20  Release/Acquire 
15fd0 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
15fe0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c   lock */.  if( l
15ff0 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e  ockType==_SHM_UN
16000 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LCK ){.    rc = 
16010 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
16020 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f  File->hFile.h, o
16030 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30  fst, 0, nByte, 0
16040 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16050 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
16060 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65  e locking parame
16070 74 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52  ters */.    DWOR
16080 44 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b  D dwFlags = LOCK
16090 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
160a0 41 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c  ATELY;.    if( l
160b0 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f  ockType == _SHM_
160c0 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20  WRLCK ) dwFlags 
160d0 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  |= LOCKFILE_EXCL
160e0 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
160f0 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  rc = winLockFile
16100 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68  (&pFile->hFile.h
16110 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c  , dwFlags, ofst,
16120 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20   0, nByte, 0);. 
16130 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d   }.  .  if( rc!=
16140 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53   0 ){.    rc = S
16150 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
16160 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
16170 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74  stErrno =  osGet
16180 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
16190 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
161a0 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  Y;.  }..  OSTRAC
161b0 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64 20  E(("SHM-LOCK %d 
161c0 25 73 20 25 73 20 30 78 25 30 38 6c 78 5c 6e 22  %s %s 0x%08lx\n"
161d0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  , .           pF
161e0 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20  ile->hFile.h,.  
161f0 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
16200 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20  ITE_OK ? "ok" : 
16210 22 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 20 20  "failed",.      
16220 20 20 20 20 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f       lockType==_
16230 53 48 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e 6c  SHM_UNLCK ? "Unl
16240 6f 63 6b 46 69 6c 65 45 78 22 20 3a 20 22 4c 6f  ockFileEx" : "Lo
16250 63 6b 46 69 6c 65 45 78 22 2c 0a 20 20 20 20 20  ckFileEx",.     
16260 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
16270 74 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 72 65 74  tErrno));..  ret
16280 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
16290 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
162a0 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20   to VFS methods 
162b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
162c0 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  nOpen(sqlite3_vf
162d0 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73  s*,const char*,s
162e0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
162f0 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69  ,int*);.static i
16300 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c  nt winDelete(sql
16310 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74  ite3_vfs *,const
16320 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a   char*,int);../*
16330 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77 69  .** Purge the wi
16340 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73  nShmNodeList lis
16350 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  t of all entries
16360 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65   with winShmNode
16370 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
16380 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
16390 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
163a0 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
163b0 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
163c0 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
163d0 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
163e0 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
163f0 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75  ic void winShmPu
16400 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  rge(sqlite3_vfs 
16410 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74  *pVfs, int delet
16420 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d  eFlag){.  winShm
16430 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e  Node **pp;.  win
16440 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42 4f  ShmNode *p;.  BO
16450 4f 4c 20 62 52 63 3b 0a 20 20 61 73 73 65 72 74  OL bRc;.  assert
16460 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
16470 64 28 29 20 29 3b 0a 20 20 70 70 20 3d 20 26 77  d() );.  pp = &w
16480 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20  inShmNodeList;. 
16490 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70 70   while( (p = *pp
164a0 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
164b0 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  p->nRef==0 ){.  
164c0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
164d0 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 20   if( p->mutex ) 
164e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
164f0 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  ee(p->mutex);.  
16500 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
16510 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b  ->nRegion; i++){
16520 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f  .        bRc = o
16530 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
16540 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70  (p->aRegion[i].p
16550 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  Map);.        OS
16560 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
16570 45 20 70 69 64 2d 25 64 20 75 6e 6d 61 70 20 72  E pid-%d unmap r
16580 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c 0a  egion=%d %s\n",.
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165a0 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65   (int)osGetCurre
165b0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69  ntProcessId(), i
165c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
165d0 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20     bRc ? "ok" : 
165e0 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
165f0 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73      bRc = osClos
16600 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69  eHandle(p->aRegi
16610 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20  on[i].hMap);.   
16620 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53       OSTRACE(("S
16630 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64 20  HM-PURGE pid-%d 
16640 63 6c 6f 73 65 20 72 65 67 69 6f 6e 3d 25 64 20  close region=%d 
16650 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
16660 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73 47          (int)osG
16670 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
16680 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20 20  Id(), i,.       
16690 20 20 20 20 20 20 20 20 20 20 62 52 63 20 3f 20            bRc ? 
166a0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
166b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
166c0 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68 20   if( p->hFile.h 
166d0 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  != INVALID_HANDL
166e0 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20  E_VALUE ){.     
166f0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
16700 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
16710 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73       winClose((s
16720 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
16730 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  ->hFile);.      
16740 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
16750 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
16760 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65    }.      if( de
16770 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  leteFlag ){.    
16780 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
16790 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
167a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
167b0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
167c0 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65 6c  ;.        winDel
167d0 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69  ete(pVfs, p->zFi
167e0 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  lename, 0);.    
167f0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
16800 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
16810 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16820 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
16830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
16840 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
16850 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
16860 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20  (p->aRegion);.  
16870 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
16880 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (p);.    }else{.
16890 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70        pp = &p->p
168a0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
168b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
168c0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
168d0 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20  area associated 
168e0 77 69 74 68 20 64 61 74 61 62 61 73 65 20 66 69  with database fi
168f0 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20  le pDbFd..**.** 
16900 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e  When opening a n
16910 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ew shared-memory
16920 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68   file, if no oth
16930 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  er instances of 
16940 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65  that.** file are
16950 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c   currently open,
16960 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
16970 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f   or in other pro
16980 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20  cesses, then.** 
16990 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65  the file must be
169a0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
169b0 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76  ro length or hav
169c0 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65  e its header cle
169d0 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
169e0 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72 65  int winOpenShare
169f0 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20  dMemory(winFile 
16a00 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63  *pDbFd){.  struc
16a10 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20  t winShm *p;    
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16a30 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
16a40 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
16a50 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e    struct winShmN
16a60 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
16a70 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  0;   /* The unde
16a80 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66  rlying mmapped f
16a90 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ile */.  int rc;
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16ac0 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
16ad0 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
16ae0 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  e *pNew;        
16af0 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f     /* Newly allo
16b00 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65  cated winShmNode
16b10 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
16b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b30 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
16b40 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74   of zName in byt
16b50 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  es */..  assert(
16b60 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
16b70 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65  );    /* Not pre
16b80 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a  viously opened *
16b90 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  /..  /* Allocate
16ba0 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
16bb0 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f  ew sqlite3_shm o
16bc0 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65  bject.  Also spe
16bd0 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20  culatively.  ** 
16be0 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
16bf0 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e  or a new winShmN
16c00 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65  ode and filename
16c10 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
16c20 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
16c30 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
16c40 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
16c50 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
16c60 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20  OMEM;.  nName = 
16c70 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
16c80 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
16c90 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d   pNew = sqlite3M
16ca0 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
16cb0 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
16cc0 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69  Name + 17 );.  i
16cd0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
16ce0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
16cf0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
16d00 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
16d10 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46  ;.  }.  pNew->zF
16d20 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
16d30 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c  )&pNew[1];.  sql
16d40 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e  ite3_snprintf(nN
16d50 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46  ame+15, pNew->zF
16d60 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d  ilename, "%s-shm
16d70 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
16d80 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53  ;.  sqlite3FileS
16d90 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50  uffix3(pDbFd->zP
16da0 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  ath, pNew->zFile
16db0 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20 4c 6f  name); ..  /* Lo
16dc0 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ok to see if the
16dd0 72 65 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e  re is an existin
16de0 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61  g winShmNode tha
16df0 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20  t can be used.. 
16e00 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69   ** If no matchi
16e10 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75  ng winShmNode cu
16e20 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20  rrently exists, 
16e30 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  create a new one
16e40 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45  ..  */.  winShmE
16e50 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66  nterMutex();.  f
16e60 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69  or(pShmNode = wi
16e70 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53  nShmNodeList; pS
16e80 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65  hmNode; pShmNode
16e90 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74  =pShmNode->pNext
16ea0 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65  ){.    /* TBD ne
16eb0 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69  ed to come up wi
16ec0 74 68 20 62 65 74 74 65 72 20 6d 61 74 63 68 20  th better match 
16ed0 68 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20  here.  Perhaps. 
16ee0 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49     ** use FILE_I
16ef0 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20  D_BOTH_DIR_INFO 
16f00 53 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a  Structure..    *
16f10 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
16f20 33 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64  3StrICmp(pShmNod
16f30 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e  e->zFilename, pN
16f40 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d  ew->zFilename)==
16f50 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  0 ) break;.  }. 
16f60 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b   if( pShmNode ){
16f70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
16f80 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65  e(pNew);.  }else
16f90 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d  {.    pShmNode =
16fa0 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20   pNew;.    pNew 
16fb0 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69  = 0;.    ((winFi
16fc0 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e  le*)(&pShmNode->
16fd0 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56  hFile))->h = INV
16fe0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
16ff0 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  E;.    pShmNode-
17000 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e  >pNext = winShmN
17010 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e  odeList;.    win
17020 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53  ShmNodeList = pS
17030 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68  hmNode;..    pSh
17040 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73  mNode->mutex = s
17050 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
17060 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
17070 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70  FAST);.    if( p
17080 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d  ShmNode->mutex==
17090 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
170a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
170b0 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  EM;.      goto s
170c0 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
170d0 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   }..    rc = win
170e0 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73  Open(pDbFd->pVfs
170f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17100 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69     pShmNode->zFi
17110 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  lename,         
17120 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
17130 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20  he file (UTF-8) 
17140 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
17150 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c      (sqlite3_fil
17160 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  e*)&pShmNode->hF
17170 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61  ile,  /* File ha
17180 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 20  ndle here */.   
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
171a0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20  LITE_OPEN_WAL | 
171b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
171c0 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
171d0 50 45 4e 5f 43 52 45 41 54 45 2c 20 2f 2a 20 4d  PEN_CREATE, /* M
171e0 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 20  ode flags */.   
171f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
17200 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
17210 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20  _OK!=rc ){.     
17220 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
17230 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rr;.    }..    /
17240 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
17250 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  f another proces
17260 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
17270 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68   dead-man switch
17280 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c  ..    ** If not,
17290 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
172a0 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
172b0 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  h. .    */.    i
172c0 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  f( winShmSystemL
172d0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
172e0 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_WRLCK, WIN_SH
172f0 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54  M_DMS, 1)==SQLIT
17300 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
17310 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28   = winTruncate((
17320 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
17330 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
17340 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
17350 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
17360 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
17370 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
17380 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f  IOERR_SHMOPEN, o
17390 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
173a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
173b0 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20    "winOpenShm", 
173c0 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
173d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
173e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
173f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53  OK ){.      winS
17400 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
17410 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43  mNode, _SHM_UNLC
17420 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
17430 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  1);.      rc = w
17440 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
17450 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52  pShmNode, _SHM_R
17460 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  DLCK, WIN_SHM_DM
17470 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  S, 1);.    }.   
17480 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
17490 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d  hm_open_err;.  }
174a0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20  ..  /* Make the 
174b0 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  new connection a
174c0 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69   child of the wi
174d0 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d  nShmNode */.  p-
174e0 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
174f0 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Node;.#ifdef SQL
17500 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69  ITE_DEBUG.  p->i
17510 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65  d = pShmNode->ne
17520 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69  xtShmId++;.#endi
17530 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  f.  pShmNode->nR
17540 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70  ef++;.  pDbFd->p
17550 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68  Shm = p;.  winSh
17560 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  mLeaveMutex();..
17570 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
17580 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
17590 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
175a0 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
175b0 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
175c0 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69   cover of the wi
175d0 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
175e0 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70   mutex and the p
175f0 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a  ointer from the.
17600 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74    ** new (struct
17610 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20   winShm) object 
17620 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20  to the pShmNode 
17630 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c  has been set. Al
17640 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c  l that is.  ** l
17650 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20  eft to do is to 
17660 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a  link the new obj
17670 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ect into the lin
17680 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e  ked list startin
17690 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f  g.  ** at pShmNo
176a0 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73  de->pFirst. This
176b0 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68   must be done wh
176c0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
176d0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
176e0 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a  .  ** mutex..  *
176f0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
17700 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
17710 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70  ->mutex);.  p->p
17720 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  Next = pShmNode-
17730 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e  >pFirst;.  pShmN
17740 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b  ode->pFirst = p;
17750 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
17760 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
17770 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
17780 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
17790 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20  /* Jump here on 
177a0 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d  any error */.shm
177b0 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e  _open_err:.  win
177c0 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
177d0 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c  hmNode, _SHM_UNL
177e0 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
177f0 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72   1);.  winShmPur
17800 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
17810 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73  0);      /* This
17820 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
17830 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
17840 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
17850 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ee(p);.  sqlite3
17860 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77  _free(pNew);.  w
17870 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
17880 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17890 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
178a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
178b0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
178c0 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
178d0 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65  ying .** storage
178e0 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
178f0 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
17900 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61  c int winShmUnma
17910 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
17920 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
17930 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
17940 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
17950 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  y */.  int delet
17960 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
17970 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65    /* Delete afte
17980 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75  r closing if tru
17990 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  e */.){.  winFil
179a0 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20  e *pDbFd;       
179b0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
179c0 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
179d0 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  y */.  winShm *p
179e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
179f0 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
17a00 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
17a10 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
17a20 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e  mNode; /* The un
17a30 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
17a40 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
17a50 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20   winShm **pp;   
17a60 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
17a70 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69  oping over sibli
17a80 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
17a90 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69  /..  pDbFd = (wi
17aa0 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  nFile*)fd;.  p =
17ab0 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
17ac0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
17ad0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
17ae0 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
17af0 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d  mNode;..  /* Rem
17b00 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ove connection p
17b10 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66   from the set of
17b20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73   connections ass
17b30 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74  ociated.  ** wit
17b40 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  h pShmNode */.  
17b50 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
17b60 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
17b70 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26  tex);.  for(pp=&
17b80 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
17b90 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d  ; (*pp)!=p; pp =
17ba0 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b   &(*pp)->pNext){
17bb0 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65  }.  *pp = p->pNe
17bc0 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  xt;..  /* Free t
17bd0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  he connection p 
17be0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
17bf0 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70  e(p);.  pDbFd->p
17c00 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Shm = 0;.  sqlit
17c10 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
17c20 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
17c30 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f  ..  /* If pShmNo
17c40 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61  de->nRef has rea
17c50 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f  ched 0, then clo
17c60 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  se the underlyin
17c70 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65  g.  ** shared-me
17c80 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a  mory file, too *
17c90 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
17ca0 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
17cb0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
17cc0 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
17cd0 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
17ce0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
17cf0 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50  0 ){.    winShmP
17d00 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
17d10 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20  , deleteFlag);. 
17d20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65   }.  winShmLeave
17d30 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75  Mutex();..  retu
17d40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17d50 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
17d60 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
17d70 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
17d80 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   segment..*/.sta
17d90 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f  tic int winShmLo
17da0 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
17db0 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
17dc0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
17dd0 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
17de0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
17df0 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
17e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
17e10 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71  irst lock to acq
17e20 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
17e30 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
17e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  /* Number of loc
17e60 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ks to acquire or
17e70 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
17e80 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
17e90 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
17ea0 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
17eb0 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  lock */.){.  win
17ec0 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77  File *pDbFd = (w
17ed0 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20  inFile*)fd;     
17ee0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
17ef0 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20   holding shared 
17f00 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53  memory */.  winS
17f10 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
17f20 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
17f30 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20    /* The shared 
17f40 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63  memory being loc
17f50 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ked */.  winShm 
17f60 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
17f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17f80 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
17f90 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20  er all siblings 
17fa0 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
17fb0 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
17fc0 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ShmNode;.  int r
17fd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
18000 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20  */.  u16 mask;  
18010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
18030 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74  sk of locks to t
18040 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ake or release *
18050 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73  /..  assert( ofs
18060 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d  t>=0 && ofst+n<=
18070 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
18080 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   );.  assert( n>
18090 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
180a0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
180b0 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
180c0 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
180d0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
180e0 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
180f0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
18100 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c  USIVE).       ||
18110 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
18120 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
18130 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
18140 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
18150 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
18160 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
18170 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20  _EXCLUSIVE) );. 
18180 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
18190 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
181a0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21  _SHM_EXCLUSIVE)!
181b0 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
181c0 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74  (u16)((1U<<(ofst
181d0 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74  +n)) - (1U<<ofst
181e0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  ));.  assert( n>
181f0 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f  1 || mask==(1<<o
18200 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  fst) );.  sqlite
18210 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
18220 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
18230 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
18240 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
18250 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61  ){.    u16 allMa
18260 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20  sk = 0; /* Mask 
18270 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
18280 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20   siblings */..  
18290 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20    /* See if any 
182a0 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68  siblings hold th
182b0 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a  is same lock */.
182c0 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
182d0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
182e0 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
182f0 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20        if( pX==p 
18300 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
18310 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65    assert( (pX->e
18320 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78  xclMask & (p->ex
18330 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64  clMask|p->shared
18340 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Mask))==0 );.   
18350 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58     allMask |= pX
18360 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
18370 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f    }..    /* Unlo
18380 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  ck the system-le
18390 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  vel locks */.   
183a0 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c   if( (mask & all
183b0 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
183c0 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
183d0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
183e0 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66  , _SHM_UNLCK, of
183f0 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
18400 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
18410 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18420 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
18430 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
18440 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
18450 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18460 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
18470 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
18480 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
18490 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
184a0 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
184b0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
184c0 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
184d0 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
184e0 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
184f0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
18500 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
18510 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
18520 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
18530 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
18540 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
18550 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
18560 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
18570 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
18580 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
18590 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
185a0 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
185b0 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
185c0 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
185d0 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
185e0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
185f0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
18600 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
18610 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
18620 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
18630 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
18640 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
18650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
18660 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
18670 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
18680 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
18690 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
186a0 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
186b0 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
186c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
186d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
186e0 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
186f0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
18700 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
18710 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
18720 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  de, _SHM_RDLCK, 
18730 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
18740 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  E, n);.      }el
18750 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
18760 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
18770 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
18780 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  * Get the local 
18790 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a  shared locks */.
187a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
187b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
187c0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
187d0 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
187e0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  lse{.    /* Make
187f0 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67   sure no sibling
18800 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c   connections hol
18810 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c  d locks that wil
18820 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20  l block this.   
18830 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e   ** lock.  If an
18840 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c  y do, return SQL
18850 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61  ITE_BUSY right a
18860 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  way..    */.    
18870 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
18880 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
18890 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
188a0 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
188b0 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c  ask & mask)!=0 |
188c0 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  | (pX->sharedMas
188d0 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
188e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
188f0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
18900 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
18910 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
18920 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   Get the exclusi
18930 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ve locks at the 
18940 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54  system level.  T
18950 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75  hen if successfu
18960 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61  l.    ** also ma
18970 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  rk the local con
18980 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67  nection as being
18990 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a   locked..    */.
189a0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
189b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
189c0 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
189d0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f  Lock(pShmNode, _
189e0 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b  SHM_WRLCK, ofst+
189f0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  WIN_SHM_BASE, n)
18a00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
18a10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18a20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
18a30 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
18a40 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
18a50 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
18a60 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
18a70 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
18a80 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
18a90 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
18aa0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
18ab0 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20  -LOCK shmid-%d, 
18ac0 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c  pid-%d got %03x,
18ad0 25 30 33 78 20 25 73 5c 6e 22 2c 0a 20 20 20 20  %03x %s\n",.    
18ae0 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 28 69         p->id, (i
18af0 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e 74 50  nt)osGetCurrentP
18b00 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 73  rocessId(), p->s
18b10 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78  haredMask, p->ex
18b20 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20  clMask,.        
18b30 20 20 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22     rc ? "failed"
18b40 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74   : "ok"));.  ret
18b50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18b60 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d   Implement a mem
18b70 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d  ory barrier or m
18b80 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73  emory fence on s
18b90 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a  hared memory.  .
18ba0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20  **.** All loads 
18bb0 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e  and stores begun
18bc0 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72   before the barr
18bd0 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  ier must complet
18be0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20  e before.** any 
18bf0 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65  load or store be
18c00 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61  gun after the ba
18c10 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrier..*/.static
18c20 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72   void winShmBarr
18c30 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ier(.  sqlite3_f
18c40 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20  ile *fd         
18c50 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
18c60 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
18c70 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55  memory */.){.  U
18c80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
18c90 66 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79  fd);.  /* Memory
18ca0 42 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f  Barrier(); // do
18cb0 65 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64  es not work -- d
18cc0 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e  o not know why n
18cd0 6f 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  ot */.  winShmEn
18ce0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69  terMutex();.  wi
18cf0 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
18d00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
18d10 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
18d20 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70  ed to obtain a p
18d30 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e  ointer to region
18d40 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20   iRegion of the 
18d50 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  .** shared-memor
18d60 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
18d70 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
18d80 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d  ile fd. Shared-m
18d90 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a  emory regions .*
18da0 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  * are numbered s
18db0 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72  tarting from zer
18dc0 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d  o. Each shared-m
18dd0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20  emory region is 
18de0 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74  szRegion .** byt
18df0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
18e00 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
18e10 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
18e20 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
18e30 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74  and *pp is set t
18e40 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74  o NULL..**.** Ot
18e50 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
18e60 69 73 57 72 69 74 65 20 70 61 72 61 6d 65 74 65  isWrite paramete
18e70 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72  r is 0 and the r
18e80 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
18e90 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e  memory.** region
18ea0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
18eb0 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20  located (by any 
18ec0 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e  client, includin
18ed0 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e  g one running in
18ee0 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70   a.** separate p
18ef0 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70  rocess), then *p
18f00 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
18f10 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
18f20 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20  eturned. If .** 
18f30 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
18f40 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75  ero and the requ
18f50 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
18f60 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  ory region has n
18f70 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20  ot yet .** been 
18f80 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73  allocated, it is
18f90 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
18fa0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
18fb0 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
18fc0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
18fd0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
18fe0 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20  allocated or is 
18ff0 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
19000 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73  this call as des
19010 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68  cribed above, th
19020 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20  en it is mapped 
19030 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
19040 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  ses .** address 
19050 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20  space (if it is 
19060 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70  not already), *p
19070 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  p is set to poin
19080 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20  t to the mapped 
19090 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  .** memory and S
190a0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
190b0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
190c0 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71   winShmMap(.  sq
190d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
190e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
190f0 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
19100 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
19110 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
19120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19130 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
19140 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
19150 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19170 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
19180 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74   */.  int isWrit
19190 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
191a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
191b0 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
191c0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
191d0 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
191e0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
191f0 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
19200 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  mory */.){.  win
19210 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77  File *pDbFd = (w
19220 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69  inFile*)fd;.  wi
19230 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  nShm *p = pDbFd-
19240 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e  >pShm;.  winShmN
19250 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
19260 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
19270 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29  _OK;..  if( !p )
19280 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70  {.    rc = winOp
19290 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  enSharedMemory(p
192a0 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72  DbFd);.    if( r
192b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
192c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20  eturn rc;.    p 
192d0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
192e0 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20   }.  pShmNode = 
192f0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
19300 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
19310 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
19320 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
19330 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f  szRegion==pShmNo
19340 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20  de->szRegion || 
19350 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
19360 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  n==0 );..  if( p
19370 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
19380 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  <=iRegion ){.   
19390 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f   struct ShmRegio
193a0 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20  n *apNew;       
193b0 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69      /* New aRegi
193c0 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  on[] array */.  
193d0 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69    int nByte = (i
193e0 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69  Region+1)*szRegi
193f0 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  on;  /* Minimum 
19400 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  required file si
19410 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ze */.    sqlite
19420 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20  3_int64 sz;     
19430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19440 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  Current size of 
19450 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a  wal-index file *
19460 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  /..    pShmNode-
19470 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65  >szRegion = szRe
19480 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  gion;..    /* Th
19490 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
194a0 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64  on is not mapped
194b0 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
194c0 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
194d0 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b  ce..    ** Check
194e0 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61   to see if it ha
194f0 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
19500 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61   (i.e. if the wa
19510 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a  l-index file is.
19520 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f      ** large eno
19530 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ugh to contain t
19540 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
19550 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ion)..    */.   
19560 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
19570 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
19580 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
19590 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66  le, &sz);.    if
195a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
195b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
195c0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
195d0 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
195e0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
195f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19600 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70   "winShmMap1", p
19610 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
19620 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
19630 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
19640 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b   if( sz<nByte ){
19650 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  .      /* The re
19660 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
19670 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
19680 78 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65  xist. If isWrite
19690 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
196a0 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65   ** zero, exit e
196b0 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62  arly. *pp will b
196c0 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  e set to NULL an
196d0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
196e0 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rned..      **. 
196f0 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74       ** Alternat
19700 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74  ively, if isWrit
19710 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75  e is non-zero, u
19720 73 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74  se ftruncate() t
19730 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20  o allocate.     
19740 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65   ** the requeste
19750 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e  d memory region.
19760 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
19770 69 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67  if( !isWrite ) g
19780 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
19790 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54  .      rc = winT
197a0 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33  runcate((sqlite3
197b0 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
197c0 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29  e->hFile, nByte)
197d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
197e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
197f0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
19800 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
19810 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65  RR_SHMSIZE, osGe
19820 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
19830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
19840 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62  winShmMap2", pDb
19850 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
19860 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
19870 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
19880 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20    }..    /* Map 
19890 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
198a0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f  mory region into
198b0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
198c0 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a  address space. *
198d0 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73  /.    apNew = (s
198e0 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
198f0 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
19900 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  c(.        pShmN
19910 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69  ode->aRegion, (i
19920 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66  Region+1)*sizeof
19930 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29  (apNew[0]).    )
19940 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77  ;.    if( !apNew
19950 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
19960 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
19970 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
19980 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
19990 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  .    pShmNode->a
199a0 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
199b0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d  .    while( pShm
199c0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
199d0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Region ){.      
199e0 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55  HANDLE hMap = NU
199f0 4c 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66  LL;         /* f
19a00 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64  ile-mapping hand
19a10 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64  le */.      void
19a20 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20   *pMap = 0;     
19a30 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65          /* Mappe
19a40 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
19a50 2a 2f 0a 20 20 20 20 20 0a 23 69 66 20 53 51 4c  */.     .#if SQL
19a60 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
19a70 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
19a80 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
19a90 6d 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  mApp(pShmNode->h
19aa0 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20  File.h,.        
19ab0 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
19ac0 44 57 52 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e  DWRITE, nByte, N
19ad0 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c  ULL.      );.#el
19ae0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
19af0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
19b00 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f  ).      hMap = o
19b10 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
19b20 6e 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  ngW(pShmNode->hF
19b30 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20  ile.h, .        
19b40 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
19b50 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65  DWRITE, 0, nByte
19b60 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
19b70 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
19b80 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
19b90 4e 53 49 29 0a 20 20 20 20 20 20 68 4d 61 70 20  NSI).      hMap 
19ba0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
19bb0 70 70 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d  ppingA(pShmNode-
19bc0 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20  >hFile.h, .     
19bd0 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f       NULL, PAGE_
19be0 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42  READWRITE, 0, nB
19bf0 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
19c00 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
19c10 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
19c20 50 20 70 69 64 2d 25 64 20 63 72 65 61 74 65 20  P pid-%d create 
19c30 72 65 67 69 6f 6e 3d 25 64 20 6e 62 79 74 65 3d  region=%d nbyte=
19c40 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
19c50 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73           (int)os
19c60 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
19c70 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d  sId(), pShmNode-
19c80 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c  >nRegion, nByte,
19c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19ca0 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66  hMap ? "ok" : "f
19cb0 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
19cc0 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20  if( hMap ){.    
19cd0 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20      int iOffset 
19ce0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  = pShmNode->nReg
19cf0 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20  ion*szRegion;.  
19d00 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65        int iOffse
19d10 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74  tShift = iOffset
19d20 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77   % winSysInfo.dw
19d30 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c  AllocationGranul
19d40 61 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54  arity;.#if SQLIT
19d50 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20  E_OS_WINRT.     
19d60 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56     pMap = osMapV
19d70 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
19d80 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f  (hMap, FILE_MAP_
19d90 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50  WRITE | FILE_MAP
19da0 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
19db0 20 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66     iOffset - iOf
19dc0 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67  fsetShift, szReg
19dd0 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69  ion + iOffsetShi
19de0 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65  ft.        );.#e
19df0 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70  lse.        pMap
19e00 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
19e10 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41  le(hMap, FILE_MA
19e20 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d  P_WRITE | FILE_M
19e30 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20  AP_READ,.       
19e40 20 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20       0, iOffset 
19e50 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20  - iOffsetShift, 
19e60 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73  szRegion + iOffs
19e70 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20  etShift.        
19e80 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
19e90 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
19ea0 4d 41 50 20 70 69 64 2d 25 64 20 6d 61 70 20 72  MAP pid-%d map r
19eb0 65 67 69 6f 6e 3d 25 64 20 6f 66 66 73 65 74 3d  egion=%d offset=
19ec0 25 64 20 73 69 7a 65 3d 25 64 20 25 73 5c 6e 22  %d size=%d %s\n"
19ed0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19ee0 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72     (int)osGetCur
19ef0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
19f00 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
19f10 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20  on, iOffset,.   
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
19f30 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22  Region, pMap ? "
19f40 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
19f50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19f60 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20  if( !pMap ){.   
19f70 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c       pShmNode->l
19f80 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
19f90 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
19fa0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
19fb0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
19fc0 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e  RR_SHMMAP, pShmN
19fd0 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ode->lastErrno,.
19fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ff0 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c 20 70   "winShmMap3", p
1a000 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1a010 20 20 20 20 20 20 69 66 28 20 68 4d 61 70 20 29        if( hMap )
1a020 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68   osCloseHandle(h
1a030 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  Map);.        go
1a040 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
1a050 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
1a060 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
1a070 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
1a080 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61 70 3b  on].pMap = pMap;
1a090 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1a0a0 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  >aRegion[pShmNod
1a0b0 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d 61 70  e->nRegion].hMap
1a0c0 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20 20 70   = hMap;.      p
1a0d0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1a0e0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73  ++;.    }.  }..s
1a0f0 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  hmpage_out:.  if
1a100 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
1a110 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20  ion>iRegion ){. 
1a120 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
1a130 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f   iRegion*szRegio
1a140 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73  n;.    int iOffs
1a150 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65  etShift = iOffse
1a160 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  t % winSysInfo.d
1a170 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
1a180 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68 61 72  larity;.    char
1a190 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29 70 53   *p = (char *)pS
1a1a0 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b  hmNode->aRegion[
1a1b0 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b 0a 20  iRegion].pMap;. 
1a1c0 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64 20 2a     *pp = (void *
1a1d0 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69 66 74  )&p[iOffsetShift
1a1e0 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
1a1f0 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  *pp = 0;.  }.  s
1a200 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1a210 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
1a220 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
1a230 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66  ;.}..#else.# def
1a240 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20 20 20  ine winShmMap   
1a250 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e    0.# define win
1a260 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64  ShmLock    0.# d
1a270 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72  efine winShmBarr
1a280 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77  ier 0.# define w
1a290 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23  inShmUnmap   0.#
1a2a0 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66  endif /* #ifndef
1a2b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1a2c0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20   */../*.** Here 
1a2d0 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ends the impleme
1a2e0 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73  ntation of all s
1a2f0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
1a300 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ods..**.********
1a310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
1a320 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nd sqlite3_file 
1a330 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a  Methods ********
1a340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a350 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
1a360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a3a0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  ******/../*.** T
1a3b0 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e  his vector defin
1a3c0 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f  es all the metho
1a3d0 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72  ds that can oper
1a3e0 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c  ate on an.** sql
1a3f0 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69  ite3_file for wi
1a400 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  n32..*/.static c
1a410 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1a420 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74  methods winIoMet
1a430 68 6f 64 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20  hod = {.  2,    
1a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
1a460 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c  rsion */.  winCl
1a470 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1a480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
1a490 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61  lose */.  winRea
1a4a0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1a4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
1a4c0 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65  ad */.  winWrite
1a4d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a4e0 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
1a4f0 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61  e */.  winTrunca
1a500 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1a510 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
1a520 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63  ate */.  winSync
1a530 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a540 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e           /* xSyn
1a550 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69  c */.  winFileSi
1a560 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
1a570 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53         /* xFileS
1a580 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b  ize */.  winLock
1a590 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a5a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
1a5b0 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b  k */.  winUnlock
1a5c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a5d0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
1a5e0 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52  k */.  winCheckR
1a5f0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
1a600 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
1a610 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a  ReservedLock */.
1a620 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c    winFileControl
1a630 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a640 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
1a650 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72  l */.  winSector
1a660 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
1a670 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f         /* xSecto
1a680 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65  rSize */.  winDe
1a690 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1a6a0 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44  ics,       /* xD
1a6b0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1a6c0 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  tics */.  winShm
1a6d0 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  Map,            
1a6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
1a6f0 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mMap */.  winShm
1a700 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1a710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
1a720 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68  mLock */.  winSh
1a730 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20  mBarrier,       
1a740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1a750 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77  hmBarrier */.  w
1a760 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 20 20 20  inShmUnmap      
1a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a780 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 7d  * xShmUnmap */.}
1a790 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;../************
1a7a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a7b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a7c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a7d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a7e0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1a7f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71  ************* sq
1a800 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
1a810 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
1a820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
1a830 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69  *.** This divisi
1a840 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
1a850 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
1a860 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65  f methods on the
1a870 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20  .** sqlite3_vfs 
1a880 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  object..*/../*.*
1a890 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
1a8a0 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20  8 filename into 
1a8b0 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68  whatever form th
1a8c0 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
1a8d0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
1a8e0 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73   wants filenames
1a8f0 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68   in.  Space to h
1a900 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  old the result.*
1a910 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
1a920 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75  om malloc and mu
1a930 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
1a940 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75  he calling.** fu
1a950 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  nction..*/.stati
1a960 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72 74 55  c void *convertU
1a970 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73  tf8Filename(cons
1a980 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1a990 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  e){.  void *zCon
1a9a0 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66  verted = 0;.  if
1a9b0 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
1a9c0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 75 74 66  zConverted = utf
1a9d0 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
1a9e0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65  name);.  }.#ifde
1a9f0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
1aa00 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
1aa10 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
1aa20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
1aa30 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46 69 6c  tf8_to_mbcs(zFil
1aa40 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65 6e 64  ename);.  }.#end
1aa50 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77  if.  /* caller w
1aa60 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ill handle out o
1aa70 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65  f memory */.  re
1aa80 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b  turn zConverted;
1aa90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
1aaa0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
1aab0 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20  e name in zBuf. 
1aac0 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 69   zBuf must be bi
1aad0 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68  g enough to.** h
1aae0 6f 6c 64 20 61 74 20 70 56 66 73 2d 3e 6d 78 50  old at pVfs->mxP
1aaf0 61 74 68 6e 61 6d 65 20 63 68 61 72 61 63 74 65  athname characte
1ab00 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
1ab10 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  t getTempname(in
1ab20 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
1ab30 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  uf){.  static ch
1ab40 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20  ar zChars[] =.  
1ab50 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
1ab60 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
1ab70 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
1ab80 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
1ab90 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22      "0123456789"
1aba0 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b  ;.  size_t i, j;
1abb0 0a 20 20 69 6e 74 20 6e 54 65 6d 70 50 61 74 68  .  int nTempPath
1abc0 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61  ;.  char zTempPa
1abd0 74 68 5b 4d 41 58 5f 50 41 54 48 2b 32 5d 3b 0a  th[MAX_PATH+2];.
1abe0 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74  .  /* It's odd t
1abf0 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f  o simulate an io
1ac00 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74  -error here, but
1ac10 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20   really this is 
1ac20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20  just.  ** using 
1ac30 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66  the io-error inf
1ac40 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74  rastructure to t
1ac50 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
1ac60 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a  handles this.  *
1ac70 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69  * function faili
1ac80 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ng. .  */.  Simu
1ac90 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
1aca0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1acb0 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 7a 54   );..  memset(zT
1acc0 65 6d 70 50 61 74 68 2c 20 30 2c 20 4d 41 58 5f  empPath, 0, MAX_
1acd0 50 41 54 48 2b 32 29 3b 0a 0a 20 20 69 66 28 20  PATH+2);..  if( 
1ace0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
1acf0 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71  ectory ){.    sq
1ad00 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
1ad10 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d  AX_PATH-30, zTem
1ad20 70 50 61 74 68 2c 20 22 25 73 22 2c 20 73 71 6c  pPath, "%s", sql
1ad30 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
1ad40 6f 72 79 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53  ory);.  }.#if !S
1ad50 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
1ad60 20 65 6c 73 65 20 69 66 28 20 69 73 4e 54 28 29   else if( isNT()
1ad70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   ){.    char *zM
1ad80 75 6c 74 69 3b 0a 20 20 20 20 57 43 48 41 52 20  ulti;.    WCHAR 
1ad90 7a 57 69 64 65 50 61 74 68 5b 4d 41 58 5f 50 41  zWidePath[MAX_PA
1ada0 54 48 5d 3b 0a 20 20 20 20 6f 73 47 65 74 54 65  TH];.    osGetTe
1adb0 6d 70 50 61 74 68 57 28 4d 41 58 5f 50 41 54 48  mpPathW(MAX_PATH
1adc0 2d 33 30 2c 20 7a 57 69 64 65 50 61 74 68 29 3b  -30, zWidePath);
1add0 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 75 6e  .    zMulti = un
1ade0 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64  icodeToUtf8(zWid
1adf0 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  ePath);.    if( 
1ae00 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20  zMulti ){.      
1ae10 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1ae20 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54  (MAX_PATH-30, zT
1ae30 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 7a  empPath, "%s", z
1ae40 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71  Multi);.      sq
1ae50 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74  lite3_free(zMult
1ae60 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i);.    }else{. 
1ae70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ae80 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1ae90 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
1aea0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
1aeb0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
1aec0 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a     char *zUtf8;.
1aed0 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73 50 61      char zMbcsPa
1aee0 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20  th[MAX_PATH];.  
1aef0 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41    osGetTempPathA
1af00 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 4d  (MAX_PATH-30, zM
1af10 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20 7a 55  bcsPath);.    zU
1af20 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f 77 69  tf8 = sqlite3_wi
1af30 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
1af40 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20  (zMbcsPath);.   
1af50 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20   if( zUtf8 ){.  
1af60 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1af70 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30  intf(MAX_PATH-30
1af80 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73  , zTempPath, "%s
1af90 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ", zUtf8);.     
1afa0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55   sqlite3_free(zU
1afb0 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  tf8);.    }else{
1afc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1afd0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1afe0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1aff0 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  if.#endif..  /* 
1b000 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
1b010 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20  utput buffer is 
1b020 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
1b030 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
1b040 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20  ile .  ** name. 
1b050 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65  If it is not, re
1b060 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1b070 52 2e 0a 20 20 2a 2f 0a 20 20 6e 54 65 6d 70 50  R..  */.  nTempP
1b080 61 74 68 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ath = sqlite3Str
1b090 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29  len30(zTempPath)
1b0a0 3b 0a 0a 20 20 69 66 28 20 28 6e 54 65 6d 70 50  ;..  if( (nTempP
1b0b0 61 74 68 20 2b 20 73 71 6c 69 74 65 33 53 74 72  ath + sqlite3Str
1b0c0 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d  len30(SQLITE_TEM
1b0d0 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b  P_FILE_PREFIX) +
1b0e0 20 31 38 29 20 3e 3d 20 6e 42 75 66 20 29 7b 0a   18) >= nBuf ){.
1b0f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b100 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
1b110 66 6f 72 28 69 3d 6e 54 65 6d 70 50 61 74 68 3b  for(i=nTempPath;
1b120 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61 74   i>0 && zTempPat
1b130 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d  h[i-1]=='\\'; i-
1b140 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68  -){}.  zTempPath
1b150 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69  [i] = 0;..  sqli
1b160 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
1b170 66 2d 31 38 2c 20 7a 42 75 66 2c 20 28 6e 54 65  f-18, zBuf, (nTe
1b180 6d 70 50 61 74 68 20 3e 20 30 29 20 3f 0a 20 20  mpPath > 0) ?.  
1b190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1a0 20 20 20 20 20 22 25 73 5c 5c 22 53 51 4c 49 54       "%s\\"SQLIT
1b1b0 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
1b1c0 49 58 20 3a 20 53 51 4c 49 54 45 5f 54 45 4d 50  IX : SQLITE_TEMP
1b1d0 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 0a 20 20  _FILE_PREFIX,.  
1b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b1f0 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 6a   zTempPath);.  j
1b200 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1b210 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69  30(zBuf);.  sqli
1b220 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31  te3_randomness(1
1b230 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
1b240 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
1b250 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42  ++, j++){.    zB
1b260 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43  uf[j] = (char)zC
1b270 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
1b280 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28   char)zBuf[j])%(
1b290 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
1b2a0 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b  ) ];.  }.  zBuf[
1b2b0 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a  j] = 0;.  zBuf[j
1b2c0 2b 31 5d 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52  +1] = 0;..  OSTR
1b2d0 41 43 45 28 28 22 54 45 4d 50 20 46 49 4c 45 4e  ACE(("TEMP FILEN
1b2e0 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66  AME: %s\n", zBuf
1b2f0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
1b300 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  ITE_OK; .}../*.*
1b310 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
1b320 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20   the named file 
1b330 69 73 20 72 65 61 6c 6c 79 20 61 20 64 69 72 65  is really a dire
1b340 63 74 6f 72 79 2e 20 20 52 65 74 75 72 6e 20 66  ctory.  Return f
1b350 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74 20 69 73  alse if.** it is
1b360 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
1b370 20 74 68 61 6e 20 61 20 64 69 72 65 63 74 6f 72   than a director
1b380 79 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  y, or if there i
1b390 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65  s any kind of me
1b3a0 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  mory.** allocati
1b3b0 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
1b3c0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44  tatic int winIsD
1b3d0 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  ir(const void *z
1b3e0 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20 20 44 57  Converted){.  DW
1b3f0 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20  ORD attr;.  int 
1b400 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  rc = 0;.  DWORD 
1b410 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66  lastErrno;..  if
1b420 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
1b430 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
1b440 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52   WIN32_FILE_ATTR
1b450 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72  IBUTE_DATA sAttr
1b460 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74  Data;.    memset
1b470 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20  (&sAttrData, 0, 
1b480 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61  sizeof(sAttrData
1b490 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21  ));.    while( !
1b4a0 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  (rc = osGetFileA
1b4b0 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50  ttributesExW((LP
1b4c0 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
1b4d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47                 G
1b4f0 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e  etFileExInfoStan
1b500 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  dard,.          
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 20 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20     &sAttrData)) 
1b530 26 26 20 72 65 74 72 79 49 6f 65 72 72 28 26 63  && retryIoerr(&c
1b540 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
1b550 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72 63 20  ){}.    if( !rc 
1b560 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b570 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61  0; /* Invalid na
1b580 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  me? */.    }.   
1b590 20 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74   attr = sAttrDat
1b5a0 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
1b5b0 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  es;.#if SQLITE_O
1b5c0 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c  S_WINCE==0.  }el
1b5d0 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f  se{.    attr = o
1b5e0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
1b5f0 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  esA((char*)zConv
1b600 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
1b610 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61 74 74   }.  return (att
1b620 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
1b630 41 54 54 52 49 42 55 54 45 53 29 20 26 26 20 28  ATTRIBUTES) && (
1b640 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42  attr&FILE_ATTRIB
1b650 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a  UTE_DIRECTORY);.
1b660 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
1b670 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1b680 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73  int winOpen(.  s
1b690 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1b6a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ,        /* Not 
1b6b0 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
1b6c0 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
1b6d0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1b6e0 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20  he file (UTF-8) 
1b6f0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
1b700 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f  e *id,         /
1b710 2a 20 57 72 69 74 65 20 74 68 65 20 53 51 4c 69  * Write the SQLi
1b720 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68  te file handle h
1b730 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
1b740 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
1b750 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20     /* Open mode 
1b760 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  flags */.  int *
1b770 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20  pOutFlags       
1b780 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72       /* Status r
1b790 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29  eturn flags */.)
1b7a0 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20  {.  HANDLE h;.  
1b7b0 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
1b7c0 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72  .  DWORD dwDesir
1b7d0 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52  edAccess;.  DWOR
1b7e0 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20  D dwShareMode;. 
1b7f0 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f   DWORD dwCreatio
1b800 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20  nDisposition;.  
1b810 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64  DWORD dwFlagsAnd
1b820 41 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a  Attributes = 0;.
1b830 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1b840 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70  NCE.  int isTemp
1b850 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77   = 0;.#endif.  w
1b860 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
1b870 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
1b880 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
1b890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1b8a0 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53  * Filename in OS
1b8b0 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63   encoding */.  c
1b8c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38  onst char *zUtf8
1b8d0 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a  Name = zName; /*
1b8e0 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46   Filename in UTF
1b8f0 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  -8 encoding */. 
1b900 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20   int cnt = 0;.. 
1b910 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20   /* If argument 
1b920 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20  zPath is a NULL 
1b930 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
1b940 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  nction is requir
1b950 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ed to open.  ** 
1b960 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
1b970 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65  . Use this buffe
1b980 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
1b990 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a  ile name in..  *
1b9a0 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d  /.  char zTmpnam
1b9b0 65 5b 4d 41 58 5f 50 41 54 48 2b 32 5d 3b 20 20  e[MAX_PATH+2];  
1b9c0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65     /* Buffer use
1b9d0 64 20 74 6f 20 63 72 65 61 74 65 20 74 65 6d 70  d to create temp
1b9e0 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a 20 20   filename */..  
1b9f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1ba00 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
1ba10 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72  * Function Retur
1ba20 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64  n Code */.#if !d
1ba30 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
1ba40 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  | SQLITE_OS_WINC
1ba50 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20  E.  int eType = 
1ba60 66 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30  flags&0xFFFFFF00
1ba70 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69  ;  /* Type of fi
1ba80 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65  le to open */.#e
1ba90 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78  ndif..  int isEx
1baa0 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67  clusive  = (flag
1bab0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
1bac0 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e  EXCLUSIVE);.  in
1bad0 74 20 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d  t isDelete     =
1bae0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1baf0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
1bb00 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72  OSE);.  int isCr
1bb10 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  eate     = (flag
1bb20 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
1bb30 43 52 45 41 54 45 29 3b 0a 23 69 66 6e 64 65 66  CREATE);.#ifndef
1bb40 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73   NDEBUG.  int is
1bb50 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c  Readonly   = (fl
1bb60 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1bb70 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 23 65 6e  N_READONLY);.#en
1bb80 64 69 66 0a 20 20 69 6e 74 20 69 73 52 65 61 64  dif.  int isRead
1bb90 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
1bba0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
1bbb0 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64  ADWRITE);..#ifnd
1bbc0 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20  ef NDEBUG.  int 
1bbd0 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20  isOpenJournal = 
1bbe0 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
1bbf0 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
1bc00 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
1bc10 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
1bc20 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1bc30 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
1bc40 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
1bc50 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
1bc60 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  L.  ));.#endif..
1bc70 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66    /* Check the f
1bc80 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
1bc90 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20  nts are true: . 
1bca0 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45   **.  **   (a) E
1bcb0 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68  xactly one of th
1bcc0 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20  e READWRITE and 
1bcd0 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d  READONLY flags m
1bce0 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20  ust be set, and 
1bcf0 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43  .  **   (b) if C
1bd00 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68  REATE is set, th
1bd10 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73  en READWRITE mus
1bd20 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61  t also be set, a
1bd30 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66  nd.  **   (c) if
1bd40 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65   EXCLUSIVE is se
1bd50 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
1bd60 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
1bd70 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44  .  **   (d) if D
1bd80 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20  ELETEONCLOSE is 
1bd90 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
1bda0 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
1bdb0 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  t..  */.  assert
1bdc0 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20  ((isReadonly==0 
1bdd0 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d  || isReadWrite==
1bde0 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69  0) && (isReadWri
1bdf0 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79  te || isReadonly
1be00 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43  ));.  assert(isC
1be10 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65  reate==0 || isRe
1be20 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65  adWrite);.  asse
1be30 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d  rt(isExclusive==
1be40 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
1be50 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74    assert(isDelet
1be60 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
1be70 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69  );..  /* The mai
1be80 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e  n DB, main journ
1be90 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64  al, WAL file and
1bea0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1beb0 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20  are never .  ** 
1bec0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
1bed0 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74  leted. Nor are t
1bee0 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61  hey ever tempora
1bef0 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20  ry files.  */.  
1bf00 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
1bf10 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
1bf20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
1bf30 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20  EN_MAIN_DB );.  
1bf40 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
1bf50 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
1bf60 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
1bf70 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
1bf80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
1bf90 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
1bfa0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
1bfb0 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
1bfc0 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
1bfd0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
1bfe0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
1bff0 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e!=SQLITE_OPEN_W
1c000 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  AL );..  /* Asse
1c010 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65  rt that the uppe
1c020 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20  r layer has set 
1c030 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65  one of the "file
1c040 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f  -type" flags. */
1c050 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
1c060 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
1c070 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54  IN_DB      || eT
1c080 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1c090 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20  _TEMP_DB .      
1c0a0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
1c0b0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1c0c0 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
1c0d0 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
1c0e0 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
1c0f0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1c100 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
1c110 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
1c120 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
1c130 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c  OURNAL .       |
1c140 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
1c150 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
1c160 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  B || eType==SQLI
1c170 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b  TE_OPEN_WAL.  );
1c180 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
1c190 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  0 );.  UNUSED_PA
1c1a0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a  RAMETER(pVfs);..
1c1b0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1c1c0 4e 52 54 0a 20 20 69 66 28 20 21 73 71 6c 69 74  NRT.  if( !sqlit
1c1d0 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
1c1e0 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
1c1f0 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52 4f  _log(SQLITE_ERRO
1c200 52 2c 0a 20 20 20 20 20 20 20 20 22 73 71 6c 69  R,.        "sqli
1c210 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
1c220 72 79 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75  ry variable shou
1c230 6c 64 20 62 65 20 73 65 74 20 66 6f 72 20 57 69  ld be set for Wi
1c240 6e 52 54 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  nRT");.  }.#endi
1c250 66 0a 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  f..  pFile->h = 
1c260 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
1c270 41 4c 55 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ALUE;..  /* If t
1c280 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1c290 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
1c2a0 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e  ion is NULL, gen
1c2b0 65 72 61 74 65 20 61 20 0a 20 20 2a 2a 20 74 65  erate a .  ** te
1c2c0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
1c2d0 65 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20  e to use .  */. 
1c2e0 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20   if( !zUtf8Name 
1c2f0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  ){.    assert(is
1c300 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65  Delete && !isOpe
1c310 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 6d  nJournal);.    m
1c320 65 6d 73 65 74 28 7a 54 6d 70 6e 61 6d 65 2c 20  emset(zTmpname, 
1c330 30 2c 20 4d 41 58 5f 50 41 54 48 2b 32 29 3b 0a  0, MAX_PATH+2);.
1c340 20 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70      rc = getTemp
1c350 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b 32 2c  name(MAX_PATH+2,
1c360 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20   zTmpname);.    
1c370 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c380 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1c390 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1c3a0 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70  zUtf8Name = zTmp
1c3b0 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  name;.  }..  /* 
1c3c0 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
1c3d0 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65  es are double-ze
1c3e0 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66  ro terminated if
1c3f0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20   they are not.  
1c400 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72  ** URIs with par
1c410 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c  ameters.  Hence,
1c420 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73   they can always
1c430 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a   be passed into.
1c440 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69    ** sqlite3_uri
1c450 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20  _parameter()..  
1c460 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65 54  */.  assert( (eT
1c470 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
1c480 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c  _MAIN_DB) || (fl
1c490 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1c4a0 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20  N_URI) ||.      
1c4b0 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 74 72 6c    zUtf8Name[strl
1c4c0 65 6e 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d  en(zUtf8Name)+1]
1c4d0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  ==0 );..  /* Con
1c4e0 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d  vert the filenam
1c4f0 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20  e to the system 
1c500 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a  encoding. */.  z
1c510 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
1c520 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
1c530 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66  zUtf8Name);.  if
1c540 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
1c550 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1c560 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1c570 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e  ;.  }..  if( win
1c580 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64  IsDir(zConverted
1c590 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1c5a0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
1c5b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1c5c0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53  LITE_CANTOPEN_IS
1c5d0 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  DIR;.  }..  if( 
1c5e0 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20  isReadWrite ){. 
1c5f0 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
1c600 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41  ss = GENERIC_REA
1c610 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54  D | GENERIC_WRIT
1c620 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
1c630 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20  dwDesiredAccess 
1c640 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a  = GENERIC_READ;.
1c650 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45    }..  /* SQLITE
1c660 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
1c670 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20  is used to make 
1c680 73 75 72 65 20 74 68 61 74 20 61 20 6e 65 77 20  sure that a new 
1c690 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63 72  file is .  ** cr
1c6a0 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f  eated. SQLite do
1c6b0 65 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20  esn't use it to 
1c6c0 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75 73  indicate "exclus
1c6d0 69 76 65 20 61 63 63 65 73 73 22 20 0a 20 20 2a  ive access" .  *
1c6e0 2a 20 61 73 20 69 74 20 69 73 20 75 73 75 61 6c  * as it is usual
1c6f0 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20  ly understood.. 
1c700 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c   */.  if( isExcl
1c710 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20  usive ){.    /* 
1c720 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 66 69  Creates a new fi
1c730 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64  le, only if it d
1c740 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
1c750 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a  exist. */.    /*
1c760 20 49 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   If the file exi
1c770 73 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a  sts, it fails. *
1c780 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
1c790 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52  Disposition = CR
1c7a0 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73  EATE_NEW;.  }els
1c7b0 65 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29  e if( isCreate )
1c7c0 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78  {.    /* Open ex
1c7d0 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20  isting file, or 
1c7e0 63 72 65 61 74 65 20 69 66 20 69 74 20 64 6f 65  create if it doe
1c7f0 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20  sn't exist */.  
1c800 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
1c810 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41  osition = OPEN_A
1c820 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LWAYS;.  }else{.
1c830 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66      /* Opens a f
1c840 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20  ile, only if it 
1c850 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64  exists. */.    d
1c860 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
1c870 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53  tion = OPEN_EXIS
1c880 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53  TING;.  }..  dwS
1c890 68 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f  hareMode = FILE_
1c8a0 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c  SHARE_READ | FIL
1c8b0 45 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a  E_SHARE_WRITE;..
1c8c0 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
1c8d0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
1c8e0 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67  WINCE.    dwFlag
1c8f0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
1c900 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
1c910 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65  HIDDEN;.    isTe
1c920 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20  mp = 1;.#else.  
1c930 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
1c940 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
1c950 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52  TRIBUTE_TEMPORAR
1c960 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y.              
1c970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c980 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   | FILE_ATTRIBUT
1c990 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20  E_HIDDEN.       
1c9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9b0 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46          | FILE_F
1c9c0 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c  LAG_DELETE_ON_CL
1c9d0 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  OSE;.#endif.  }e
1c9e0 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73  lse{.    dwFlags
1c9f0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
1ca00 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
1ca10 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ORMAL;.  }.  /* 
1ca20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65  Reports from the
1ca30 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68   internet are th
1ca40 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69  at performance i
1ca50 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65  s always.  ** be
1ca60 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41  tter if FILE_FLA
1ca70 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20  G_RANDOM_ACCESS 
1ca80 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74  is used.  Ticket
1ca90 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53   #2699. */.#if S
1caa0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
1cab0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
1cac0 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c  butes |= FILE_FL
1cad0 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
1cae0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
1caf0 69 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  isNT() ){.#if SQ
1cb00 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1cb10 20 20 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58    CREATEFILE2_EX
1cb20 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52  TENDED_PARAMETER
1cb30 53 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65  S extendedParame
1cb40 74 65 72 73 3b 0a 20 20 20 20 65 78 74 65 6e 64  ters;.    extend
1cb50 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53  edParameters.dwS
1cb60 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43 52 45  ize = sizeof(CRE
1cb70 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45  ATEFILE2_EXTENDE
1cb80 44 5f 50 41 52 41 4d 45 54 45 52 53 29 3b 0a 20  D_PARAMETERS);. 
1cb90 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
1cba0 65 74 65 72 73 2e 64 77 46 69 6c 65 41 74 74 72  eters.dwFileAttr
1cbb0 69 62 75 74 65 73 20 3d 0a 20 20 20 20 20 20 20  ibutes =.       
1cbc0 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
1cbd0 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45  ttributes & FILE
1cbe0 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b  _ATTRIBUTE_MASK;
1cbf0 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
1cc00 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 46 6c  ameters.dwFileFl
1cc10 61 67 73 20 3d 20 64 77 46 6c 61 67 73 41 6e 64  ags = dwFlagsAnd
1cc20 41 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c  Attributes & FIL
1cc30 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20  E_FLAG_MASK;.   
1cc40 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
1cc50 65 72 73 2e 64 77 53 65 63 75 72 69 74 79 51 6f  ers.dwSecurityQo
1cc60 73 46 6c 61 67 73 20 3d 20 53 45 43 55 52 49 54  sFlags = SECURIT
1cc70 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20  Y_ANONYMOUS;.   
1cc80 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
1cc90 65 72 73 2e 6c 70 53 65 63 75 72 69 74 79 41 74  ers.lpSecurityAt
1cca0 74 72 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b  tributes = NULL;
1ccb0 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
1ccc0 61 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c 61 74  ameters.hTemplat
1ccd0 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  eFile = NULL;.  
1cce0 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73    while( (h = os
1ccf0 43 72 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43  CreateFile2((LPC
1cd00 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
1cd10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1cd30 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a  wDesiredAccess,.
1cd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1cd60 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20  ShareMode,.     
1cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd80 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
1cd90 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 65                &e
1cdc0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
1cdd0 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  s))==INVALID_HAN
1cde0 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20  DLE_VALUE &&.   
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce00 20 20 20 20 20 20 20 20 20 20 20 72 65 74 72 79             retry
1ce10 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
1ce20 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
1ce30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f            /* Noo
1ce40 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65  p */.    }.#else
1ce50 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
1ce60 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28 28   osCreateFileW((
1ce70 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
1ce80 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
1ce90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cea0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
1ceb0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
1cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ced0 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55   dwShareMode, NU
1cee0 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
1cef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf00 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
1cf10 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
1cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf30 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
1cf40 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20  dAttributes,.   
1cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf60 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29             NULL)
1cf70 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  )==INVALID_HANDL
1cf80 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20  E_VALUE &&.     
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfa0 20 20 20 20 20 20 20 20 20 72 65 74 72 79 49 6f           retryIo
1cfb0 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
1cfc0 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
1cfd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20          /* Noop 
1cfe0 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  */.    }.#endif.
1cff0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1d000 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1d010 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69  .  else{.    whi
1d020 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74  le( (h = osCreat
1d030 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a  eFileA((LPCSTR)z
1d040 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
1d050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d060 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
1d070 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
1d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d090 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d          dwShareM
1d0a0 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  ode, NULL,.     
1d0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0c0 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
1d0d0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
1d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1d100 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
1d110 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  es,.            
1d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d130 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49    NULL))==INVALI
1d140 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
1d150 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
1d160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d170 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
1d180 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
1d190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d1a0 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
1d1b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 6c 6f 67    }.#endif.  log
1d1c0 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f  Ioerr(cnt);..  O
1d1d0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  STRACE(("OPEN %d
1d1e0 20 25 73 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c   %s 0x%lx %s\n",
1d1f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 68 2c 20   .           h, 
1d200 7a 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64  zName, dwDesired
1d210 41 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 20  Access, .       
1d220 20 20 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48      h==INVALID_H
1d230 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66  ANDLE_VALUE ? "f
1d240 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
1d250 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c  ..  if( h==INVAL
1d260 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
1d270 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
1d280 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
1d290 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  rno;.    winLogE
1d2a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
1d2b0 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OPEN, pFile->las
1d2c0 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e  tErrno, "winOpen
1d2d0 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  ", zUtf8Name);. 
1d2e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1d2f0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
1d300 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
1d310 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
1d320 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d330 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a   winOpen(pVfs, z
1d340 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20  Name, id, .     
1d350 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c          ((flags|
1d360 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1d370 4f 4e 4c 59 29 26 7e 28 53 51 4c 49 54 45 5f 4f  ONLY)&~(SQLITE_O
1d380 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c 49 54  PEN_CREATE|SQLIT
1d390 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1d3a0 29 29 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a  )), pOutFlags);.
1d3b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1d3c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1d3d0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
1d3e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
1d3f0 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
1d400 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
1d410 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c  ){.      *pOutFl
1d420 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
1d430 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  N_READWRITE;.   
1d440 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
1d450 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  OutFlags = SQLIT
1d460 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
1d470 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d 65  .    }.  }..  me
1d480 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
1d490 69 7a 65 6f 66 28 2a 70 46 69 6c 65 29 29 3b 0a  izeof(*pFile));.
1d4a0 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
1d4b0 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b   = &winIoMethod;
1d4c0 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b  .  pFile->h = h;
1d4d0 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  .  pFile->lastEr
1d4e0 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  rno = NO_ERROR;.
1d4f0 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20    pFile->pVfs = 
1d500 70 56 66 73 3b 0a 23 69 66 6e 64 65 66 20 53 51  pVfs;.#ifndef SQ
1d510 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
1d520 70 46 69 6c 65 2d 3e 70 53 68 6d 20 3d 20 30 3b  pFile->pShm = 0;
1d530 0a 23 65 6e 64 69 66 0a 20 20 70 46 69 6c 65 2d  .#endif.  pFile-
1d540 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a  >zPath = zName;.
1d550 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72    if( sqlite3_ur
1d560 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c  i_boolean(zName,
1d570 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f   "psow", SQLITE_
1d580 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1d590 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  ITE) ){.    pFil
1d5a0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
1d5b0 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20  WINFILE_PSOW;.  
1d5c0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  }..#if SQLITE_OS
1d5d0 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 69 73 52  _WINCE.  if( isR
1d5e0 65 61 64 57 72 69 74 65 20 26 26 20 65 54 79 70  eadWrite && eTyp
1d5f0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
1d600 41 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 26 26  AIN_DB.       &&
1d610 20 28 72 63 20 3d 20 77 69 6e 63 65 43 72 65 61   (rc = winceCrea
1d620 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46  teLock(zName, pF
1d630 69 6c 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  ile))!=SQLITE_OK
1d640 0a 20 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73  .  ){.    osClos
1d650 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20  eHandle(h);.    
1d660 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
1d670 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 72 65  nverted);.    re
1d680 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
1d690 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
1d6a0 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f   pFile->zDeleteO
1d6b0 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72  nClose = zConver
1d6c0 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  ted;.  }else.#en
1d6d0 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
1d6e0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
1d6f0 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 4f 70 65  ted);.  }..  Ope
1d700 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
1d710 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1d720 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e  .** Delete the n
1d730 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  amed file..**.**
1d740 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f   Note that Windo
1d750 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  ws does not allo
1d760 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64  w a file to be d
1d770 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  eleted if some o
1d780 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
1d790 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f  has it open.  So
1d7a0 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20  metimes a virus 
1d7b0 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78  scanner or index
1d7c0 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77  ing program.** w
1d7d0 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e  ill open a journ
1d7e0 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20  al file shortly 
1d7f0 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61  after it is crea
1d800 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
1d810 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69  do.** whatever i
1d820 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74  t does.  While t
1d830 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  his other proces
1d840 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
1d850 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77  .** file open, w
1d860 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65  e will be unable
1d870 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20   to delete it.  
1d880 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
1d890 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20  his.** problem, 
1d8a0 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c  we delay 100 mil
1d8b0 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72  liseconds and tr
1d8c0 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69  y to delete agai
1d8d0 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f  n.  Up.** to MX_
1d8e0 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
1d8f0 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d  s deletion attem
1d900 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f  pts are run befo
1d910 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20  re giving.** up 
1d920 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
1d930 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
1d940 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28  c int winDelete(
1d950 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1d960 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f  pVfs,          /
1d970 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
1d980 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  n32 */.  const c
1d990 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1d9a0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1d9b0 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a  file to delete *
1d9c0 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9e0 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
1d9f0 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  in32 */.){.  int
1da00 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
1da10 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  rc;.  DWORD attr
1da20 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
1da30 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  rno;.  void *zCo
1da40 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45  nverted;.  UNUSE
1da50 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
1da60 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1da70 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a  METER(syncDir);.
1da80 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1da90 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
1daa0 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a  _IOERR_DELETE);.
1dab0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63    zConverted = c
1dac0 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61  onvertUtf8Filena
1dad0 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
1dae0 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
1daf0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1db00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1db10 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  MEM;.  }.  if( i
1db20 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 20  sNT() ){.    do 
1db30 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
1db40 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49 4e 33  WINRT.      WIN3
1db50 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
1db60 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
1db70 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73  .      memset(&s
1db80 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a  AttrData, 0, siz
1db90 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b  eof(sAttrData));
1dba0 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 47 65  .      if ( osGe
1dbb0 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
1dbc0 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20 47  xW(zConverted, G
1dbd0 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e  etFileExInfoStan
1dbe0 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20  dard,.          
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61          &sAttrDa
1dc10 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ta) ){.        a
1dc20 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e  ttr = sAttrData.
1dc30 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  dwFileAttributes
1dc40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1dc50 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
1dc60 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
1dc70 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  r();.        if(
1dc80 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
1dc90 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
1dca0 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45   || lastErrno==E
1dcb0 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
1dcc0 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UND ){.         
1dcd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1dce0 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
1dcf0 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65   /* Already gone
1dd00 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  ? */.        }el
1dd10 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
1dd20 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1dd30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1dd40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1dd50 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74  }.#else.      at
1dd60 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
1dd70 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65  tributesW(zConve
1dd80 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
1dd90 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49      if ( attr==I
1dda0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
1ddb0 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20  IBUTES ){.      
1ddc0 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
1ddd0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1dde0 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
1ddf0 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
1de00 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 7c 7c 20 6c  E_NOT_FOUND || l
1de10 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
1de20 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
1de30 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1de40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
1de50 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
1de60 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
1de70 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1de80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1de90 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1dea0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
1deb0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1dec0 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c     if ( attr&FIL
1ded0 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
1dee0 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  CTORY ){.       
1def0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1df00 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c  OR; /* Files onl
1df10 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  y. */.        br
1df20 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1df30 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65     if ( osDelete
1df40 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65 64  FileW(zConverted
1df50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1df60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20  = SQLITE_OK; /* 
1df70 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20  Deleted OK. */. 
1df80 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1df90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
1dfa0 20 21 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e   !retryIoerr(&cn
1dfb0 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
1dfc0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1dfd0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
1dfe0 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e  No more retries.
1dff0 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
1e000 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
1e010 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23   while(1);.  }.#
1e020 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
1e030 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
1e040 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  se{.    do {.   
1e050 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
1e060 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a  ileAttributesA(z
1e070 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
1e080 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56    if ( attr==INV
1e090 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
1e0a0 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20  UTES ){.        
1e0b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
1e0c0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
1e0d0 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
1e0e0 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno==ERROR_FILE_
1e0f0 4e 4f 54 5f 46 4f 55 4e 44 20 7c 7c 20 6c 61 73  NOT_FOUND || las
1e100 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41  tErrno==ERROR_PA
1e110 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
1e120 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1e130 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
1e140 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72  TE_NOENT; /* Alr
1e150 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20  eady gone? */.  
1e160 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e170 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1e180 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
1e190 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
1e1a0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1e1b0 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f   if ( attr&FILE_
1e1c0 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
1e1d0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ORY ){.        r
1e1e0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1e1f0 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e  ; /* Files only.
1e200 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
1e210 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1e220 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69   if ( osDeleteFi
1e230 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  leA(zConverted) 
1e240 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e250 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65  SQLITE_OK; /* De
1e260 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20  leted OK. */.   
1e270 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e280 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21    }.      if ( !
1e290 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
1e2a0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
1e2b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1e2c0 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f  ITE_ERROR; /* No
1e2d0 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a   more retries. *
1e2e0 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
1e2f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77  .      }.    } w
1e300 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 65 6e  hile(1);.  }.#en
1e310 64 69 66 0a 20 20 69 66 28 20 72 63 20 26 26 20  dif.  if( rc && 
1e320 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
1e330 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 7b  _DELETE_NOENT ){
1e340 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
1e350 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1e360 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45  RR_DELETE, lastE
1e370 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
1e380 20 20 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20     "winDelete", 
1e390 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65  zFilename);.  }e
1e3a0 6c 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72  lse{.    logIoer
1e3b0 72 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71  r(cnt);.  }.  sq
1e3c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
1e3d0 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43  erted);.  OSTRAC
1e3e0 45 28 28 22 44 45 4c 45 54 45 20 5c 22 25 73 5c  E(("DELETE \"%s\
1e3f0 22 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  " %s\n", zFilena
1e400 6d 65 2c 20 28 72 63 20 3f 20 22 66 61 69 6c 65  me, (rc ? "faile
1e410 64 22 20 3a 20 22 6f 6b 22 20 29 29 29 3b 0a 20  d" : "ok" )));. 
1e420 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1e430 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65  *.** Check the e
1e440 78 69 73 74 61 6e 63 65 20 61 6e 64 20 73 74 61  xistance and sta
1e450 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a  tus of a file..*
1e460 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1e470 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
1e480 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
1e490 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
1e4a0 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63   on win32 */.  c
1e4b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1e4c0 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  name,     /* Nam
1e4d0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65  e of file to che
1e4e0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ck */.  int flag
1e4f0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
1e500 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65     /* Type of te
1e510 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68  st to make on th
1e520 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
1e530 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20   *pResOut       
1e540 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1e550 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44  Result */.){.  D
1e560 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74  WORD attr;.  int
1e570 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44   rc = 0;.  DWORD
1e580 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f   lastErrno;.  vo
1e590 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
1e5a0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1e5b0 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d  ER(pVfs);..  Sim
1e5c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
1e5d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1e5e0 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 7a  R_ACCESS; );.  z
1e5f0 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
1e600 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
1e610 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
1e620 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
1e630 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1e640 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1e650 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54  ;.  }.  if( isNT
1e660 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  () ){.    int cn
1e670 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32  t = 0;.    WIN32
1e680 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  _FILE_ATTRIBUTE_
1e690 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a  DATA sAttrData;.
1e6a0 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74      memset(&sAtt
1e6b0 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66  rData, 0, sizeof
1e6c0 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20  (sAttrData));.  
1e6d0 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20    while( !(rc = 
1e6e0 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
1e6f0 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29  tesExW((LPCWSTR)
1e700 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
1e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e720 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65           GetFile
1e730 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20  ExInfoStandard, 
1e740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
1e760 41 74 74 72 44 61 74 61 29 29 20 26 26 20 72 65  AttrData)) && re
1e770 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
1e780 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20  lastErrno) ){}. 
1e790 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1e7a0 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c     /* For an SQL
1e7b0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1e7c0 53 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61  S query, treat a
1e7d0 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c   zero-length fil
1e7e0 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66  e.      ** as if
1e7f0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69   it does not exi
1e800 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  st..      */.   
1e810 20 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d     if(    flags=
1e820 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
1e830 58 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20  XISTS.          
1e840 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69  && sAttrData.nFi
1e850 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20  leSizeHigh==0 . 
1e860 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74           && sAtt
1e870 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c  rData.nFileSizeL
1e880 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ow==0 ){.       
1e890 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f   attr = INVALID_
1e8a0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
1e8b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e8c0 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
1e8d0 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
1e8e0 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
1e8f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e900 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b    logIoerr(cnt);
1e910 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45  .      if( lastE
1e920 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45  rrno!=ERROR_FILE
1e930 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61  _NOT_FOUND && la
1e940 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50  stErrno!=ERROR_P
1e950 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b  ATH_NOT_FOUND ){
1e960 0a 20 20 20 20 20 20 20 20 77 69 6e 4c 6f 67 45  .        winLogE
1e970 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1e980 52 5f 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72  R_ACCESS, lastEr
1e990 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22  rno, "winAccess"
1e9a0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
1e9b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1e9c0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1e9d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1e9e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
1e9f0 53 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  SS;.      }else{
1ea00 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
1ea10 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
1ea20 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d  RIBUTES;.      }
1ea30 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
1ea40 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
1ea50 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
1ea60 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
1ea70 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
1ea80 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
1ea90 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d);.  }.#endif. 
1eaa0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
1eab0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69  onverted);.  swi
1eac0 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20  tch( flags ){.  
1ead0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
1eae0 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63  CESS_READ:.    c
1eaf0 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
1eb00 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20  S_EXISTS:.      
1eb10 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c  rc = attr!=INVAL
1eb20 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
1eb30 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ES;.      break;
1eb40 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1eb50 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
1eb60 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74  E:.      rc = at
1eb70 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
1eb80 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20  _ATTRIBUTES &&. 
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74              (att
1eba0 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  r & FILE_ATTRIBU
1ebb0 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b  TE_READONLY)==0;
1ebc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ebd0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
1ebe0 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
1ebf0 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
1ec00 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ");.  }.  *pResO
1ec10 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72  ut = rc;.  retur
1ec20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ec30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e  ./*.** Returns n
1ec40 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
1ec50 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61  pecified path na
1ec60 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  me should be use
1ec70 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66 0a  d verbatim.  If.
1ec80 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  ** non-zero is r
1ec90 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69  eturned from thi
1eca0 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20  s function, the 
1ecb0 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1ecc0 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20   must simply.** 
1ecd0 75 73 65 20 74 68 65 20 70 72 6f 76 69 64 65 64  use the provided
1ece0 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62 61   path name verba
1ecf0 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65  tim -OR- resolve
1ed00 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20   it into a full 
1ed10 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69  path name.** usi
1ed20 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50 61  ng the GetFullPa
1ed30 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50 49  thName Win32 API
1ed40 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61 76   function (if av
1ed50 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61  ailable)..*/.sta
1ed60 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65  tic BOOL winIsVe
1ed70 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a  rbatimPathname(.
1ed80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1ed90 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a  athname.){.  /*.
1eda0 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68    ** If the path
1edb0 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74   name starts wit
1edc0 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61 73  h a forward slas
1edd0 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73 68  h or a backslash
1ede0 2c 20 69 74 20 69 73 20 65 69 74 68 65 72 0a 20  , it is either. 
1edf0 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43 20   ** a legal UNC 
1ee00 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72  name, a volume r
1ee10 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72  elative path, or
1ee20 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74   an absolute pat
1ee30 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20 20  h name in the.  
1ee40 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61 74  ** "Unix" format
1ee50 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68   on Windows.  Th
1ee60 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20 77  ere is no easy w
1ee70 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69  ay to differenti
1ee80 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a  ate between.  **
1ee90 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20 63   the final two c
1eea0 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65 2c  ases; therefore,
1eeb0 20 77 65 20 72 65 74 75 72 6e 20 74 68 65 20 73   we return the s
1eec0 61 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  afer return valu
1eed0 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20 73  e of TRUE.  ** s
1eee0 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20 6f  o that callers o
1eef0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
1ef00 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65 20  will simply use 
1ef10 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a  it verbatim..  *
1ef20 2f 0a 20 20 69 66 20 28 20 7a 50 61 74 68 6e 61  /.  if ( zPathna
1ef30 6d 65 5b 30 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 50  me[0]=='/' || zP
1ef40 61 74 68 6e 61 6d 65 5b 30 5d 3d 3d 27 5c 5c 27  athname[0]=='\\'
1ef50 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1ef60 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  RUE;.  }..  /*. 
1ef70 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20   ** If the path 
1ef80 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68  name starts with
1ef90 20 61 20 6c 65 74 74 65 72 20 61 6e 64 20 61 20   a letter and a 
1efa0 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69 74 68  colon it is eith
1efb0 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a  er a volume.  **
1efc0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6f   relative path o
1efd0 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  r an absolute pa
1efe0 74 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66 20  th.  Callers of 
1eff0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
1f000 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 65  st not.  ** atte
1f010 6d 70 74 20 74 6f 20 74 72 65 61 74 20 69 74 20  mpt to treat it 
1f020 61 73 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  as a relative pa
1f030 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74 68  th name (i.e. th
1f040 65 79 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c 79  ey should simply
1f050 20 75 73 65 0a 20 20 2a 2a 20 69 74 20 76 65 72   use.  ** it ver
1f060 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69  batim)..  */.  i
1f070 66 20 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70  f ( sqlite3Isalp
1f080 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29  ha(zPathname[0])
1f090 20 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d   && zPathname[1]
1f0a0 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 72 65 74  ==':' ){.    ret
1f0b0 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20  urn TRUE;.  }.. 
1f0c0 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 67   /*.  ** If we g
1f0d0 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
1f0e0 2c 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20  , the path name 
1f0f0 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65  should almost ce
1f100 72 74 61 69 6e 6c 79 20 62 65 20 61 20 70 75 72  rtainly be a pur
1f110 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76  ely.  ** relativ
1f120 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20  e one (i.e. not 
1f130 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20  a UNC name, not 
1f140 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f  absolute, and no
1f150 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76  t volume relativ
1f160 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  e)..  */.  retur
1f170 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  n FALSE;.}../*.*
1f180 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
1f190 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
1f1a0 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
1f1b0 20 20 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c    Write the full
1f1c0 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  .** pathname int
1f1d0 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b  o zOut[].  zOut[
1f1e0 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61  ] will be at lea
1f1f0 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  st pVfs->mxPathn
1f200 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  ame.** bytes in 
1f210 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
1f220 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e  int winFullPathn
1f230 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
1f240 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
1f250 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1f260 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
1f270 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f280 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20  Relative,       
1f290 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
1f2a0 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
1f2b0 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c   */.  int nFull,
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f2d0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
1f2e0 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
1f2f0 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
1f300 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20  *zFull          
1f310 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
1f320 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
1f330 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f    .#if defined(_
1f340 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d  _CYGWIN__).  Sim
1f350 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
1f360 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
1f370 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  R );.  UNUSED_PA
1f380 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a  RAMETER(nFull);.
1f390 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e    assert( pVfs->
1f3a0 6d 78 50 61 74 68 6e 61 6d 65 3e 3d 4d 41 58 5f  mxPathname>=MAX_
1f3b0 50 41 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  PATH );.  assert
1f3c0 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d  ( nFull>=pVfs->m
1f3d0 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69  xPathname );.  i
1f3e0 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61  f ( sqlite3_data
1f3f0 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77  _directory && !w
1f400 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68  inIsVerbatimPath
1f410 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20  name(zRelative) 
1f420 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
1f430 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65   NOTE: We are de
1f440 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c  aling with a rel
1f450 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
1f460 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20  and the data.   
1f470 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74   **       direct
1f480 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
1f490 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73  .  Therefore, us
1f4a0 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69  e it as the basi
1f4b0 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66  s.    **       f
1f4c0 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68  or converting th
1f4d0 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  e relative path 
1f4e0 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c  name to an absol
1f4f0 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ute.    **      
1f500 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69   one by prependi
1f510 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65  ng the data dire
1f520 63 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73  ctory and a slas
1f530 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68  h..    */.    ch
1f540 61 72 20 7a 4f 75 74 5b 4d 41 58 5f 50 41 54 48  ar zOut[MAX_PATH
1f550 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  +1];.    memset(
1f560 7a 4f 75 74 2c 20 30 2c 20 4d 41 58 5f 50 41 54  zOut, 0, MAX_PAT
1f570 48 2b 31 29 3b 0a 20 20 20 20 63 79 67 77 69 6e  H+1);.    cygwin
1f580 5f 63 6f 6e 76 5f 74 6f 5f 77 69 6e 33 32 5f 70  _conv_to_win32_p
1f590 61 74 68 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a  ath(zRelative, z
1f5a0 4f 75 74 29 3b 20 2f 2a 20 50 4f 53 49 58 20 74  Out); /* POSIX t
1f5b0 6f 20 57 69 6e 33 32 20 2a 2f 0a 20 20 20 20 73  o Win32 */.    s
1f5c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1f5d0 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
1f5e0 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
1f5f0 75 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20  ull, "%s\\%s",. 
1f600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f610 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
1f620 5f 64 69 72 65 63 74 6f 72 79 2c 20 7a 4f 75 74  _directory, zOut
1f630 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f640 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
1f650 54 68 65 20 43 79 67 77 69 6e 20 64 6f 63 73 20  The Cygwin docs 
1f660 73 74 61 74 65 20 74 68 61 74 20 74 68 65 20 6d  state that the m
1f670 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6e 65  aximum length ne
1f680 65 64 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20  eded.    **     
1f690 20 20 66 6f 72 20 74 68 65 20 62 75 66 66 65 72    for the buffer
1f6a0 20 70 61 73 73 65 64 20 74 6f 20 63 79 67 77 69   passed to cygwi
1f6b0 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77  n_conv_to_full_w
1f6c0 69 6e 33 32 5f 70 61 74 68 0a 20 20 20 20 2a 2a  in32_path.    **
1f6d0 20 20 20 20 20 20 20 69 73 20 4d 41 58 5f 50 41         is MAX_PA
1f6e0 54 48 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  TH..    */.    c
1f6f0 79 67 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75  ygwin_conv_to_fu
1f700 6c 6c 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a 52  ll_win32_path(zR
1f710 65 6c 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29 3b  elative, zFull);
1f720 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1f730 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
1f740 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f  .#if (SQLITE_OS_
1f750 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
1f760 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21 64 65  OS_WINRT) && !de
1f770 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
1f780 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ).  SimulateIOEr
1f790 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1f7a0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a  TE_ERROR );.  /*
1f7b0 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f   WinCE has no co
1f7c0 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74  ncept of a relat
1f7d0 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72  ive pathname, or
1f7e0 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a   so I am told. *
1f7f0 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61 73  /.  /* WinRT has
1f800 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76 65   no way to conve
1f810 72 74 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rt a relative pa
1f820 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  th to an absolut
1f830 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28  e one. */.  if (
1f840 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
1f850 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49  rectory && !winI
1f860 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
1f870 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a  e(zRelative) ){.
1f880 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
1f890 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69  TE: We are deali
1f8a0 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ng with a relati
1f8b0 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64  ve path name and
1f8c0 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
1f8d0 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
1f8e0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
1f8f0 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  Therefore, use i
1f900 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20  t as the basis. 
1f910 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20     **       for 
1f920 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72  converting the r
1f930 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
1f940 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  e to an absolute
1f950 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e  .    **       on
1f960 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  e by prepending 
1f970 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
1f980 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61  ry and a backsla
1f990 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  sh..    */.    s
1f9a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1f9b0 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
1f9c0 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
1f9d0 75 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20  ull, "%s\\%s",. 
1f9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9f0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
1fa00 5f 64 69 72 65 63 74 6f 72 79 2c 20 7a 52 65 6c  _directory, zRel
1fa10 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ative);.  }else{
1fa20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1fa30 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
1fa40 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
1fa50 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c  e), zFull, "%s",
1fa60 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d   zRelative);.  }
1fa70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1fa80 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
1fa90 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
1faa0 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
1fab0 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
1fac0 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
1fad0 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20 76  DWORD nByte;.  v
1fae0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
1faf0 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a  .  char *zOut;..
1fb00 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74    /* If this pat
1fb10 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69  h name begins wi
1fb20 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20  th "/X:", where 
1fb30 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61  "X" is any alpha
1fb40 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61  betic.  ** chara
1fb50 63 74 65 72 2c 20 64 69 73 63 61 72 64 20 74 68  cter, discard th
1fb60 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72  e initial "/" fr
1fb70 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e  om the pathname.
1fb80 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c  .  */.  if( zRel
1fb90 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26  ative[0]=='/' &&
1fba0 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28   sqlite3Isalpha(
1fbb0 7a 52 65 6c 61 74 69 76 65 5b 31 5d 29 20 26 26  zRelative[1]) &&
1fbc0 20 7a 52 65 6c 61 74 69 76 65 5b 32 5d 3d 3d 27   zRelative[2]=='
1fbd0 3a 27 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74  :' ){.    zRelat
1fbe0 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ive++;.  }..  /*
1fbf0 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
1fc00 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
1fc10 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
1fc20 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
1fc30 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
1fc40 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
1fc50 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
1fc60 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
1fc70 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
1fc80 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54  ction failing. T
1fc90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75  his function cou
1fca0 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20  ld fail if, for 
1fcb0 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a  example, the.  *
1fcc0 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e  * current workin
1fcd0 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  g directory has 
1fce0 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20  been unlinked.. 
1fcf0 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
1fd00 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
1fd10 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
1fd20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74  if ( sqlite3_dat
1fd30 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21  a_directory && !
1fd40 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
1fd50 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  hname(zRelative)
1fd60 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
1fd70 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  * NOTE: We are d
1fd80 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65  ealing with a re
1fd90 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
1fda0 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20   and the data.  
1fdb0 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63    **       direc
1fdc0 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65  tory has been se
1fdd0 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75  t.  Therefore, u
1fde0 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73  se it as the bas
1fdf0 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  is.    **       
1fe00 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74  for converting t
1fe10 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
1fe20 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f   name to an abso
1fe30 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  lute.    **     
1fe40 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64    one by prepend
1fe50 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72  ing the data dir
1fe60 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63  ectory and a bac
1fe70 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20  kslash..    */. 
1fe80 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1fe90 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
1fea0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
1feb0 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c 25 73  , zFull, "%s\\%s
1fec0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1fed0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1fee0 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20  data_directory, 
1fef0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
1ff00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ff10 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74  ;.  }.  zConvert
1ff20 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38  ed = convertUtf8
1ff30 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Filename(zRelati
1ff40 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  ve);.  if( zConv
1ff50 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
1ff60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1ff70 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ERR_NOMEM;.  }. 
1ff80 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
1ff90 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b     LPWSTR zTemp;
1ffa0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47  .    nByte = osG
1ffb0 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28  etFullPathNameW(
1ffc0 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
1ffd0 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ted, 0, 0, 0);. 
1ffe0 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
1fff0 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45  ){.      winLogE
20000 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f  rror(SQLITE_ERRO
20010 52 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  R, osGetLastErro
20020 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
20030 20 20 20 20 20 20 20 22 47 65 74 46 75 6c 6c 50         "GetFullP
20040 61 74 68 4e 61 6d 65 57 31 22 2c 20 7a 43 6f 6e  athNameW1", zCon
20050 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73  verted);.      s
20060 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
20070 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
20080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
20090 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a  TOPEN_FULLPATH;.
200a0 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
200b0 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20  += 3;.    zTemp 
200c0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
200d0 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  ero( nByte*sizeo
200e0 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20  f(zTemp[0]) );. 
200f0 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20     if( zTemp==0 
20100 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20110 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
20120 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
20130 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
20140 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  EM;.    }.    nB
20150 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
20160 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54  athNameW((LPCWST
20170 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42  R)zConverted, nB
20180 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a  yte, zTemp, 0);.
20190 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30      if( nByte==0
201a0 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67   ){.      winLog
201b0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52  Error(SQLITE_ERR
201c0 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  OR, osGetLastErr
201d0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
201e0 20 20 20 20 20 20 20 20 22 47 65 74 46 75 6c 6c          "GetFull
201f0 50 61 74 68 4e 61 6d 65 57 32 22 2c 20 7a 43 6f  PathNameW2", zCo
20200 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
20210 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
20220 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
20230 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
20240 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mp);.      retur
20250 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
20260 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20 20  N_FULLPATH;.    
20270 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
20280 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
20290 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f      zOut = unico
202a0 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b  deToUtf8(zTemp);
202b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
202c0 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 69  e(zTemp);.  }.#i
202d0 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
202e0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
202f0 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65  e{.    char *zTe
20300 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  mp;.    nByte = 
20310 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
20320 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
20330 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  rted, 0, 0, 0);.
20340 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30      if( nByte==0
20350 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67   ){.      winLog
20360 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52  Error(SQLITE_ERR
20370 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  OR, osGetLastErr
20380 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
20390 20 20 20 20 20 20 20 20 22 47 65 74 46 75 6c 6c          "GetFull
203a0 50 61 74 68 4e 61 6d 65 41 31 22 2c 20 7a 43 6f  PathNameA1", zCo
203b0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
203c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
203d0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
203e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
203f0 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b  NTOPEN_FULLPATH;
20400 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
20410 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70   += 3;.    zTemp
20420 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
20430 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
20440 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
20450 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
20460 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20470 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
20480 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
20490 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
204a0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  MEM;.    }.    n
204b0 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
204c0 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
204d0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
204e0 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
204f0 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
20500 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45  ){.      winLogE
20510 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f  rror(SQLITE_ERRO
20520 52 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  R, osGetLastErro
20530 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
20540 20 20 20 20 20 20 20 22 47 65 74 46 75 6c 6c 50         "GetFullP
20550 61 74 68 4e 61 6d 65 41 32 22 2c 20 7a 43 6f 6e  athNameA2", zCon
20560 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73  verted);.      s
20570 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
20580 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73  verted);.      s
20590 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
205a0 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
205b0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
205c0 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d  _FULLPATH;.    }
205d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
205e0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
205f0 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65     zOut = sqlite
20600 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
20610 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20  utf8(zTemp);.   
20620 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
20630 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  emp);.  }.#endif
20640 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20  .  if( zOut ){. 
20650 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
20660 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
20670 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
20680 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a  , zFull, "%s", z
20690 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Out);.    sqlite
206a0 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
206b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
206c0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
206d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
206e0 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
206f0 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65  #endif.}..#ifnde
20700 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
20710 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
20720 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
20730 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
20740 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
20750 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
20760 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
20770 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
20780 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
20790 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
207a0 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63  /./*.** Interfac
207b0 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61  es for opening a
207c0 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
207d0 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70   finding entry p
207e0 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20  oints.** within 
207f0 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
20800 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20  ry, and closing 
20810 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61  the shared libra
20820 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ry..*/.static vo
20830 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71  id *winDlOpen(sq
20840 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
20850 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
20860 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c  lename){.  HANDL
20870 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  E h;.  void *zCo
20880 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
20890 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  tUtf8Filename(zF
208a0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53  ilename);.  UNUS
208b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
208c0 73 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  s);.  if( zConve
208d0 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rted==0 ){.    r
208e0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
208f0 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23 69 66  f( isNT() ){.#if
20900 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
20910 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50  .    h = osLoadP
20920 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 28 28  ackagedLibrary((
20930 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
20940 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20  ed, 0);.#else.  
20950 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72    h = osLoadLibr
20960 61 72 79 57 28 28 4c 50 43 57 53 54 52 29 7a 43  aryW((LPCWSTR)zC
20970 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
20980 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  f.  }.#ifdef SQL
20990 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
209a0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 68  SI.  else{.    h
209b0 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79   = osLoadLibrary
209c0 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
209d0 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ted);.  }.#endif
209e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
209f0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72  zConverted);.  r
20a00 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a  eturn (void*)h;.
20a10 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  }.static void wi
20a20 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  nDlError(sqlite3
20a30 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
20a40 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
20a50 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Out){.  UNUSED_P
20a60 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
20a70 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73    getLastErrorMs
20a80 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  g(osGetLastError
20a90 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75  (), nBuf, zBufOu
20aa0 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  t);.}.static voi
20ab0 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c  d (*winDlSym(sql
20ac0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
20ad0 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63  void *pHandle, c
20ae0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62  onst char *zSymb
20af0 6f 6c 29 29 28 76 6f 69 64 29 7b 0a 20 20 55 4e  ol))(void){.  UN
20b00 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
20b10 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Vfs);.  return (
20b20 76 6f 69 64 28 2a 29 28 76 6f 69 64 29 29 6f 73  void(*)(void))os
20b30 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28  GetProcAddressA(
20b40 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c  (HANDLE)pHandle,
20b50 20 7a 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 73 74 61   zSymbol);.}.sta
20b60 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c  tic void winDlCl
20b70 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
20b80 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
20b90 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
20ba0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
20bb0 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79  .  osFreeLibrary
20bc0 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65  ((HANDLE)pHandle
20bd0 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
20be0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
20bf0 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
20c00 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
20c10 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20  fine winDlOpen  
20c20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
20c30 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
20c40 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a  ne winDlSym   0.
20c50 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43    #define winDlC
20c60 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  lose 0.#endif...
20c70 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74  /*.** Write up t
20c80 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  o nBuf bytes of 
20c90 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20  randomness into 
20ca0 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
20cb0 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73  int winRandomnes
20cc0 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  s(sqlite3_vfs *p
20cd0 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
20ce0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e  har *zBuf){.  in
20cf0 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45  t n = 0;.  UNUSE
20d00 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
20d10 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
20d20 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20  QLITE_TEST).  n 
20d30 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74  = nBuf;.  memset
20d40 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b  (zBuf, 0, nBuf);
20d50 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a  .#else.  if( siz
20d60 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c  eof(SYSTEMTIME)<
20d70 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53  =nBuf-n ){.    S
20d80 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20  YSTEMTIME x;.   
20d90 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
20da0 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  (&x);.    memcpy
20db0 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73  (&zBuf[n], &x, s
20dc0 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e  izeof(x));.    n
20dd0 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20   += sizeof(x);. 
20de0 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28   }.  if( sizeof(
20df0 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29  DWORD)<=nBuf-n )
20e00 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64 20  {.    DWORD pid 
20e10 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  = osGetCurrentPr
20e20 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d  ocessId();.    m
20e30 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
20e40 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64  &pid, sizeof(pid
20e50 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
20e60 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69  eof(pid);.  }.#i
20e70 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
20e80 54 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55  T.  if( sizeof(U
20e90 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d  LONGLONG)<=nBuf-
20ea0 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f  n ){.    ULONGLO
20eb0 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69  NG cnt = osGetTi
20ec0 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20  ckCount64();.   
20ed0 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
20ee0 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63  , &cnt, sizeof(c
20ef0 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  nt));.    n += s
20f00 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a  izeof(cnt);.  }.
20f10 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65  #else.  if( size
20f20 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d  of(DWORD)<=nBuf-
20f30 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63  n ){.    DWORD c
20f40 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f  nt = osGetTickCo
20f50 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70  unt();.    memcp
20f60 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74  y(&zBuf[n], &cnt
20f70 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a  , sizeof(cnt));.
20f80 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
20f90 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  cnt);.  }.#endif
20fa0 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41  .  if( sizeof(LA
20fb0 52 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42  RGE_INTEGER)<=nB
20fc0 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47  uf-n ){.    LARG
20fd0 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20  E_INTEGER i;.   
20fe0 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61   osQueryPerforma
20ff0 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a  nceCounter(&i);.
21000 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
21010 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28  [n], &i, sizeof(
21020 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  i));.    n += si
21030 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e  zeof(i);.  }.#en
21040 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  dif.  return n;.
21050 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
21060 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
21070 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
21080 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
21090 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lept..*/.static 
210a0 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c  int winSleep(sql
210b0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
210c0 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20  int microsec){. 
210d0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
210e0 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39  leep((microsec+9
210f0 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55  99)/1000);.  UNU
21100 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
21110 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  fs);.  return ((
21120 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30  microsec+999)/10
21130 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a  00)*1000;.}../*.
21140 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
21150 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
21160 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
21170 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70  value, is interp
21180 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  reted as.** the 
21190 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
211a0 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64  s since 1970 and
211b0 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20   is used to set 
211c0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
211d0 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
211e0 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74  tTime() during t
211f0 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
21200 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
21210 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
21220 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20  t_time = 0;  /* 
21230 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65  Fake system time
21240 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   in seconds sinc
21250 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69  e 1970. */.#endi
21260 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
21270 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
21280 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
21290 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
212a0 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   Write into *piN
212b0 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  ow.** the curren
212c0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
212d0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
212e0 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f  number times 86_
212f0 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20  400_000.  In.** 
21300 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69  other words, wri
21310 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74  te into *piNow t
21320 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
21330 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  liseconds since 
21340 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70  the Julian.** ep
21350 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47  och of noon in G
21360 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65  reenwich on Nove
21370 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e  mber 24, 4714 B.
21380 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  C according to t
21390 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20  he.** proleptic 
213a0 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64  Gregorian calend
213b0 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ar..**.** On suc
213c0 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  cess, return SQL
213d0 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20  ITE_OK.  Return 
213e0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
213f0 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
21400 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
21410 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
21420 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54   int winCurrentT
21430 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33  imeInt64(sqlite3
21440 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69  _vfs *pVfs, sqli
21450 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77  te3_int64 *piNow
21460 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45  ){.  /* FILETIME
21470 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20   structure is a 
21480 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70  64-bit value rep
21490 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75  resenting the nu
214a0 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30  mber of .     10
214b0 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74  0-nanosecond int
214c0 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e  ervals since Jan
214d0 75 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20  uary 1, 1601 (= 
214e0 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a  JD 2305813.5). .
214f0 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20    */.  FILETIME 
21500 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  ft;.  static con
21510 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
21520 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63   winFiletimeEpoc
21530 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71  h = 23058135*(sq
21540 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
21550 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  000;.#ifdef SQLI
21560 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63  TE_TEST.  static
21570 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
21580 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
21590 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
215a0 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
215b0 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e  ;.#endif.  /* 2^
215c0 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73  32 - to avoid us
215d0 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e  e of LL and warn
215e0 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20  ings in gcc */. 
215f0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
21600 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33  lite3_int64 max3
21610 32 42 69 74 56 61 6c 75 65 20 3d 20 0a 20 20 20  2BitValue = .   
21620 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
21630 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28  4)2000000000 + (
21640 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
21650 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69  00000000 + (sqli
21660 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37  te3_int64)294967
21670 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  296;..#if SQLITE
21680 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54  _OS_WINCE.  SYST
21690 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f  EMTIME time;.  o
216a0 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
216b0 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53  time);.  /* if S
216c0 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
216d0 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ime() fails, it 
216e0 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f  returns zero. */
216f0 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d  .  if (!osSystem
21700 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26  TimeToFileTime(&
21710 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20  time,&ft)){.    
21720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
21730 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  ROR;.  }.#else. 
21740 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
21750 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20  AsFileTime( &ft 
21760 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69  );.#endif..  *pi
21770 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d  Now = winFiletim
21780 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20  eEpoch +.       
21790 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33       ((((sqlite3
217a0 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68  _int64)ft.dwHigh
217b0 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42  DateTime)*max32B
217c0 69 74 56 61 6c 75 65 29 20 2b 20 0a 20 20 20 20  itValue) + .    
217d0 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
217e0 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c  te3_int64)ft.dwL
217f0 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c  owDateTime)/(sql
21800 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30  ite3_int64)10000
21810 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
21820 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
21830 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
21840 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d   ){.    *piNow =
21850 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
21860 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72  nt64)sqlite3_cur
21870 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78  rent_time + unix
21880 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69  Epoch;.  }.#endi
21890 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  f.  UNUSED_PARAM
218a0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
218b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
218c0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  }../*.** Find th
218d0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
218e0 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
218f0 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
21900 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75   Write the.** cu
21910 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
21920 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
21930 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  Day number into 
21940 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65  *prNow and.** re
21950 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
21960 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
21970 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
21980 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
21990 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74  c int winCurrent
219a0 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
219b0 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a   *pVfs, double *
219c0 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63  prNow){.  int rc
219d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
219e0 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43  4 i;.  rc = winC
219f0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
21a00 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28  pVfs, &i);.  if(
21a10 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e   !rc ){.    *prN
21a20 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e  ow = i/86400000.
21a30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
21a40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
21a50 20 69 64 65 61 20 69 73 20 74 68 61 74 20 74 68   idea is that th
21a60 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  is function work
21a70 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61  s like a combina
21a80 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61  tion of.** GetLa
21a90 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f  stError() and Fo
21aa0 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e  rmatMessage() on
21ab0 20 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72   Windows (or err
21ac0 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72  no and.** strerr
21ad0 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e  or_r() on Unix).
21ae0 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20   After an error 
21af0 69 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  is returned by a
21b00 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  n OS.** function
21b10 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74  , SQLite calls t
21b20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  his function wit
21b30 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20  h zBuf pointing 
21b40 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f  to.** a buffer o
21b50 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68  f nBuf bytes. Th
21b60 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c  e OS layer shoul
21b70 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a  d populate the.*
21b80 2a 20 62 75 66 66 65 72 20 77 69 74 68 20 61 20  * buffer with a 
21b90 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55  nul-terminated U
21ba0 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72  TF-8 encoded err
21bb0 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65  or message.** de
21bc0 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73  scribing the las
21bd0 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61  t IO error to ha
21be0 76 65 20 6f 63 63 75 72 72 65 64 20 77 69 74 68  ve occurred with
21bf0 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  in the calling.*
21c00 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  * thread..**.** 
21c10 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  If the error mes
21c20 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67  sage is too larg
21c30 65 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69  e for the suppli
21c40 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74  ed buffer,.** it
21c50 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63   should be trunc
21c60 61 74 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e  ated. The return
21c70 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61   value of xGetLa
21c80 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65  stError.** is ze
21c90 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  ro if the error 
21ca0 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20  message fits in 
21cb0 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e  the buffer, or n
21cc0 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72  on-zero.** other
21cd0 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73  wise (if the mes
21ce0 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74  sage was truncat
21cf0 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f  ed). If non-zero
21d00 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
21d10 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20   then it is not 
21d20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63  necessary to inc
21d30 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72  lude the nul-ter
21d40 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65  minator characte
21d50 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70  r.** in the outp
21d60 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ut buffer..**.**
21d70 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61   Not supplying a
21d80 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
21d90 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76  will have no adv
21da0 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f  erse effect.** o
21db0 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20  n SQLite. It is 
21dc0 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20  fine to have an 
21dd0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74  implementation t
21de0 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74  hat never.** ret
21df0 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  urns an error me
21e00 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69  ssage:.**.**   i
21e10 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  nt xGetLastError
21e20 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
21e30 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
21e40 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20  ar *zBuf){.**   
21e50 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d    assert(zBuf[0]
21e60 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20  =='\0');.**     
21e70 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d  return 0;.**   }
21e80 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69  .**.** However i
21e90 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  f an error messa
21ea0 67 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20  ge is supplied, 
21eb0 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72  it will be incor
21ec0 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71  porated.** by sq
21ed0 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72  lite into the er
21ee0 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61 69  ror message avai
21ef0 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65  lable to the use
21f00 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  r using.** sqlit
21f10 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73  e3_errmsg(), pos
21f20 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20  sibly making IO 
21f30 65 72 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f  errors easier to
21f40 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69   debug..*/.stati
21f50 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74  c int winGetLast
21f60 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
21f70 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
21f80 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
21f90 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
21fa0 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
21fb0 72 6e 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d  rn getLastErrorM
21fc0 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  sg(osGetLastErro
21fd0 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29  r(), nBuf, zBuf)
21fe0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
21ff0 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74  alize and deinit
22000 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61  ialize the opera
22010 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65  ting system inte
22020 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rface..*/.int sq
22030 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f  lite3_os_init(vo
22040 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71  id){.  static sq
22050 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73  lite3_vfs winVfs
22060 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20   = {.    3,     
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22080 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
22090 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
220a0 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c  ,     /* szOsFil
220b0 65 20 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41 54  e */.    MAX_PAT
220c0 48 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  H,            /*
220d0 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
220e0 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
220f0 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
22100 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c   */.    "win32",
22110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22120 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  zName */.    0, 
22130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22140 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
22150 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20  .    winOpen,   
22160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
22170 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c  en */.    winDel
22180 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ete,           /
22190 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20  * xDelete */.   
221a0 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20   winAccess,     
221b0 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73        /* xAccess
221c0 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50   */.    winFullP
221d0 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  athname,     /* 
221e0 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
221f0 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20  .    winDlOpen, 
22200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
22210 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
22220 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  lError,         
22230 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a   /* xDlError */.
22240 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20      winDlSym,   
22250 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
22260 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43  ym */.    winDlC
22270 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  lose,          /
22280 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20  * xDlClose */.  
22290 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c    winRandomness,
222a0 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
222b0 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  mness */.    win
222c0 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
222d0 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20    /* xSleep */. 
222e0 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
222f0 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72  e,      /* xCurr
22300 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77  entTime */.    w
22310 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  inGetLastError, 
22320 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45      /* xGetLastE
22330 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43  rror */.    winC
22340 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c  urrentTimeInt64,
22350 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
22360 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e  Int64 */.    win
22370 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  SetSystemCall,  
22380 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43    /* xSetSystemC
22390 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  all */.    winGe
223a0 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
223b0 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c  /* xGetSystemCal
223c0 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74  l */.    winNext
223d0 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a  SystemCall,   /*
223e0 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c   xNextSystemCall
223f0 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 2f 2a 20 44   */.  };..  /* D
22400 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74  ouble-check that
22410 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20   the aSyscall[] 
22420 61 72 72 61 79 20 68 61 73 20 62 65 65 6e 20 63  array has been c
22430 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20  onstructed.  ** 
22440 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20  correctly.  See 
22450 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38  ticket [bb3a86e8
22460 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20  90c8e96ab] */.  
22470 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a  assert( ArraySiz
22480 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 37 34 20  e(aSyscall)==74 
22490 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
224a0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a  TE_OMIT_WAL.  /*
224b0 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20   get memory map 
224c0 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75  allocation granu
224d0 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73  larity */.  mems
224e0 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20  et(&winSysInfo, 
224f0 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d  0, sizeof(SYSTEM
22500 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c  _INFO));.#if SQL
22510 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f  ITE_OS_WINRT.  o
22520 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  sGetNativeSystem
22530 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f  Info(&winSysInfo
22540 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74  );.#else.  osGet
22550 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53  SystemInfo(&winS
22560 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a  ysInfo);.#endif.
22570 20 20 61 73 73 65 72 74 28 77 69 6e 53 79 73 49    assert(winSysI
22580 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
22590 47 72 61 6e 75 6c 61 72 69 74 79 20 3e 20 30 29  Granularity > 0)
225a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
225b0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
225c0 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20 20  (&winVfs, 1);.  
225d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
225e0 3b 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  ; .}..int sqlite
225f0 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20  3_os_end(void){ 
22600 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
22610 49 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70  INRT.  if( sleep
22620 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Obj!=NULL ){.   
22630 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73   osCloseHandle(s
22640 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c  leepObj);.    sl
22650 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20  eepObj = NULL;. 
22660 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
22670 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22680 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
22690 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a              E_OS_WIN */.