/ Hex Artifact Content
Login

Artifact d19aae35a7b06f3dbaebb033eff5a68903856791:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59   */..#ifdef __CY
0220: 47 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65  GWIN__.# include
0230: 20 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a   <sys/cygwin.h>.
0240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
0250: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
0260: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
0270: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
0280: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
0290: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43  mmon.h"../*.** C
02a0: 6f 6d 70 69 6c 69 6e 67 20 61 6e 64 20 75 73 69  ompiling and usi
02b0: 6e 67 20 57 41 4c 20 6d 6f 64 65 20 72 65 71 75  ng WAL mode requ
02c0: 69 72 65 73 20 73 65 76 65 72 61 6c 20 41 50 49  ires several API
02d0: 73 20 74 68 61 74 20 61 72 65 20 6f 6e 6c 79 0a  s that are only.
02e0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ** available in 
02f0: 57 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d  Windows platform
0300: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e  s based on the N
0310: 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 23 69 66  T kernel..*/.#if
0320: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e   !SQLITE_OS_WINN
0330: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
0340: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 23  LITE_OMIT_WAL).#
0350: 20 65 72 72 6f 72 20 22 57 41 4c 20 6d 6f 64 65   error "WAL mode
0360: 20 72 65 71 75 69 72 65 73 20 73 75 70 70 6f 72   requires suppor
0370: 74 20 66 72 6f 6d 20 74 68 65 20 57 69 6e 64 6f  t from the Windo
0380: 77 73 20 4e 54 20 6b 65 72 6e 65 6c 2c 20 63 6f  ws NT kernel, co
0390: 6d 70 69 6c 65 5c 0a 20 77 69 74 68 20 53 51 4c  mpile\. with SQL
03a0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 2e 22 0a 23  ITE_OMIT_WAL.".#
03b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 65  endif../*.** Are
03c0: 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69 6e   most of the Win
03d0: 33 32 20 41 4e 53 49 20 41 50 49 73 20 61 76 61  32 ANSI APIs ava
03e0: 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77 69 74  ilable (i.e. wit
03f0: 68 20 63 65 72 74 61 69 6e 20 65 78 63 65 70 74  h certain except
0400: 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  ions.** based on
0410: 20 74 68 65 20 73 75 62 2d 70 6c 61 74 66 6f 72   the sub-platfor
0420: 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49  m)?.*/.#if !SQLI
0430: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
0440: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
0450: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
0460: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
0470: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 72  #endif../*.** Ar
0480: 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57 69  e most of the Wi
0490: 6e 33 32 20 55 6e 69 63 6f 64 65 20 41 50 49 73  n32 Unicode APIs
04a0: 20 61 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e   available (i.e.
04b0: 20 77 69 74 68 20 63 65 72 74 61 69 6e 20 65 78   with certain ex
04c0: 63 65 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65  ceptions.** base
04d0: 64 20 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61  d on the sub-pla
04e0: 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 53  tform)?.*/.#if S
04f0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
0500: 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 4e  | SQLITE_OS_WINN
0510: 54 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  T || SQLITE_OS_W
0520: 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 53  INRT.#  define S
0530: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
0540: 57 49 44 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  WIDE.#endif../*.
0550: 2a 2a 20 44 6f 20 77 65 20 6e 65 65 64 20 74 6f  ** Do we need to
0560: 20 6d 61 6e 75 61 6c 6c 79 20 64 65 66 69 6e 65   manually define
0570: 20 74 68 65 20 57 69 6e 33 32 20 66 69 6c 65 20   the Win32 file 
0580: 6d 61 70 70 69 6e 67 20 41 50 49 73 20 66 6f 72  mapping APIs for
0590: 20 75 73 65 20 77 69 74 68 20 57 41 4c 0a 2a 2a   use with WAL.**
05a0: 20 6d 6f 64 65 20 28 65 2e 67 2e 20 74 68 65 73   mode (e.g. thes
05b0: 65 20 41 50 49 73 20 61 72 65 20 61 76 61 69 6c  e APIs are avail
05c0: 61 62 6c 65 20 69 6e 20 74 68 65 20 57 69 6e 64  able in the Wind
05d0: 6f 77 73 20 43 45 20 53 44 4b 3b 20 68 6f 77 65  ows CE SDK; howe
05e0: 76 65 72 2c 20 74 68 65 79 0a 2a 2a 20 61 72 65  ver, they.** are
05f0: 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20   not present in 
0600: 74 68 65 20 68 65 61 64 65 72 20 66 69 6c 65 29  the header file)
0610: 3f 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ?.*/.#if SQLITE_
0620: 57 49 4e 33 32 5f 46 49 4c 45 4d 41 50 50 49 4e  WIN32_FILEMAPPIN
0630: 47 5f 41 50 49 20 26 26 20 21 64 65 66 69 6e 65  G_API && !define
0640: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
0650: 4c 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66 20  L)./*.** Two of 
0660: 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  the file mapping
0670: 20 41 50 49 73 20 61 72 65 20 64 69 66 66 65 72   APIs are differ
0680: 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52 54 2e  ent under WinRT.
0690: 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69    Figure out whi
06a0: 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65 65  ch.** set we nee
06b0: 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  d..*/.#if SQLITE
06c0: 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41 53  _OS_WINRT.WINBAS
06d0: 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41  EAPI HANDLE WINA
06e0: 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70  PI CreateFileMap
06f0: 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e 44  pingFromApp(HAND
0700: 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LE, \.        LP
0710: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
0720: 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f 4e  TES, ULONG, ULON
0730: 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a 0a  G64, LPCWSTR);..
0740: 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f 49  WINBASEAPI LPVOI
0750: 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65 77  D WINAPI MapView
0760: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 48 41  OfFileFromApp(HA
0770: 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f  NDLE, ULONG, ULO
0780: 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a 23  NG64, SIZE_T);.#
0790: 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65 64  else.#if defined
07a0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
07b0: 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53 45 41  S_ANSI).WINBASEA
07c0: 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50 49  PI HANDLE WINAPI
07d0: 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69   CreateFileMappi
07e0: 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53 45  ngA(HANDLE, LPSE
07f0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
0800: 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  S, \.        DWO
0810: 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44  RD, DWORD, DWORD
0820: 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64 69  , LPCSTR);.#endi
0830: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
0840: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
0850: 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66 69  SI) */..#if defi
0860: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
0870: 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e 42 41  _HAS_WIDE).WINBA
0880: 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e  SEAPI HANDLE WIN
0890: 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61  API CreateFileMa
08a0: 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20 4c  ppingW(HANDLE, L
08b0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
08c0: 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20  UTES, \.        
08d0: 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57  DWORD, DWORD, DW
08e0: 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a 23  ORD, LPCWSTR);.#
08f0: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
0900: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
0910: 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e 42  S_WIDE) */..WINB
0920: 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57 49  ASEAPI LPVOID WI
0930: 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46 69  NAPI MapViewOfFi
0940: 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52 44  le(HANDLE, DWORD
0950: 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20  , DWORD, DWORD, 
0960: 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66 20  SIZE_T);.#endif 
0970: 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
0980: 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  RT */../*.** Thi
0990: 73 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 41  s file mapping A
09a0: 50 49 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  PI is common to 
09b0: 62 6f 74 68 20 57 69 6e 33 32 20 61 6e 64 20 57  both Win32 and W
09c0: 69 6e 52 54 2e 0a 2a 2f 0a 57 49 4e 42 41 53 45  inRT..*/.WINBASE
09d0: 41 50 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20  API BOOL WINAPI 
09e0: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
09f0: 4c 50 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66  LPCVOID);.#endif
0a00: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
0a10: 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49  _FILEMAPPING_API
0a20: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0a30: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 2a 2f  ITE_OMIT_WAL) */
0a40: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 20 74 6f  ../*.** Macro to
0a50: 20 66 69 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75   find the minimu
0a60: 6d 20 6f 66 20 74 77 6f 20 6e 75 6d 65 72 69 63  m of two numeric
0a70: 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 23 69 66 6e   values..*/.#ifn
0a80: 64 65 66 20 4d 49 4e 0a 23 20 64 65 66 69 6e 65  def MIN.# define
0a90: 20 4d 49 4e 28 78 2c 79 29 20 28 28 78 29 3c 28   MIN(x,y) ((x)<(
0aa0: 79 29 3f 28 78 29 3a 28 79 29 29 0a 23 65 6e 64  y)?(x):(y)).#end
0ab0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  if../*.** Some M
0ac0: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
0ad0: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
0ae0: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
0af0: 64 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  def INVALID_FILE
0b00: 5f 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65  _ATTRIBUTES.# de
0b10: 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c  fine INVALID_FIL
0b20: 45 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44  E_ATTRIBUTES ((D
0b30: 57 4f 52 44 29 2d 31 29 20 0a 23 65 6e 64 69 66  WORD)-1) .#endif
0b40: 0a 0a 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46  ..#ifndef FILE_F
0b50: 4c 41 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  LAG_MASK.# defin
0b60: 65 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b  e FILE_FLAG_MASK
0b70: 20 20 20 20 20 20 20 20 20 20 28 30 78 46 46 33            (0xFF3
0b80: 43 30 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23  C0000).#endif..#
0b90: 69 66 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52  ifndef FILE_ATTR
0ba0: 49 42 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66  IBUTE_MASK.# def
0bb0: 69 6e 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55  ine FILE_ATTRIBU
0bc0: 54 45 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30  TE_MASK     (0x0
0bd0: 30 30 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a  003FFF7).#endif.
0be0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0bf0: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77  OMIT_WAL./* Forw
0c00: 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a  ard references *
0c10: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0c20: 20 77 69 6e 53 68 6d 20 77 69 6e 53 68 6d 3b 20   winShm winShm; 
0c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
0c40: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61  onnection to sha
0c50: 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79  red-memory */.ty
0c60: 70 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e  pedef struct win
0c70: 53 68 6d 4e 6f 64 65 20 77 69 6e 53 68 6d 4e 6f  ShmNode winShmNo
0c80: 64 65 3b 20 20 20 2f 2a 20 41 20 72 65 67 69 6f  de;   /* A regio
0c90: 6e 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n of shared-memo
0ca0: 72 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry */.#endif../*
0cb0: 0a 2a 2a 20 57 69 6e 43 45 20 6c 61 63 6b 73 20  .** WinCE lacks 
0cc0: 6e 61 74 69 76 65 20 73 75 70 70 6f 72 74 20 66  native support f
0cd0: 6f 72 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  or file locking 
0ce0: 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 66 61  so we have to fa
0cf0: 6b 65 20 69 74 0a 2a 2a 20 77 69 74 68 20 73 6f  ke it.** with so
0d00: 6d 65 20 63 6f 64 65 20 6f 66 20 6f 75 72 20 6f  me code of our o
0d10: 77 6e 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  wn..*/.#if SQLIT
0d20: 45 5f 4f 53 5f 57 49 4e 43 45 0a 74 79 70 65 64  E_OS_WINCE.typed
0d30: 65 66 20 73 74 72 75 63 74 20 77 69 6e 63 65 4c  ef struct winceL
0d40: 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 6e 52 65 61  ock {.  int nRea
0d50: 64 65 72 73 3b 20 20 20 20 20 20 20 2f 2a 20 4e  ders;       /* N
0d60: 75 6d 62 65 72 20 6f 66 20 72 65 61 64 65 72 20  umber of reader 
0d70: 6c 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 2a  locks obtained *
0d80: 2f 0a 20 20 42 4f 4f 4c 20 62 50 65 6e 64 69 6e  /.  BOOL bPendin
0d90: 67 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63  g;      /* Indic
0da0: 61 74 65 73 20 61 20 70 65 6e 64 69 6e 67 20 6c  ates a pending l
0db0: 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62 74  ock has been obt
0dc0: 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ained */.  BOOL 
0dd0: 62 52 65 73 65 72 76 65 64 3b 20 20 20 20 20 2f  bReserved;     /
0de0: 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20 72 65  * Indicates a re
0df0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 68 61 73 20  served lock has 
0e00: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a 2f  been obtained */
0e10: 0a 20 20 42 4f 4f 4c 20 62 45 78 63 6c 75 73 69  .  BOOL bExclusi
0e20: 76 65 3b 20 20 20 20 2f 2a 20 49 6e 64 69 63 61  ve;    /* Indica
0e30: 74 65 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  tes an exclusive
0e40: 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f   lock has been o
0e50: 62 74 61 69 6e 65 64 20 2a 2f 0a 7d 20 77 69 6e  btained */.} win
0e60: 63 65 4c 6f 63 6b 3b 0a 23 65 6e 64 69 66 0a 0a  ceLock;.#endif..
0e70: 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 46 69 6c  /*.** The winFil
0e80: 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  e structure is a
0e90: 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c   subclass of sql
0ea0: 69 74 65 33 5f 66 69 6c 65 2a 20 73 70 65 63 69  ite3_file* speci
0eb0: 66 69 63 20 74 6f 20 74 68 65 20 77 69 6e 33 32  fic to the win32
0ec0: 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69 74 79 20  .** portability 
0ed0: 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70 65 64 65  layer..*/.typede
0ee0: 66 20 73 74 72 75 63 74 20 77 69 6e 46 69 6c 65  f struct winFile
0ef0: 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72 75 63 74   winFile;.struct
0f00: 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20 63 6f 6e   winFile {.  con
0f10: 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
0f20: 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20  thods *pMethod; 
0f30: 2f 2a 2a 2a 20 4d 75 73 74 20 62 65 20 66 69 72  /*** Must be fir
0f40: 73 74 20 2a 2a 2a 2f 0a 20 20 73 71 6c 69 74 65  st ***/.  sqlite
0f50: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
0f60: 20 20 2f 2a 20 54 68 65 20 56 46 53 20 75 73 65    /* The VFS use
0f70: 64 20 74 6f 20 6f 70 65 6e 20 74 68 69 73 20 66  d to open this f
0f80: 69 6c 65 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ile */.  HANDLE 
0f90: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0fa0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
0fb0: 63 63 65 73 73 69 6e 67 20 74 68 65 20 66 69 6c  ccessing the fil
0fc0: 65 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 74 79  e */.  u8 lockty
0fd0: 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pe;            /
0fe0: 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63  * Type of lock c
0ff0: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e  urrently held on
1000: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
1010: 73 68 6f 72 74 20 73 68 61 72 65 64 4c 6f 63 6b  short sharedLock
1020: 42 79 74 65 3b 20 20 20 2f 2a 20 52 61 6e 64 6f  Byte;   /* Rando
1030: 6d 6c 79 20 63 68 6f 73 65 6e 20 62 79 74 65 20  mly chosen byte 
1040: 75 73 65 64 20 61 73 20 61 20 73 68 61 72 65 64  used as a shared
1050: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 63 74   lock */.  u8 ct
1060: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  rlFlags;        
1070: 20 20 20 2f 2a 20 46 6c 61 67 73 2e 20 20 53 65     /* Flags.  Se
1080: 65 20 57 49 4e 46 49 4c 45 5f 2a 20 62 65 6c 6f  e WINFILE_* belo
1090: 77 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  w */.  DWORD las
10a0: 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 2f  tErrno;        /
10b0: 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72  * The Windows er
10c0: 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73  rno from the las
10d0: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 23  t I/O error */.#
10e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10f0: 49 54 5f 57 41 4c 0a 20 20 77 69 6e 53 68 6d 20  IT_WAL.  winShm 
1100: 2a 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *pShm;          
1110: 20 2f 2a 20 49 6e 73 74 61 6e 63 65 20 6f 66 20   /* Instance of 
1120: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 6f 6e  shared memory on
1130: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 23 65   this file */.#e
1140: 6e 64 69 66 0a 20 20 63 6f 6e 73 74 20 63 68 61  ndif.  const cha
1150: 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 2f  r *zPath;      /
1160: 2a 20 46 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  * Full pathname 
1170: 6f 66 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  of this file */.
1180: 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20    int szChunk;  
1190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 75            /* Chu
11a0: 6e 6b 20 73 69 7a 65 20 63 6f 6e 66 69 67 75 72  nk size configur
11b0: 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55 4e  ed by FCNTL_CHUN
11c0: 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53 51  K_SIZE */.#if SQ
11d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
11e0: 4c 50 57 53 54 52 20 7a 44 65 6c 65 74 65 4f 6e  LPWSTR zDeleteOn
11f0: 43 6c 6f 73 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  Close;  /* Name 
1200: 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74  of file to delet
1210: 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a  e when closing *
1220: 2f 0a 20 20 48 41 4e 44 4c 45 20 68 4d 75 74 65  /.  HANDLE hMute
1230: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  x;          /* M
1240: 75 74 65 78 20 75 73 65 64 20 74 6f 20 63 6f 6e  utex used to con
1250: 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 73  trol access to s
1260: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 20 20 0a  hared lock */  .
1270: 20 20 48 41 4e 44 4c 45 20 68 53 68 61 72 65 64    HANDLE hShared
1280: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61  ;         /* Sha
1290: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
12a0: 6e 74 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  nt used for lock
12b0: 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4c 6f  ing */.  winceLo
12c0: 63 6b 20 6c 6f 63 61 6c 3b 20 20 20 20 20 20 20  ck local;       
12d0: 20 2f 2a 20 4c 6f 63 6b 73 20 6f 62 74 61 69 6e   /* Locks obtain
12e0: 65 64 20 62 79 20 74 68 69 73 20 69 6e 73 74 61  ed by this insta
12f0: 6e 63 65 20 6f 66 20 77 69 6e 46 69 6c 65 20 2a  nce of winFile *
1300: 2f 0a 20 20 77 69 6e 63 65 4c 6f 63 6b 20 2a 73  /.  winceLock *s
1310: 68 61 72 65 64 3b 20 20 20 20 20 20 2f 2a 20 47  hared;      /* G
1320: 6c 6f 62 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  lobal shared loc
1330: 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65  k memory for the
1340: 20 66 69 6c 65 20 20 2a 2f 0a 23 65 6e 64 69 66   file  */.#endif
1350: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  .};../*.** Allow
1360: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69  ed values for wi
1370: 6e 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a  nFile.ctrlFlags.
1380: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
1390: 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20  LE_PERSIST_WAL  
13a0: 20 20 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72     0x04   /* Per
13b0: 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65  sistent WAL mode
13c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46   */.#define WINF
13d0: 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20  ILE_PSOW        
13e0: 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51      0x10   /* SQ
13f0: 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
1400: 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a  SAFE_OVERWRITE *
1410: 2f 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a  /../*. * The siz
1420: 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
1430: 75 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  used by sqlite3_
1440: 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75  win32_write_debu
1450: 67 28 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  g().. */.#ifndef
1460: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
1470: 47 5f 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65  G_BUF_SIZE.#  de
1480: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
1490: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20  2_DBG_BUF_SIZE  
14a0: 20 28 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a   ((int)(4096-siz
14b0: 65 6f 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e  eof(DWORD))).#en
14c0: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76  dif../*. * The v
14d0: 61 6c 75 65 20 75 73 65 64 20 77 69 74 68 20 73  alue used with s
14e0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
14f0: 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20  _directory() to 
1500: 73 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20  specify that. * 
1510: 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
1520: 72 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61  ry should be cha
1530: 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  nged.. */.#ifnde
1540: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  f SQLITE_WIN32_D
1550: 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  ATA_DIRECTORY_TY
1560: 50 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  PE.#  define SQL
1570: 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44  ITE_WIN32_DATA_D
1580: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28 31  IRECTORY_TYPE (1
1590: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
15a0: 54 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77  The value used w
15b0: 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  ith sqlite3_win3
15c0: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
15d0: 29 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61  ) to specify tha
15e0: 74 0a 20 2a 20 74 68 65 20 74 65 6d 70 6f 72 61  t. * the tempora
15f0: 72 79 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f  ry directory sho
1600: 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  uld be changed..
1610: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1620: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
1630: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20  RECTORY_TYPE.#  
1640: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
1650: 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f  N32_TEMP_DIRECTO
1660: 52 59 5f 54 59 50 45 20 28 32 29 0a 23 65 6e 64  RY_TYPE (2).#end
1670: 69 66 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d  if../*. * If com
1680: 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
1690: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f  E_WIN32_MALLOC o
16a0: 6e 20 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69  n Windows, we wi
16b0: 6c 6c 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61  ll use the. * va
16c0: 72 69 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20  rious Win32 API 
16d0: 68 65 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69  heap functions i
16e0: 6e 73 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77  nstead of our ow
16f0: 6e 2e 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  n.. */.#ifdef SQ
1700: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
1710: 43 0a 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73  C../*. * If this
1720: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e   is non-zero, an
1730: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
1740: 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20 62  ill be created b
1750: 79 20 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e  y the native Win
1760: 33 32 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20  32. * allocator 
1770: 73 75 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72  subsystem; other
1780: 77 69 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c  wise, the defaul
1790: 74 20 70 72 6f 63 65 73 73 20 68 65 61 70 20 77  t process heap w
17a0: 69 6c 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68  ill be used.  Th
17b0: 69 73 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61  is. * setting ha
17c0: 73 20 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e  s no effect when
17d0: 20 63 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57   compiling for W
17e0: 69 6e 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c  inRT.  By defaul
17f0: 74 2c 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c  t, this is enabl
1800: 65 64 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f  ed. * and an iso
1810: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20  lated heap will 
1820: 62 65 20 63 72 65 61 74 65 64 20 74 6f 20 73 74  be created to st
1830: 6f 72 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65  ore all allocate
1840: 64 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a  d data.. *. ****
1850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1880: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1890: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41  **********. * WA
18a0: 52 4e 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70  RNING: It is imp
18b0: 6f 72 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74  ortant to note t
18c0: 68 61 74 20 77 68 65 6e 20 74 68 69 73 20 73 65  hat when this se
18d0: 74 74 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72  tting is non-zer
18e0: 6f 20 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20  o and the. *    
18f0: 20 20 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74        winMemShut
1900: 64 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73  down function is
1910: 20 63 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79   called (e.g. by
1920: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75   the sqlite3_shu
1930: 74 64 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20  tdown. *        
1940: 20 20 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c    function), all
1950: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 61   data that was a
1960: 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74  llocated using t
1970: 68 65 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70  he isolated heap
1980: 20 77 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20   will. *        
1990: 20 20 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64    be freed immed
19a0: 69 61 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61  iately and any a
19b0: 74 74 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73  ttempt to access
19c0: 20 61 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65   any of that fre
19d0: 65 64 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64  ed. *          d
19e0: 61 74 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20  ata will almost 
19f0: 63 65 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74  certainly result
1a00: 20 69 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65   in an immediate
1a10: 20 61 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f   access violatio
1a20: 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.. ************
1a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a70: 2a 2a 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  **. */.#ifndef S
1a80: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
1a90: 5f 43 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e  _CREATE.#  defin
1aa0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
1ab0: 45 41 50 5f 43 52 45 41 54 45 20 20 20 20 28 54  EAP_CREATE    (T
1ac0: 52 55 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  RUE).#endif../*.
1ad0: 20 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73   * The initial s
1ae0: 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ize of the Win32
1af0: 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20  -specific heap. 
1b00: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
1b10: 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66  be zero.. */.#if
1b20: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
1b30: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
1b40: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
1b50: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
1b60: 54 5f 53 49 5a 45 20 28 28 53 51 4c 49 54 45 5f  T_SIZE ((SQLITE_
1b70: 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49  DEFAULT_CACHE_SI
1b80: 5a 45 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20  ZE) * \.        
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1bb0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
1bc0: 41 47 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 34  AGE_SIZE) + 4194
1bd0: 33 30 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  304).#endif../*.
1be0: 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73   * The maximum s
1bf0: 69 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ize of the Win32
1c00: 2d 73 70 65 63 69 66 69 63 20 68 65 61 70 2e 20  -specific heap. 
1c10: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
1c20: 62 65 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66  be zero.. */.#if
1c30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
1c40: 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a  2_HEAP_MAX_SIZE.
1c50: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
1c60: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
1c70: 53 49 5a 45 20 20 28 30 29 0a 23 65 6e 64 69 66  SIZE  (0).#endif
1c80: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72  ../*. * The extr
1c90: 61 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69  a flags to use i
1ca0: 6e 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57  n calls to the W
1cb0: 69 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e 20  in32 heap APIs. 
1cc0: 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20   This value may 
1cd0: 62 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74  be. * zero for t
1ce0: 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76  he default behav
1cf0: 69 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ior.. */.#ifndef
1d00: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
1d10: 41 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69  AP_FLAGS.#  defi
1d20: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
1d30: 48 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20 28  HEAP_FLAGS     (
1d40: 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0).#endif../*.**
1d50: 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61 20   The winMemData 
1d60: 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65 73  structure stores
1d70: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71   information req
1d80: 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69 6e  uired by the Win
1d90: 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 73  32-specific.** s
1da0: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
1db0: 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ds implementatio
1dc0: 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  n..*/.typedef st
1dd0: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
1de0: 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72 75  winMemData;.stru
1df0: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b 0a  ct winMemData {.
1e00: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1e10: 20 75 33 32 20 6d 61 67 69 63 3b 20 20 20 20 2f   u32 magic;    /
1e20: 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74  * Magic number t
1e30: 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75  o detect structu
1e40: 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a  re corruption. *
1e50: 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44 4c  /.#endif.  HANDL
1e60: 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65 20  E hHeap; /* The 
1e70: 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68 65  handle to our he
1e80: 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f  ap. */.  BOOL bO
1e90: 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65 20  wned;  /* Do we 
1ea0: 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69 2e  own the heap (i.
1eb0: 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f 6e  e. destroy it on
1ec0: 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a 7d   shutdown)? */.}
1ed0: 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
1ee0: 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d  G.#define WINMEM
1ef0: 5f 4d 41 47 49 43 20 20 20 20 20 30 78 34 32 62  _MAGIC     0x42b
1f00: 32 38 33 30 62 0a 23 65 6e 64 69 66 0a 0a 73 74  2830b.#endif..st
1f10: 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d  atic struct winM
1f20: 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64  emData win_mem_d
1f30: 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20  ata = {.#ifndef 
1f40: 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f  NDEBUG.  WINMEM_
1f50: 4d 41 47 49 43 2c 0a 23 65 6e 64 69 66 0a 20 20  MAGIC,.#endif.  
1f60: 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 7d 3b 0a 0a  NULL, FALSE.};..
1f70: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23  #ifndef NDEBUG.#
1f80: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73  define winMemAss
1f90: 65 72 74 4d 61 67 69 63 28 29 20 61 73 73 65 72  ertMagic() asser
1fa0: 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e  t( win_mem_data.
1fb0: 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  magic==WINMEM_MA
1fc0: 47 49 43 20 29 0a 23 65 6c 73 65 0a 23 64 65 66  GIC ).#else.#def
1fd0: 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ine winMemAssert
1fe0: 4d 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a  Magic().#endif..
1ff0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65  #define winMemGe
2000: 74 48 65 61 70 28 29 20 77 69 6e 5f 6d 65 6d 5f  tHeap() win_mem_
2010: 64 61 74 61 2e 68 48 65 61 70 0a 0a 73 74 61 74  data.hHeap..stat
2020: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d  ic void *winMemM
2030: 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73  alloc(int nBytes
2040: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
2050: 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a  inMemFree(void *
2060: 70 50 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20  pPrior);.static 
2070: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c  void *winMemReal
2080: 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  loc(void *pPrior
2090: 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  , int nBytes);.s
20a0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
20b0: 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73  Size(void *p);.s
20c0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
20d0: 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a  Roundup(int n);.
20e0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
20f0: 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70  mInit(void *pApp
2100: 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f  Data);.static vo
2110: 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77  id winMemShutdow
2120: 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  n(void *pAppData
2130: 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  );..const sqlite
2140: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73  3_mem_methods *s
2150: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
2160: 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20  2(void);.#endif 
2170: 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
2180: 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  MALLOC */../*.**
2190: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
21a0: 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d  ariable is (norm
21b0: 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61  ally) set once a
21c0: 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73  nd never changes
21d0: 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20  .** thereafter. 
21e0: 20 49 74 20 72 65 63 6f 72 64 73 20 77 68 65 74   It records whet
21f0: 68 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e  her the operatin
2200: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
2210: 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a  x.** or WinNT..*
2220: 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74  *.** 0:   Operat
2230: 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f  ing system unkno
2240: 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72  wn..** 1:   Oper
2250: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
2260: 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f  Win9x..** 2:   O
2270: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
2280: 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20  is WinNT..**.** 
2290: 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69  In order to faci
22a0: 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f  litate testing o
22b0: 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d  n a WinNT system
22c0: 2c 20 74 68 65 20 74 65 73 74 20 66 69 78 74 75  , the test fixtu
22d0: 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c  re.** can manual
22e0: 6c 79 20 73 65 74 20 74 68 69 73 20 76 61 6c 75  ly set this valu
22f0: 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74  e to 1 to emulat
2300: 65 20 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72  e Win98 behavior
2310: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2320: 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
2330: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b  te3_os_type = 0;
2340: 0a 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e  .#else.static in
2350: 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  t sqlite3_os_typ
2360: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 0;.#endif..#
2370: 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23  ifndef SYSCALL.#
2380: 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c    define SYSCALL
2390: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
23a0: 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  _ptr.#endif../*.
23b0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
23c0: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
23d0: 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20  e on Windows CE 
23e0: 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23  or WinRT.. */..#
23f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2400: 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
2410: 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20  WINRT.#  define 
2420: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
2430: 49 28 29 20 20 20 20 20 20 20 31 0a 23 65 6e 64  I()       1.#end
2440: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73  if../*.** Many s
2450: 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20  ystem calls are 
2460: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
2470: 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63   pointer-to-func
2480: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a  tions so that.**
2490: 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65   they may be ove
24a0: 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69  rridden at runti
24b0: 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  me to facilitate
24c0: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
24d0: 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69   during.** testi
24e0: 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e  ng and sandboxin
24f0: 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  g.  The followin
2500: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68  g array holds th
2510: 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e  e names and poin
2520: 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f  ters.** to all o
2530: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
2540: 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  em calls..*/.sta
2550: 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73  tic struct win_s
2560: 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74  yscall {.  const
2570: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
2580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2590: 20 6f 66 20 74 68 65 20 73 79 74 65 6d 20 63 61   of the sytem ca
25a0: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
25b0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72  syscall_ptr pCur
25c0: 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74  rent; /* Current
25d0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
25e0: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
25f0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2600: 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20  tr pDefault; /* 
2610: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f  Default value */
2620: 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20  .} aSyscall[] = 
2630: 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
2640: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
2650: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
2660: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22  AreFileApisANSI"
2670: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
2680: 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73 41 4e  LL)AreFileApisAN
2690: 53 49 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  SI,         0 },
26a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72 65 46  .#else.  { "AreF
26b0: 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20  ileApisANSI",   
26c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
26d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
26f0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41  dif..#ifndef osA
2700: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 0a 23  reFileApisANSI.#
2710: 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65  define osAreFile
2720: 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28  ApisANSI ((BOOL(
2730: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
2740: 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72  Syscall[0].pCurr
2750: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
2760: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
2770: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
2780: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2790: 45 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65  E).  { "CharLowe
27a0: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
27b0: 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 4c    (SYSCALL)CharL
27c0: 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20 20 20  owerW,          
27d0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
27e0: 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c   { "CharLowerW",
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
2800: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
2830: 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65 72  fine osCharLower
2840: 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50  W ((LPWSTR(WINAP
2850: 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79 73  I*)(LPWSTR))aSys
2860: 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74  call[1].pCurrent
2870: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
2880: 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65  _WINCE && define
2890: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
28a0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68  AS_WIDE).  { "Ch
28b0: 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20 20  arUpperW",      
28c0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
28d0: 29 43 68 61 72 55 70 70 65 72 57 2c 20 20 20 20  )CharUpperW,    
28e0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
28f0: 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 55 70  else.  { "CharUp
2900: 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  perW",          
2910: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
2940: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61  f..#define osCha
2950: 72 55 70 70 65 72 57 20 28 28 4c 50 57 53 54 52  rUpperW ((LPWSTR
2960: 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52  (WINAPI*)(LPWSTR
2970: 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43  ))aSyscall[2].pC
2980: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c  urrent)..  { "Cl
2990: 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20 20 20 20  oseHandle",     
29a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
29b0: 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20  )CloseHandle,   
29c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
29d0: 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48  #define osCloseH
29e0: 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  andle ((BOOL(WIN
29f0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
2a00: 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65  yscall[3].pCurre
2a10: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
2a20: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2a30: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43 72 65  S_ANSI).  { "Cre
2a40: 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  ateFileA",      
2a50: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2a60: 43 72 65 61 74 65 46 69 6c 65 41 2c 20 20 20 20  CreateFileA,    
2a70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2a80: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
2a90: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
2aa0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2ad0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
2ae0: 74 65 46 69 6c 65 41 20 28 28 48 41 4e 44 4c 45  teFileA ((HANDLE
2af0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
2b00: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
2b10: 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49          LPSECURI
2b20: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57  TY_ATTRIBUTES,DW
2b30: 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45  ORD,DWORD,HANDLE
2b40: 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43  ))aSyscall[4].pC
2b50: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
2b60: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
2b70: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2b80: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
2b90: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57    { "CreateFileW
2ba0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
2bb0: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
2bc0: 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  leW,            
2bd0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
2be0: 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20  "CreateFileW",  
2bf0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
2c00: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
2c20: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
2c30: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 20  e osCreateFileW 
2c40: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
2c50: 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c  )(LPCWSTR,DWORD,
2c60: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
2c70: 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52   LPSECURITY_ATTR
2c80: 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f  IBUTES,DWORD,DWO
2c90: 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63  RD,HANDLE))aSysc
2ca0: 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29  all[5].pCurrent)
2cb0: 0a 0a 23 69 66 20 28 21 53 51 4c 49 54 45 5f 4f  ..#if (!SQLITE_O
2cc0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
2cd0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2ce0: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a 20  HAS_ANSI) && \. 
2cf0: 20 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28         !defined(
2d00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
2d10: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
2d20: 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20  eMappingA",     
2d30: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
2d40: 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20 20 20  FileMappingA,   
2d50: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
2d60: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
2d70: 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59  pingA",      (SY
2d80: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2da0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
2db0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
2dc0: 4d 61 70 70 69 6e 67 41 20 28 28 48 41 4e 44 4c  MappingA ((HANDL
2dd0: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  E(WINAPI*)(HANDL
2de0: 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  E,LPSECURITY_ATT
2df0: 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20  RIBUTES, \.     
2e00: 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44     DWORD,DWORD,D
2e10: 57 4f 52 44 2c 4c 50 43 53 54 52 29 29 61 53 79  WORD,LPCSTR))aSy
2e20: 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e  scall[6].pCurren
2e30: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
2e40: 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c  S_WINCE || (!SQL
2e50: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
2e60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2e70: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26  IN32_HAS_WIDE) &
2e80: 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66  & \.        !def
2e90: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2ea0: 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65 61  _WAL)).  { "Crea
2eb0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c  teFileMappingW",
2ec0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
2ed0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
2ee0: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
2ef0: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
2f00: 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20  leMappingW",    
2f10: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2f40: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
2f50: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28  eFileMappingW ((
2f60: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
2f70: 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54  HANDLE,LPSECURIT
2f80: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a  Y_ATTRIBUTES, \.
2f90: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57          DWORD,DW
2fa0: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54  ORD,DWORD,LPCWST
2fb0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70  R))aSyscall[7].p
2fc0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
2fd0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
2fe0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
2ff0: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
3000: 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65  .  { "CreateMute
3010: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xW",            
3020: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d  (SYSCALL)CreateM
3030: 75 74 65 78 57 2c 20 20 20 20 20 20 20 20 20 20  utexW,          
3040: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3050: 20 22 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c   "CreateMutexW",
3060: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3070: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3090: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
30a0: 6e 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78  ne osCreateMutex
30b0: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
30c0: 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41  I*)(LPSECURITY_A
30d0: 54 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20  TTRIBUTES,BOOL, 
30e0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53 54  \.        LPCWST
30f0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70  R))aSyscall[8].p
3100: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
3110: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3120: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
3130: 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20   "DeleteFileA", 
3140: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3150: 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41  CALL)DeleteFileA
3160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3170: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65  },.#else.  { "De
3180: 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  leteFileA",     
3190: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
31a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
31b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
31c0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
31d0: 73 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42  sDeleteFileA ((B
31e0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
31f0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  STR))aSyscall[9]
3200: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3210: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3220: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
3230: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22   { "DeleteFileW"
3240: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
3250: 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c  YSCALL)DeleteFil
3260: 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eW,             
3270: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3280: 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20  DeleteFileW",   
3290: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
32a0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
32c0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
32d0: 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28   osDeleteFileW (
32e0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
32f0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
3300: 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [10].pCurrent)..
3310: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
3320: 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  NCE.  { "FileTim
3330: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
3340: 22 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65  ", (SYSCALL)File
3350: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
3360: 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ime, 0 },.#else.
3370: 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c    { "FileTimeToL
3380: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28  ocalFileTime", (
3390: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
33c0: 65 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65  efine osFileTime
33d0: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20  ToLocalFileTime 
33e0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
33f0: 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c  CONST FILETIME*,
3400: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c   \.        LPFIL
3410: 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  ETIME))aSyscall[
3420: 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  11].pCurrent)..#
3430: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
3440: 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  CE.  { "FileTime
3450: 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  ToSystemTime",  
3460: 20 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54    (SYSCALL)FileT
3470: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c  imeToSystemTime,
3480: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3490: 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79   { "FileTimeToSy
34a0: 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53  stemTime",    (S
34b0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34d0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
34e0: 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54  fine osFileTimeT
34f0: 6f 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f  oSystemTime ((BO
3500: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53  OL(WINAPI*)(CONS
3510: 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20  T FILETIME*, \. 
3520: 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54         LPSYSTEMT
3530: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32  IME))aSyscall[12
3540: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3550: 20 22 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65   "FlushFileBuffe
3560: 72 73 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  rs",        (SYS
3570: 43 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75  CALL)FlushFileBu
3580: 66 66 65 72 73 2c 20 20 20 20 20 20 20 20 30 20  ffers,        0 
3590: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c  },..#define osFl
35a0: 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 20 28  ushFileBuffers (
35b0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
35c0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
35d0: 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  13].pCurrent)..#
35e0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
35f0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
3600: 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  ).  { "FormatMes
3610: 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20  sageA",         
3620: 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74   (SYSCALL)Format
3630: 4d 65 73 73 61 67 65 41 2c 20 20 20 20 20 20 20  MessageA,       
3640: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3650: 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  { "FormatMessage
3660: 41 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  A",          (SY
3670: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3690: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
36a0: 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  ine osFormatMess
36b0: 61 67 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e  ageA ((DWORD(WIN
36c0: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56  API*)(DWORD,LPCV
36d0: 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  OID,DWORD,DWORD,
36e0: 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  LPSTR, \.       
36f0: 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29   DWORD,va_list*)
3700: 29 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43  )aSyscall[14].pC
3710: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3720: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3730: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
3740: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22  "FormatMessageW"
3750: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
3760: 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67  ALL)FormatMessag
3770: 65 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  eW,          0 }
3780: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72  ,.#else.  { "For
3790: 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20  matMessageW",   
37a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
37b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
37c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
37d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
37e0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28  FormatMessageW (
37f0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
3800: 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57  DWORD,LPCVOID,DW
3810: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52  ORD,DWORD,LPWSTR
3820: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
3830: 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73  D,va_list*))aSys
3840: 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e  call[15].pCurren
3850: 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t)..#if !defined
3860: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41  (SQLITE_OMIT_LOA
3870: 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b  D_EXTENSION).  {
3880: 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20   "FreeLibrary", 
3890: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
38a0: 43 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79  CALL)FreeLibrary
38b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
38c0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72  },.#else.  { "Fr
38d0: 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20  eeLibrary",     
38e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
38f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3900: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3910: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3920: 73 46 72 65 65 4c 69 62 72 61 72 79 20 28 28 42  sFreeLibrary ((B
3930: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f  OOL(WINAPI*)(HMO
3940: 44 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  DULE))aSyscall[1
3950: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  6].pCurrent)..  
3960: 7b 20 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f  { "GetCurrentPro
3970: 63 65 73 73 49 64 22 2c 20 20 20 20 20 28 53 59  cessId",     (SY
3980: 53 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74  SCALL)GetCurrent
3990: 50 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30  ProcessId,     0
39a0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
39b0: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
39c0: 49 64 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  Id ((DWORD(WINAP
39d0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
39e0: 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[17].pCurrent)
39f0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
3a00: 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65  _WINCE && define
3a10: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3a20: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
3a30: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 22  tDiskFreeSpaceA"
3a40: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
3a50: 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  )GetDiskFreeSpac
3a60: 65 41 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  eA,       0 },.#
3a70: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73  else.  { "GetDis
3a80: 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20 20 20  kFreeSpaceA",   
3a90: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ab0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3ac0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3ad0: 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 20 28  DiskFreeSpaceA (
3ae0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
3af0: 50 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50  PCSTR,LPDWORD,LP
3b00: 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c  DWORD,LPDWORD, \
3b10: 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44  .        LPDWORD
3b20: 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70  ))aSyscall[18].p
3b30: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
3b40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
3b50: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
3b60: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
3b70: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3b80: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73  IDE).  { "GetDis
3b90: 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20  kFreeSpaceW",   
3ba0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
3bb0: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20  DiskFreeSpaceW, 
3bc0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3bd0: 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65  .  { "GetDiskFre
3be0: 65 53 70 61 63 65 57 22 2c 20 20 20 20 20 20 20  eSpaceW",       
3bf0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3c20: 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b  define osGetDisk
3c30: 46 72 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f  FreeSpaceW ((BOO
3c40: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  L(WINAPI*)(LPCWS
3c50: 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f  TR,LPDWORD,LPDWO
3c60: 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20  RD,LPDWORD, \.  
3c70: 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61        LPDWORD))a
3c80: 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72  Syscall[19].pCur
3c90: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3ca0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3cb0: 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47  HAS_ANSI).  { "G
3cc0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
3cd0: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
3ce0: 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  L)GetFileAttribu
3cf0: 74 65 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a  tesA,      0 },.
3d00: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69  #else.  { "GetFi
3d10: 6c 65 41 74 74 72 69 62 75 74 65 73 41 22 2c 20  leAttributesA", 
3d20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3d50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
3d60: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
3d70: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
3d80: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
3d90: 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[20].pCurrent)
3da0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
3db0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
3dc0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3dd0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
3de0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
3df0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
3e00: 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  )GetFileAttribut
3e10: 65 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  esW,      0 },.#
3e20: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
3e30: 65 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20  eAttributesW",  
3e40: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3e70: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3e80: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 20  FileAttributesW 
3e90: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
3ea0: 28 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  (LPCWSTR))aSysca
3eb0: 6c 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[21].pCurrent)
3ec0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
3ed0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3ee0: 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c  IDE).  { "GetFil
3ef0: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c  eAttributesExW",
3f00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
3f10: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
3f20: 57 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  W,    0 },.#else
3f30: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
3f40: 72 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20  ributesExW",    
3f50: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
3f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f70: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
3f80: 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65  define osGetFile
3f90: 41 74 74 72 69 62 75 74 65 73 45 78 57 20 28 28  AttributesExW ((
3fa0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
3fb0: 43 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58  CWSTR,GET_FILEEX
3fc0: 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a  _INFO_LEVELS, \.
3fd0: 20 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29          LPVOID))
3fe0: 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75  aSyscall[22].pCu
3ff0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4000: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
4010: 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20   "GetFileSize", 
4020: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4030: 43 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65  CALL)GetFileSize
4040: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
4050: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4060: 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20  tFileSize",     
4070: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4080: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4090: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
40a0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
40b0: 73 47 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44  sGetFileSize ((D
40c0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
40d0: 4e 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53  NDLE,LPDWORD))aS
40e0: 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72  yscall[23].pCurr
40f0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4100: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
4110: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4120: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
4130: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
4140: 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eA",        (SYS
4150: 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68  CALL)GetFullPath
4160: 4e 61 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20  NameA,        0 
4170: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4180: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c  tFullPathNameA",
4190: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
41a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
41b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
41c0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
41d0: 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
41e0: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
41f0: 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c  *)(LPCSTR,DWORD,
4200: 4c 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  LPSTR, \.       
4210: 20 4c 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c   LPSTR*))aSyscal
4220: 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[24].pCurrent).
4230: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4240: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
4250: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
4260: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4270: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4280: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
4290: 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  W",        (SYSC
42a0: 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e  ALL)GetFullPathN
42b0: 61 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d  ameW,        0 }
42c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
42d0: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20  FullPathNameW", 
42e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
42f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4300: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4310: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4320: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
4330: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
4340: 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c  )(LPCWSTR,DWORD,
4350: 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  LPWSTR, \.      
4360: 20 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63    LPWSTR*))aSysc
4370: 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74  all[25].pCurrent
4380: 29 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45  )..  { "GetLastE
4390: 72 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20  rror",          
43a0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61    (SYSCALL)GetLa
43b0: 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  stError,        
43c0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
43d0: 65 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  e osGetLastError
43e0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
43f0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
4400: 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [26].pCurrent)..
4410: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
4420: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
4430: 54 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c  TENSION).#if SQL
4440: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
4450: 2a 20 54 68 65 20 47 65 74 50 72 6f 63 41 64 64  * The GetProcAdd
4460: 72 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20  ressA() routine 
4470: 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
4480: 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e  e on Windows CE.
4490: 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63   */.  { "GetProc
44a0: 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20  AddressA",      
44b0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50     (SYSCALL)GetP
44c0: 72 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20 20  rocAddressA,    
44d0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
44e0: 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57    /* All other W
44f0: 69 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73  indows platforms
4500: 20 65 78 70 65 63 74 20 47 65 74 50 72 6f 63 41   expect GetProcA
4510: 64 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65  ddress() to take
4520: 0a 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74  .  ** an ANSI st
4530: 72 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20  ring regardless 
4540: 6f 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20  of the _UNICODE 
4550: 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22  setting */.  { "
4560: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22  GetProcAddressA"
4570: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
4580: 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73  LL)GetProcAddres
4590: 73 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  s,          0 },
45a0: 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20  .#endif.#else.  
45b0: 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73  { "GetProcAddres
45c0: 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  sA",         (SY
45d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
45e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
45f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4600: 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64  ine osGetProcAdd
4610: 72 65 73 73 41 20 28 28 46 41 52 50 52 4f 43 28  ressA ((FARPROC(
4620: 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45  WINAPI*)(HMODULE
4630: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53  , \.        LPCS
4640: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d  TR))aSyscall[27]
4650: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4660: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
4670: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49  .  { "GetSystemI
4680: 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20  nfo",           
4690: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
46a0: 65 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  emInfo,         
46b0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
46c0: 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22   "GetSystemInfo"
46d0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
46e0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4700: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4710: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e  ne osGetSystemIn
4720: 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  fo ((VOID(WINAPI
4730: 2a 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f  *)(LPSYSTEM_INFO
4740: 29 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70  ))aSyscall[28].p
4750: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
4760: 65 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  etSystemTime",  
4770: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4780: 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c  L)GetSystemTime,
4790: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
47a0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79  .#define osGetSy
47b0: 73 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28  stemTime ((VOID(
47c0: 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45  WINAPI*)(LPSYSTE
47d0: 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  MTIME))aSyscall[
47e0: 32 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  29].pCurrent)..#
47f0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4800: 4e 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74  NCE.  { "GetSyst
4810: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
4820: 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53  ", (SYSCALL)GetS
4830: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
4840: 69 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ime, 0 },.#else.
4850: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69    { "GetSystemTi
4860: 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28  meAsFileTime", (
4870: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4890: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
48a0: 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65  efine osGetSyste
48b0: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20  mTimeAsFileTime 
48c0: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
48d0: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c   \.        LPFIL
48e0: 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  ETIME))aSyscall[
48f0: 33 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  30].pCurrent)..#
4900: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4910: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
4920: 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  ).  { "GetTempPa
4930: 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  thA",           
4940: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d   (SYSCALL)GetTem
4950: 70 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20  pPathA,         
4960: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4970: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22  { "GetTempPathA"
4980: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
4990: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
49b0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
49c0: 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74  ine osGetTempPat
49d0: 68 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  hA ((DWORD(WINAP
49e0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29  I*)(DWORD,LPSTR)
49f0: 29 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43  )aSyscall[31].pC
4a00: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4a10: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
4a20: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4a30: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4a40: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
4a50: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
4a60: 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50  SYSCALL)GetTempP
4a70: 61 74 68 57 2c 20 20 20 20 20 20 20 20 20 20 20  athW,           
4a80: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4a90: 22 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20  "GetTempPathW", 
4aa0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4ab0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4ad0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4ae0: 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57  e osGetTempPathW
4af0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
4b00: 29 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29  )(DWORD,LPWSTR))
4b10: 61 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75  aSyscall[32].pCu
4b20: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4b30: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
4b40: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c   "GetTickCount",
4b50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4b60: 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e  CALL)GetTickCoun
4b70: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  t,            0 
4b80: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
4b90: 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20  tTickCount",    
4ba0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4bb0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4bc0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4bd0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4be0: 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28  sGetTickCount ((
4bf0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56  DWORD(WINAPI*)(V
4c00: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33  OID))aSyscall[33
4c10: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4c20: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4c30: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
4c40: 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45    { "GetVersionE
4c50: 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  xA",           (
4c60: 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69  SYSCALL)GetVersi
4c70: 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20 20  onExA,          
4c80: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4c90: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c  "GetVersionExA",
4ca0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4cb0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4cd0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4ce0: 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78  e osGetVersionEx
4cf0: 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  A ((BOOL(WINAPI*
4d00: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  )( \.        LPO
4d10: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61  SVERSIONINFOA))a
4d20: 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72  Syscall[34].pCur
4d30: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
4d40: 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20  Alloc",         
4d50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
4d60: 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20  eapAlloc,       
4d70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
4d80: 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f  efine osHeapAllo
4d90: 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  c ((LPVOID(WINAP
4da0: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
4db0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
4dc0: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d  _T))aSyscall[35]
4dd0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4de0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
4df0: 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74 65  .  { "HeapCreate
4e00: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4e10: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65  (SYSCALL)HeapCre
4e20: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
4e30: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4e40: 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20   "HeapCreate",  
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4e60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4e80: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4e90: 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65 20  ne osHeapCreate 
4ea0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
4eb0: 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20  )(DWORD,SIZE_T, 
4ec0: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
4ed0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70  ))aSyscall[36].p
4ee0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
4ef0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
4f00: 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79 22   { "HeapDestroy"
4f10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4f20: 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74 72  YSCALL)HeapDestr
4f30: 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oy,             
4f40: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4f50: 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20  HeapDestroy",   
4f60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4f70: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4f80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4f90: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4fa0: 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20 28   osHeapDestroy (
4fb0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
4fc0: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
4fd0: 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  37].pCurrent).. 
4fe0: 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20 20   { "HeapFree",  
4ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
5000: 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c  YSCALL)HeapFree,
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
5030: 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28  HeapFree ((BOOL(
5040: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5050: 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53  DWORD,LPVOID))aS
5060: 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72  yscall[38].pCurr
5070: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52  ent)..  { "HeapR
5080: 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20  eAlloc",        
5090: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
50a0: 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20  apReAlloc,      
50b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
50c0: 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c  fine osHeapReAll
50d0: 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  oc ((LPVOID(WINA
50e0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
50f0: 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20  D,LPVOID, \.    
5100: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
5110: 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e  call[39].pCurren
5120: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a  t)..  { "HeapSiz
5130: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5140: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5150: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
5160: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5170: 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28  ne osHeapSize ((
5180: 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28  SIZE_T(WINAPI*)(
5190: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
51a0: 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29          LPCVOID)
51b0: 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43  )aSyscall[40].pC
51c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
51d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
51e0: 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65 22  { "HeapValidate"
51f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5200: 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61  SCALL)HeapValida
5210: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  te,            0
5220: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
5230: 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20  eapValidate",   
5240: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5250: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5260: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5270: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5280: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20 28  osHeapValidate (
5290: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
52a0: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20  ANDLE,DWORD, \. 
52b0: 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29         LPCVOID))
52c0: 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75  aSyscall[41].pCu
52d0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
52e0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
52f0: 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64  _HAS_ANSI) && !d
5300: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5310: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
5320: 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  N).  { "LoadLibr
5330: 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20  aryA",          
5340: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c    (SYSCALL)LoadL
5350: 69 62 72 61 72 79 41 2c 20 20 20 20 20 20 20 20  ibraryA,        
5360: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5370: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41   { "LoadLibraryA
5380: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5390: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
53c0: 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61  fine osLoadLibra
53d0: 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49  ryA ((HMODULE(WI
53e0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
53f0: 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72  Syscall[42].pCur
5400: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5410: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
5420: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5430: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26  N32_HAS_WIDE) &&
5440: 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69   \.        !defi
5450: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5460: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
5470: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
5480: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
5490: 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72  SYSCALL)LoadLibr
54a0: 61 72 79 57 2c 20 20 20 20 20 20 20 20 20 20 20  aryW,           
54b0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
54c0: 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20  "LoadLibraryW", 
54d0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
54e0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5500: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5510: 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  e osLoadLibraryW
5520: 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50   ((HMODULE(WINAP
5530: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
5540: 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65  scall[43].pCurre
5550: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5560: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c  _OS_WINRT.  { "L
5570: 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20  ocalFree",      
5580: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5590: 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20  L)LocalFree,    
55a0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
55b0: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61 6c  #else.  { "Local
55c0: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
55d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5600: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
5610: 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c  calFree ((HLOCAL
5620: 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c  (WINAPI*)(HLOCAL
5630: 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70  ))aSyscall[44].p
5640: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5650: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
5660: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
5670: 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  RT.  { "LockFile
5680: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5690: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46    (SYSCALL)LockF
56a0: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
56b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
56c0: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
56e0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0 },.#endif..#if
5710: 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a  ndef osLockFile.
5720: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69  #define osLockFi
5730: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
5740: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
5750: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
5760: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
5770: 79 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72  yscall[45].pCurr
5780: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
5790: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
57a0: 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45  E.  { "LockFileE
57b0: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  x",             
57c0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69   (SYSCALL)LockFi
57d0: 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20  leEx,           
57e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
57f0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  { "LockFileEx", 
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5810: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5830: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
5840: 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78  def osLockFileEx
5850: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46  .#define osLockF
5860: 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  ileEx ((BOOL(WIN
5870: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
5880: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  RD,DWORD,DWORD,D
5890: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
58a0: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
58b0: 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72  yscall[46].pCurr
58c0: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
58d0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
58e0: 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f   || (!SQLITE_OS_
58f0: 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
5900: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
5910: 4c 29 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77  L)).  { "MapView
5920: 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  OfFile",        
5930: 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56     (SYSCALL)MapV
5940: 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20  iewOfFile,      
5950: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5960: 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69    { "MapViewOfFi
5970: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  le",           (
5980: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59a0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
59b0: 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f  efine osMapViewO
59c0: 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28 57  fFile ((LPVOID(W
59d0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
59e0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
59f0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
5a00: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d  _T))aSyscall[47]
5a10: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5a20: 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  "MultiByteToWide
5a30: 43 68 61 72 22 2c 20 20 20 20 20 28 53 59 53 43  Char",     (SYSC
5a40: 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f 57  ALL)MultiByteToW
5a50: 69 64 65 43 68 61 72 2c 20 20 20 20 20 30 20 7d  ideChar,     0 }
5a60: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c  ,..#define osMul
5a70: 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72  tiByteToWideChar
5a80: 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28   ((int(WINAPI*)(
5a90: 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54  UINT,DWORD,LPCST
5aa0: 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a  R,int,LPWSTR, \.
5ab0: 20 20 20 20 20 20 20 20 69 6e 74 29 29 61 53 79          int))aSy
5ac0: 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65  scall[48].pCurre
5ad0: 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79 50  nt)..  { "QueryP
5ae0: 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
5af0: 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 65  r", (SYSCALL)Que
5b00: 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
5b10: 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66  nter, 0 },..#def
5b20: 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66 6f  ine osQueryPerfo
5b30: 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 28  rmanceCounter ((
5b40: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c  BOOL(WINAPI*)( \
5b50: 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f 49  .        LARGE_I
5b60: 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63 61 6c  NTEGER*))aSyscal
5b70: 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[49].pCurrent).
5b80: 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22 2c  .  { "ReadFile",
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69 6c  (SYSCALL)ReadFil
5bb0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
5bc0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5bd0: 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f 4f  osReadFile ((BOO
5be0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
5bf0: 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c  E,LPVOID,DWORD,L
5c00: 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  PDWORD, \.      
5c10: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
5c20: 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75  aSyscall[50].pCu
5c30: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74  rrent)..  { "Set
5c40: 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  EndOfFile",     
5c50: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5c60: 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20  SetEndOfFile,   
5c70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
5c80: 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f  define osSetEndO
5c90: 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  fFile ((BOOL(WIN
5ca0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
5cb0: 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72  yscall[51].pCurr
5cc0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5cd0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
5ce0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c  SetFilePointer",
5cf0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5d00: 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  LL)SetFilePointe
5d10: 72 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  r,          0 },
5d20: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46  .#else.  { "SetF
5d30: 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20  ilePointer",    
5d40: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5d50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5d60: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5d70: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53  dif..#define osS
5d80: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 28  etFilePointer ((
5d90: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48  DWORD(WINAPI*)(H
5da0: 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47  ANDLE,LONG,PLONG
5db0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
5dc0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e  D))aSyscall[52].
5dd0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5de0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
5df0: 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20    { "Sleep",    
5e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5e10: 53 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20  SYSCALL)Sleep,  
5e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e30: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5e40: 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20  "Sleep",        
5e50: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5e60: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5e80: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5e90: 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f 49 44  e osSleep ((VOID
5ea0: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 29  (WINAPI*)(DWORD)
5eb0: 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43  )aSyscall[53].pC
5ec0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79  urrent)..  { "Sy
5ed0: 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69  stemTimeToFileTi
5ee0: 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  me",    (SYSCALL
5ef0: 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c  )SystemTimeToFil
5f00: 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a  eTime,    0 },..
5f10: 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74 65 6d  #define osSystem
5f20: 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20 28  TimeToFileTime (
5f30: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43  (BOOL(WINAPI*)(C
5f40: 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d 45 2a  ONST SYSTEMTIME*
5f50: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49  , \.        LPFI
5f60: 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c  LETIME))aSyscall
5f70: 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [54].pCurrent)..
5f80: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5f90: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
5fa0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55 6e  OS_WINRT.  { "Un
5fb0: 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  lockFile",      
5fc0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5fd0: 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20  )UnlockFile,    
5fe0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5ff0: 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b  else.  { "Unlock
6000: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
6010: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6030: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6040: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e 6c  f..#ifndef osUnl
6050: 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20  ockFile.#define 
6060: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42  osUnlockFile ((B
6070: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6080: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
6090: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
60a0: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
60b0: 5b 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  [55].pCurrent).#
60c0: 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49  endif..#if !SQLI
60d0: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20  TE_OS_WINCE.  { 
60e0: 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  "UnlockFileEx", 
60f0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6100: 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  ALL)UnlockFileEx
6110: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
6120: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c  ,.#else.  { "Unl
6130: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
6140: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6150: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6160: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6170: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6180: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42  UnlockFileEx ((B
6190: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
61a0: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
61b0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
61c0: 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61   LPOVERLAPPED))a
61d0: 53 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72  Syscall[56].pCur
61e0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
61f0: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21 64  E_OS_WINCE || !d
6200: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6210: 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 55 6e 6d  IT_WAL).  { "Unm
6220: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
6230: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6240: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  UnmapViewOfFile,
6250: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6260: 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69  lse.  { "UnmapVi
6270: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
6280: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
62b0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61  ..#define osUnma
62c0: 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f  pViewOfFile ((BO
62d0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56  OL(WINAPI*)(LPCV
62e0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37  OID))aSyscall[57
62f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6300: 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74   "WideCharToMult
6310: 69 42 79 74 65 22 2c 20 20 20 20 20 28 53 59 53  iByte",     (SYS
6320: 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d  CALL)WideCharToM
6330: 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30 20  ultiByte,     0 
6340: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69  },..#define osWi
6350: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
6360: 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  e ((int(WINAPI*)
6370: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57  (UINT,DWORD,LPCW
6380: 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e  STR,int,LPSTR,in
6390: 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  t, \.        LPC
63a0: 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73  STR,LPBOOL))aSys
63b0: 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e  call[58].pCurren
63c0: 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69  t)..  { "WriteFi
63d0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
63e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74     (SYSCALL)Writ
63f0: 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  eFile,          
6400: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6410: 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28  ne osWriteFile (
6420: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6430: 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57  ANDLE,LPCVOID,DW
6440: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
6450: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
6460: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39  PED))aSyscall[59
6470: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6480: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
6490: 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e  .  { "CreateEven
64a0: 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  tExW",          
64b0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 45  (SYSCALL)CreateE
64c0: 76 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20 20  ventExW,        
64d0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
64e0: 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57   "CreateEventExW
64f0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
6500: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6520: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6530: 6e 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74  ne osCreateEvent
6540: 45 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ExW ((HANDLE(WIN
6550: 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59  API*)(LPSECURITY
6560: 5f 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43 57  _ATTRIBUTES,LPCW
6570: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
6580: 57 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79 73  WORD,DWORD))aSys
6590: 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e  call[60].pCurren
65a0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
65b0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61  OS_WINRT.  { "Wa
65c0: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
65d0: 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  t",     (SYSCALL
65e0: 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  )WaitForSingleOb
65f0: 6a 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a 23  ject,     0 },.#
6600: 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f  else.  { "WaitFo
6610: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20  rSingleObject", 
6620: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6640: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6650: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69  f..#define osWai
6660: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
6670: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
6680: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
6690: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
66a0: 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74  all[61].pCurrent
66b0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
66c0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 74  _WINRT.  { "Wait
66d0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
66e0: 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 57  x",   (SYSCALL)W
66f0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
6700: 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65 6c  ctEx,   0 },.#el
6710: 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53  se.  { "WaitForS
6720: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20  ingleObjectEx", 
6730: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6750: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6760: 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46  .#define osWaitF
6770: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
6780: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
6790: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
67a0: 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29 29  \.        BOOL))
67b0: 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75  aSyscall[62].pCu
67c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
67d0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
67e0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  "SetFilePointerE
67f0: 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  x",        (SYSC
6800: 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74  ALL)SetFilePoint
6810: 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20 7d  erEx,        0 }
6820: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74  ,.#else.  { "Set
6830: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20  FilePointerEx", 
6840: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6850: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6860: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6870: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6880: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
6890: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
68a0: 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e  (HANDLE,LARGE_IN
68b0: 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20 20  TEGER, \.       
68c0: 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c   PLARGE_INTEGER,
68d0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
68e0: 36 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  63].pCurrent)..#
68f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
6900: 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49  RT.  { "GetFileI
6910: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
6920: 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29  leEx", (SYSCALL)
6930: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
6940: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30 20  onByHandleEx, 0 
6950: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
6960: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
6970: 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59  ByHandleEx", (SY
6980: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6990: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
69a0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
69b0: 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  sGetFileInformat
69c0: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28 28  ionByHandleEx ((
69d0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
69e0: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
69f0: 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e  FILE_INFO_BY_HAN
6a00: 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44  DLE_CLASS,LPVOID
6a10: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
6a20: 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [64].pCurrent)..
6a30: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
6a40: 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
6a50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
6a60: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46  .  { "MapViewOfF
6a70: 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20  ileFromApp",    
6a80: 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77  (SYSCALL)MapView
6a90: 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 2c 20 20  OfFileFromApp,  
6aa0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6ab0: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46   "MapViewOfFileF
6ac0: 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53  romApp",    (SYS
6ad0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6af0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6b00: 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69  ne osMapViewOfFi
6b10: 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c 50 56 4f  leFromApp ((LPVO
6b20: 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  ID(WINAPI*)(HAND
6b30: 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34  LE,ULONG,ULONG64
6b40: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
6b50: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d  _T))aSyscall[65]
6b60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6b70: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6b80: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32    { "CreateFile2
6b90: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
6ba0: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
6bb0: 6c 65 32 2c 20 20 20 20 20 20 20 20 20 20 20 20  le2,            
6bc0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6bd0: 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20  "CreateFile2",  
6be0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6bf0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6c10: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6c20: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32 20  e osCreateFile2 
6c30: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
6c40: 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c  )(LPCWSTR,DWORD,
6c50: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
6c60: 20 20 20 20 20 20 20 4c 50 43 52 45 41 54 45 46         LPCREATEF
6c70: 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41  ILE2_EXTENDED_PA
6c80: 52 41 4d 45 54 45 52 53 29 29 61 53 79 73 63 61  RAMETERS))aSysca
6c90: 6c 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[66].pCurrent)
6ca0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
6cb0: 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
6cc0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
6cd0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
6ce0: 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c  { "LoadPackagedL
6cf0: 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 59  ibrary",     (SY
6d00: 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 67  SCALL)LoadPackag
6d10: 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20 20 30  edLibrary,     0
6d20: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
6d30: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
6d40: 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ry",     (SYSCAL
6d50: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6d60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6d70: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6d80: 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69  osLoadPackagedLi
6d90: 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c 45 28  brary ((HMODULE(
6da0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
6db0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
6dc0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e  D))aSyscall[67].
6dd0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
6de0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6df0: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
6e00: 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  64",          (S
6e10: 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f  YSCALL)GetTickCo
6e20: 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20 20 20  unt64,          
6e30: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6e40: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c  GetTickCount64",
6e50: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6e60: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6e80: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6e90: 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36   osGetTickCount6
6ea0: 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49  4 ((ULONGLONG(WI
6eb0: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
6ec0: 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65  scall[68].pCurre
6ed0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
6ee0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65  OS_WINRT.  { "Ge
6ef0: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
6f00: 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  o",     (SYSCALL
6f10: 29 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  )GetNativeSystem
6f20: 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a 23  Info,     0 },.#
6f30: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e 61 74  else.  { "GetNat
6f40: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  iveSystemInfo", 
6f50: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f70: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
6f80: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
6f90: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
6fa0: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
6fb0: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59  ( \.        LPSY
6fc0: 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63  STEM_INFO))aSysc
6fd0: 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74  all[69].pCurrent
6fe0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
6ff0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
7000: 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74 70 75  ANSI).  { "Outpu
7010: 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20  tDebugStringA", 
7020: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75       (SYSCALL)Ou
7030: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
7040: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
7050: 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  e.  { "OutputDeb
7060: 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20  ugStringA",     
7070: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
70a0: 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74  #define osOutput
70b0: 44 65 62 75 67 53 74 72 69 6e 67 41 20 28 28 56  DebugStringA ((V
70c0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OID(WINAPI*)(LPC
70d0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 30  STR))aSyscall[70
70e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
70f0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
7100: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
7110: 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67    { "OutputDebug
7120: 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28  StringW",      (
7130: 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65  SYSCALL)OutputDe
7140: 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20 20 20  bugStringW,     
7150: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7160: 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  "OutputDebugStri
7170: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
7180: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
71a0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
71b0: 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53  e osOutputDebugS
71c0: 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28 57 49  tringW ((VOID(WI
71d0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
71e0: 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75  aSyscall[71].pCu
71f0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
7200: 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20 20 20  ProcessHeap",   
7210: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7220: 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 2c 20  GetProcessHeap, 
7230: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
7240: 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63  define osGetProc
7250: 65 73 73 48 65 61 70 20 28 28 48 41 4e 44 4c 45  essHeap ((HANDLE
7260: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
7270: 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75  aSyscall[72].pCu
7280: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7290: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
72a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
72b0: 4d 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43 72  MIT_WAL).  { "Cr
72c0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
72d0: 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c  romApp", (SYSCAL
72e0: 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  L)CreateFileMapp
72f0: 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c  ingFromApp, 0 },
7300: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
7310: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
7320: 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29  mApp", (SYSCALL)
7330: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7340: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
7350: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
7360: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
7370: 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c 45  FromApp ((HANDLE
7380: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7390: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
73a0: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
73b0: 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c  S,ULONG,ULONG64,
73c0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
73d0: 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[73].pCurrent).
73e0: 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68  .}; /* End of th
73f0: 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  e overrideable s
7400: 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a  ystem calls */..
7410: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
7420: 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  e xSetSystemCall
7430: 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c  () method of sql
7440: 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c  ite3_vfs for all
7450: 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33   of the.** "win3
7460: 32 22 20 56 46 53 65 73 2e 20 20 52 65 74 75 72  2" VFSes.  Retur
7470: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e  n SQLITE_OK opon
7480: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70   successfully up
7490: 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79  dating the.** sy
74a0: 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65  stem call pointe
74b0: 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54  r, or SQLITE_NOT
74c0: 46 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20 69  FOUND if there i
74d0: 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c  s no configurabl
74e0: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
74f0: 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f   named zName..*/
7500: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
7510: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
7520: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
7530: 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a  tUsed,        /*
7540: 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72   The VFS pointer
7550: 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  .  Not used */. 
7560: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
7570: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  me,            /
7580: 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d  * Name of system
7590: 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64   call to overrid
75a0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
75b0: 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46  yscall_ptr pNewF
75c0: 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  unc  /* Pointer 
75d0: 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61  to new system ca
75e0: 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20  ll value */.){. 
75f0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
7600: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
7610: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20  TE_NOTFOUND;..  
7620: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
7630: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  (pNotUsed);.  if
7640: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
7650: 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65    /* If no zName
7660: 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f   is given, resto
7670: 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61  re all system ca
7680: 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66  lls to their def
7690: 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74  ault.    ** sett
76a0: 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ings and return 
76b0: 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20  NULL.    */.    
76c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
76d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
76e0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
76f0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
7700: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
7710: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
7720: 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  .pDefault ){.   
7730: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
7740: 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73  .pCurrent = aSys
7750: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
7760: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7770: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
7780: 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63  If zName is spec
7790: 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f  ified, operate o
77a0: 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73  n only the one s
77b0: 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a  ystem call.    *
77c0: 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20  * specified..   
77d0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
77e0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
77f0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
7800: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
7810: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
7820: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
7830: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
7840: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73          if( aSys
7850: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
7860: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7870: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
7880: 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c  fault = aSyscall
7890: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
78a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
78b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
78c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
78d0: 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75  Func==0 ) pNewFu
78e0: 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nc = aSyscall[i]
78f0: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
7900: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
7910: 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75  Current = pNewFu
7920: 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  nc;.        brea
7930: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
7940: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
7950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7960: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  n the value of a
7970: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
7980: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
7990: 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ame is not a.** 
79a0: 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65  recognized syste
79b0: 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55  m call name.  NU
79c0: 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  LL is also retur
79d0: 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65  ned if the syste
79e0: 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72  m call.** is cur
79f0: 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64  rently undefined
7a00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
7a10: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
7a20: 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
7a30: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
7a40: 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e  *pNotUsed,.  con
7a50: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
7a60: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
7a70: 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
7a80: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
7a90: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
7aa0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
7ab0: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
7ac0: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
7ad0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
7ae0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
7af0: 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
7b00: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
7b10: 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrent;.  }.  ret
7b20: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7b30: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
7b40: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
7b50: 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a  tem call after z
7b60: 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d  Name.  If zName=
7b70: 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65  =NULL.** then re
7b80: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
7b90: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
7ba0: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
7bb0: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a  NULL if zName.**
7bc0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73   is the last sys
7bd0: 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a  tem call or if z
7be0: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Name is not the 
7bf0: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a  name of a valid.
7c00: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  ** system call..
7c10: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
7c20: 63 68 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73  char *winNextSys
7c30: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
7c40: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
7c50: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
7c60: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
7c70: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
7c80: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
7c90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
7ca0: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
7cb0: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
7cc0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
7cd0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
7ce0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
7cf0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
7d00: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
7d10: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
7d20: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
7d30: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
7d40: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
7d50: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
7d60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
7d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
7d80: 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73  function outputs
7d90: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 28   the specified (
7da0: 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20  ANSI) string to 
7db0: 74 68 65 20 57 69 6e 33 32 20 64 65 62 75 67 67  the Win32 debugg
7dc0: 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61  er.** (if availa
7dd0: 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73  ble)..*/..void s
7de0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69  qlite3_win32_wri
7df0: 74 65 5f 64 65 62 75 67 28 63 68 61 72 20 2a 7a  te_debug(char *z
7e00: 42 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a  Buf, int nBuf){.
7e10: 20 20 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53    char zDbgBuf[S
7e20: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
7e30: 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  BUF_SIZE];.  int
7e40: 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66   nMin = MIN(nBuf
7e50: 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  , (SQLITE_WIN32_
7e60: 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31  DBG_BUF_SIZE - 1
7e70: 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65  )); /* may be ne
7e80: 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28  gative. */.  if(
7e90: 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20   nMin<-1 ) nMin 
7ea0: 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67  = -1; /* all neg
7eb0: 61 74 69 76 65 20 76 61 6c 75 65 73 20 62 65 63  ative values bec
7ec0: 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73  ome -1. */.  ass
7ed0: 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c  ert( nMin==-1 ||
7ee0: 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e   nMin==0 || nMin
7ef0: 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42  <SQLITE_WIN32_DB
7f00: 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69  G_BUF_SIZE );.#i
7f10: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
7f20: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
7f30: 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b  .  if( nMin>0 ){
7f40: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67  .    memset(zDbg
7f50: 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57  Buf, 0, SQLITE_W
7f60: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
7f70: 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  E);.    memcpy(z
7f80: 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d  DbgBuf, zBuf, nM
7f90: 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75  in);.    osOutpu
7fa0: 74 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 44  tDebugStringA(zD
7fb0: 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  bgBuf);.  }else{
7fc0: 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62  .    osOutputDeb
7fd0: 75 67 53 74 72 69 6e 67 41 28 7a 42 75 66 29 3b  ugStringA(zBuf);
7fe0: 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e  .  }.#elif defin
7ff0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
8000: 48 41 53 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73  HAS_WIDE).  mems
8010: 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53  et(zDbgBuf, 0, S
8020: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
8030: 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20  BUF_SIZE);.  if 
8040: 28 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  ( osMultiByteToW
8050: 69 64 65 43 68 61 72 28 0a 20 20 20 20 20 20 20  ideChar(.       
8060: 20 20 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73     osAreFileApis
8070: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
8080: 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a  : CP_OEMCP, 0, z
8090: 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  Buf,.          n
80a0: 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a 44 62  Min, (LPWSTR)zDb
80b0: 67 42 75 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e  gBuf, SQLITE_WIN
80c0: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f  32_DBG_BUF_SIZE/
80d0: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3c 3d  sizeof(WCHAR))<=
80e0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
80f0: 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44  .  }.  osOutputD
8100: 65 62 75 67 53 74 72 69 6e 67 57 28 28 4c 50 43  ebugStringW((LPC
8110: 57 53 54 52 29 7a 44 62 67 42 75 66 29 3b 0a 23  WSTR)zDbgBuf);.#
8120: 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e  else.  if( nMin>
8130: 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
8140: 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49  zDbgBuf, 0, SQLI
8150: 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46  TE_WIN32_DBG_BUF
8160: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63  _SIZE);.    memc
8170: 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66  py(zDbgBuf, zBuf
8180: 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72  , nMin);.    fpr
8190: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
81a0: 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d  ", zDbgBuf);.  }
81b0: 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74  else{.    fprint
81c0: 66 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20  f(stderr, "%s", 
81d0: 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  zBuf);.  }.#endi
81e0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  f.}../*.** The f
81f0: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
8200: 20 73 75 73 70 65 6e 64 73 20 74 68 65 20 63 75   suspends the cu
8210: 72 72 65 6e 74 20 74 68 72 65 61 64 20 66 6f 72  rrent thread for
8220: 20 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20   at least ms.** 
8230: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54  milliseconds.  T
8240: 68 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e  his is equivalen
8250: 74 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 53  t to the Win32 S
8260: 6c 65 65 70 28 29 20 69 6e 74 65 72 66 61 63 65  leep() interface
8270: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
8280: 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20  OS_WINRT.static 
8290: 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20  HANDLE sleepObj 
82a0: 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a  = NULL;.#endif..
82b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e  void sqlite3_win
82c0: 33 32 5f 73 6c 65 65 70 28 44 57 4f 52 44 20 6d  32_sleep(DWORD m
82d0: 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69  illiseconds){.#i
82e0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
82f0: 54 0a 20 20 69 66 20 28 20 73 6c 65 65 70 4f 62  T.  if ( sleepOb
8300: 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73  j==NULL ){.    s
8310: 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61  leepObj = osCrea
8320: 74 65 45 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c  teEventExW(NULL,
8330: 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56   NULL, CREATE_EV
8340: 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54  ENT_MANUAL_RESET
8350: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8370: 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a    SYNCHRONIZE);.
8380: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 6c    }.  assert( sl
8390: 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a  eepObj!=NULL );.
83a0: 20 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c    osWaitForSingl
83b0: 65 4f 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f  eObjectEx(sleepO
83c0: 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  bj, milliseconds
83d0: 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a  , FALSE);.#else.
83e0: 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73    osSleep(millis
83f0: 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a  econds);.#endif.
8400: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8410: 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20  true (non-zero) 
8420: 69 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e  if we are runnin
8430: 67 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57  g under WinNT, W
8440: 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20  in2K, WinXP,.** 
8450: 6f 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75 72  or WinCE.  Retur
8460: 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66  n false (zero) f
8470: 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c  or Win95, Win98,
8480: 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a   or WinME..**.**
8490: 20 48 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65   Here is an inte
84a0: 72 65 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74  resting observat
84b0: 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e  ion:  Win95, Win
84c0: 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61  98, and WinME la
84d0: 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69  ck.** the LockFi
84e0: 6c 65 45 78 28 29 20 41 50 49 2e 20 20 42 75 74  leEx() API.  But
84f0: 20 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74   we can still st
8500: 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67  atically link ag
8510: 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50  ainst that.** AP
8520: 49 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20  I as long as we 
8530: 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 68  don't call it wh
8540: 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35  en running Win95
8550: 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20  /98/ME.  A call 
8560: 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  to.** this routi
8570: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  ne is used to de
8580: 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 68  termine if the h
8590: 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38 2f  ost is Win95/98/
85a0: 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32  ME or.** WinNT/2
85b0: 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65 20  K/XP so that we 
85c0: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65  will know whethe
85d0: 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e 20  r or not we can 
85e0: 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74  safely call.** t
85f0: 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20  he LockFileEx() 
8600: 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  API..*/.#if SQLI
8610: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
8620: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23  QLITE_OS_WINRT.#
8630: 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29 20 20   define isNT()  
8640: 28 31 29 0a 23 65 6c 69 66 20 21 64 65 66 69 6e  (1).#elif !defin
8650: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
8660: 48 41 53 5f 57 49 44 45 29 0a 23 20 64 65 66 69  HAS_WIDE).# defi
8670: 6e 65 20 69 73 4e 54 28 29 20 20 28 30 29 0a 23  ne isNT()  (0).#
8680: 65 6c 73 65 0a 20 20 73 74 61 74 69 63 20 69 6e  else.  static in
8690: 74 20 69 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20  t isNT(void){.  
86a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6f 73    if( sqlite3_os
86b0: 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _type==0 ){.    
86c0: 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41    OSVERSIONINFOA
86d0: 20 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 73 49   sInfo;.      sI
86e0: 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49  nfo.dwOSVersionI
86f0: 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66  nfoSize = sizeof
8700: 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 6f  (sInfo);.      o
8710: 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 28 26  sGetVersionExA(&
8720: 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 73 71  sInfo);.      sq
8730: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20  lite3_os_type = 
8740: 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d  sInfo.dwPlatform
8750: 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d  Id==VER_PLATFORM
8760: 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20  _WIN32_NT ? 2 : 
8770: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  1;.    }.    ret
8780: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74  urn sqlite3_os_t
8790: 79 70 65 3d 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64  ype==2;.  }.#end
87a0: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
87b0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f  E_WIN32_MALLOC./
87c0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
87d0: 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a  ytes of memory..
87e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
87f0: 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74  winMemMalloc(int
8800: 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44   nBytes){.  HAND
8810: 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64  LE hHeap;.  void
8820: 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73   *p;..  winMemAs
8830: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
8840: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
8850: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
8860: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
8870: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
8880: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
8890: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
88a0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
88b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
88c0: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
88d0: 41 54 45 29 0a 20 20 61 73 73 65 72 74 20 28 20  ATE).  assert ( 
88e0: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
88f0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
8900: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
8910: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
8920: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e   assert( nBytes>
8930: 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65  =0 );.  p = osHe
8940: 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53  apAlloc(hHeap, S
8950: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
8960: 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29  _FLAGS, (SIZE_T)
8970: 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 21  nBytes);.  if( !
8980: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
8990: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
89a0: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
89b0: 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65 73  apAlloc %u bytes
89c0: 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c   (%d), heap=%p",
89d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
89e0: 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61   nBytes, osGetLa
89f0: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
8a00: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20  *)hHeap);.  }.  
8a10: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
8a20: 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a  ** Free memory..
8a30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
8a40: 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a  inMemFree(void *
8a50: 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44 4c  pPrior){.  HANDL
8a60: 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d  E hHeap;..  winM
8a70: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
8a80: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
8a90: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
8aa0: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
8ab0: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
8ac0: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
8ad0: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
8ae0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
8af0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
8b00: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
8b10: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
8b20: 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  t ( osHeapValida
8b30: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
8b40: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
8b50: 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65  S, pPrior) );.#e
8b60: 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 72 69  ndif.  if( !pPri
8b70: 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  or ) return; /* 
8b80: 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20  Passing NULL to 
8b90: 48 65 61 70 46 72 65 65 20 69 73 20 75 6e 64 65  HeapFree is unde
8ba0: 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  fined. */.  if( 
8bb0: 21 6f 73 48 65 61 70 46 72 65 65 28 68 48 65 61  !osHeapFree(hHea
8bc0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
8bd0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
8be0: 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  or) ){.    sqlit
8bf0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
8c00: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
8c10: 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25  HeapFree block %
8c20: 70 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22  p (%d), heap=%p"
8c30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8c40: 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c    pPrior, osGetL
8c50: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
8c60: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d  d*)hHeap);.  }.}
8c70: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
8c80: 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78  he size of an ex
8c90: 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c  isting memory al
8ca0: 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
8cb0: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52  ic void *winMemR
8cc0: 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72  ealloc(void *pPr
8cd0: 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29  ior, int nBytes)
8ce0: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
8cf0: 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20  ;.  void *p;..  
8d00: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
8d10: 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77  c();.  hHeap = w
8d20: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a  inMemGetHeap();.
8d30: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
8d40: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8d50: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
8d60: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
8d70: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
8d80: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
8d90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
8da0: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
8db0: 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56 61  ssert ( osHeapVa
8dc0: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
8dd0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
8de0: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
8df0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
8e00: 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a  t( nBytes>=0 );.
8e10: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b    if( !pPrior ){
8e20: 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41  .    p = osHeapA
8e30: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
8e40: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
8e50: 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  AGS, (SIZE_T)nBy
8e60: 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tes);.  }else{. 
8e70: 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41     p = osHeapReA
8e80: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
8e90: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
8ea0: 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49  AGS, pPrior, (SI
8eb0: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
8ec0: 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  }.  if( !p ){.  
8ed0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
8ee0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
8ef0: 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74  led to %s %u byt
8f00: 65 73 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70  es (%d), heap=%p
8f10: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
8f20: 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61     pPrior ? "Hea
8f30: 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61  pReAlloc" : "Hea
8f40: 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c  pAlloc", nBytes,
8f50: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
8f60: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
8f70: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
8f80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
8f90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8fa0: 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e  n the size of an
8fb0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c   outstanding all
8fc0: 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65  ocation, in byte
8fd0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
8fe0: 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64   winMemSize(void
8ff0: 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68   *p){.  HANDLE h
9000: 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e  Heap;.  SIZE_T n
9010: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
9020: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
9030: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
9040: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
9050: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
9060: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
9070: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
9080: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
9090: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
90a0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
90b0: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
90c0: 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48  ).  assert ( osH
90d0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
90e0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
90f0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
9100: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ) );.#endif.  if
9110: 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ( !p ) return 0;
9120: 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a  .  n = osHeapSiz
9130: 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  e(hHeap, SQLITE_
9140: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
9150: 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28  , p);.  if( n==(
9160: 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20  SIZE_T)-1 ){.   
9170: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
9180: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
9190: 65 64 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62  ed to HeapSize b
91a0: 6c 6f 63 6b 20 25 70 20 28 25 64 29 2c 20 68 65  lock %p (%d), he
91b0: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
91c0: 20 20 20 20 20 20 20 20 70 2c 20 6f 73 47 65 74          p, osGet
91d0: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
91e0: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20  id*)hHeap);.    
91f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
9200: 72 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d  return (int)n;.}
9210: 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70  ../*.** Round up
9220: 20 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 20   a request size 
9230: 74 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69  to the next vali
9240: 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a  d allocation siz
9250: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
9260: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69   winMemRoundup(i
9270: 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20  nt n){.  return 
9280: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  n;.}../*.** Init
9290: 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75  ialize this modu
92a0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
92b0: 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69  t winMemInit(voi
92c0: 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20  d *pAppData){.  
92d0: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e  winMemData *pWin
92e0: 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65  MemData = (winMe
92f0: 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61  mData *)pAppData
9300: 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  ;..  if( !pWinMe
9310: 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 53  mData ) return S
9320: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61  QLITE_ERROR;.  a
9330: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
9340: 74 61 2d 3e 6d 61 67 69 63 3d 3d 57 49 4e 4d 45  ta->magic==WINME
9350: 4d 5f 4d 41 47 49 43 20 29 3b 0a 0a 23 69 66 20  M_MAGIC );..#if 
9360: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
9370: 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   && SQLITE_WIN32
9380: 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20 20 69  _HEAP_CREATE.  i
9390: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  f( !pWinMemData-
93a0: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 70 57  >hHeap ){.    pW
93b0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
93c0: 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74 65 28   = osHeapCreate(
93d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
93e0: 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20  P_FLAGS,.       
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
9410: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
9420: 5f 49 4e 49 54 5f 53 49 5a 45 2c 0a 20 20 20 20  _INIT_SIZE,.    
9430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9450: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48    SQLITE_WIN32_H
9460: 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a 20  EAP_MAX_SIZE);. 
9470: 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44     if( !pWinMemD
9480: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
9490: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
94a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20  SQLITE_NOMEM,.  
94b0: 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20          "failed 
94c0: 74 6f 20 48 65 61 70 43 72 65 61 74 65 20 28 25  to HeapCreate (%
94d0: 64 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69 6e  d), flags=%u, in
94e0: 69 74 53 69 7a 65 3d 25 75 2c 20 6d 61 78 53 69  itSize=%u, maxSi
94f0: 7a 65 3d 25 75 22 2c 0a 20 20 20 20 20 20 20 20  ze=%u",.        
9500: 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
9510: 28 29 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  (), SQLITE_WIN32
9520: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20  _HEAP_FLAGS,.   
9530: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
9540: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49  N32_HEAP_INIT_SI
9550: 5a 45 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ZE, SQLITE_WIN32
9560: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 29 3b  _HEAP_MAX_SIZE);
9570: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9580: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
9590: 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74  }.    pWinMemDat
95a0: 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55 45  a->bOwned = TRUE
95b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  ;.    assert( pW
95c0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
95d0: 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  d );.  }.#else. 
95e0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
95f0: 65 61 70 20 3d 20 6f 73 47 65 74 50 72 6f 63 65  eap = osGetProce
9600: 73 73 48 65 61 70 28 29 3b 0a 20 20 69 66 28 20  ssHeap();.  if( 
9610: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
9620: 65 61 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eap ){.    sqlit
9630: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
9640: 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 22 66 61  MEM,.        "fa
9650: 69 6c 65 64 20 74 6f 20 47 65 74 50 72 6f 63 65  iled to GetProce
9660: 73 73 48 65 61 70 20 28 25 64 29 22 2c 20 6f 73  ssHeap (%d)", os
9670: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b  GetLastError());
9680: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9690: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
96a0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
96b0: 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 61  ned = FALSE;.  a
96c0: 73 73 65 72 74 28 20 21 70 57 69 6e 4d 65 6d 44  ssert( !pWinMemD
96d0: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 23  ata->bOwned );.#
96e0: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
96f0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
9700: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
9710: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
9720: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
9730: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
9740: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
9750: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
9760: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
9770: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
9780: 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c  ssert( osHeapVal
9790: 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74  idate(pWinMemDat
97a0: 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45  a->hHeap, SQLITE
97b0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
97c0: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
97d0: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
97e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
97f0: 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  Deinitialize thi
9800: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
9810: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53  tic void winMemS
9820: 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41  hutdown(void *pA
9830: 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65  ppData){.  winMe
9840: 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61  mData *pWinMemDa
9850: 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61  ta = (winMemData
9860: 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20   *)pAppData;..  
9870: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
9880: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
9890: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
98a0: 65 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  eap ){.    asser
98b0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
98c0: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
98d0: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
98e0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
98f0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
9900: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
9910: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 20  OC_VALIDATE).   
9920: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
9930: 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44  alidate(pWinMemD
9940: 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49  ata->hHeap, SQLI
9950: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
9960: 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65  AGS, NULL) );.#e
9970: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 57 69  ndif.    if( pWi
9980: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
9990: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6f   ){.      if( !o
99a0: 73 48 65 61 70 44 65 73 74 72 6f 79 28 70 57 69  sHeapDestroy(pWi
99b0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29  nMemData->hHeap)
99c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
99d0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
99e0: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
99f0: 20 48 65 61 70 44 65 73 74 72 6f 79 20 28 25 64   HeapDestroy (%d
9a00: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a20: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
9a30: 29 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65  ), (void*)pWinMe
9a40: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20  mData->hHeap);. 
9a50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69       }.      pWi
9a60: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
9a70: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
9a80: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
9a90: 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20  >hHeap = NULL;. 
9aa0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75   }.}../*.** Popu
9ab0: 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76  late the low-lev
9ac0: 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  el memory alloca
9ad0: 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f  tion function po
9ae0: 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c  inters in.** sql
9af0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
9b00: 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73  .m with pointers
9b10: 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73   to the routines
9b20: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54   in this file. T
9b30: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20  he.** arguments 
9b40: 73 70 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63  specify the bloc
9b50: 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d  k of memory to m
9b60: 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  anage..**.** Thi
9b70: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
9b80: 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
9b90: 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e  te3_config(), an
9ba0: 64 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69  d therefore.** i
9bb0: 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74  s not required t
9bc0: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 20  o be threadsafe 
9bd0: 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a  (it is not)..*/.
9be0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
9bf0: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
9c00: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
9c10: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
9c20: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
9c30: 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65  methods winMemMe
9c40: 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69  thods = {.    wi
9c50: 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20  nMemMalloc,.    
9c60: 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20  winMemFree,.    
9c70: 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20  winMemRealloc,. 
9c80: 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20     winMemSize,. 
9c90: 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70     winMemRoundup
9ca0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74  ,.    winMemInit
9cb0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74  ,.    winMemShut
9cc0: 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d  down,.    &win_m
9cd0: 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72  em_data.  };.  r
9ce0: 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74  eturn &winMemMet
9cf0: 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71  hods;.}..void sq
9d00: 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75  lite3MemSetDefau
9d10: 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  lt(void){.  sqli
9d20: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
9d30: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c  E_CONFIG_MALLOC,
9d40: 20 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69   sqlite3MemGetWi
9d50: 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  n32());.}.#endif
9d60: 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   /* SQLITE_WIN32
9d70: 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a  _MALLOC */../*.*
9d80: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
9d90: 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72  8 string to Micr
9da0: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 28 55  osoft Unicode (U
9db0: 54 46 2d 31 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20  TF-16?). .**.** 
9dc0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
9dd0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
9de0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
9df0: 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74  om malloc..*/.st
9e00: 61 74 69 63 20 4c 50 57 53 54 52 20 75 74 66 38  atic LPWSTR utf8
9e10: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
9e20: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
9e30: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20  {.  int nChar;. 
9e40: 20 4c 50 57 53 54 52 20 7a 57 69 64 65 46 69 6c   LPWSTR zWideFil
9e50: 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43 68 61 72 20  ename;..  nChar 
9e60: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
9e70: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
9e80: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
9e90: 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 69  1, NULL, 0);.  i
9ea0: 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20  f( nChar==0 ){. 
9eb0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
9ec0: 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  .  zWideFilename
9ed0: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
9ee0: 5a 65 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65  Zero( nChar*size
9ef0: 6f 66 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  of(zWideFilename
9f00: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 57  [0]) );.  if( zW
9f10: 69 64 65 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ideFilename==0 )
9f20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
9f30: 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73    }.  nChar = os
9f40: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
9f50: 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
9f60: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a  zFilename, -1, z
9f70: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  WideFilename,.  
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 43                nC
9fa0: 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61  har);.  if( nCha
9fb0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
9fc0: 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 46 69  te3_free(zWideFi
9fd0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 57 69  lename);.    zWi
9fe0: 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a  deFilename = 0;.
9ff0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69    }.  return zWi
a000: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f  deFilename;.}../
a010: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69 63  *.** Convert Mic
a020: 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 74  rosoft Unicode t
a030: 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
a040: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
a050: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 0a 2a  rned string is.*
a060: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
a070: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
a080: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
a090: 20 2a 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28   *unicodeToUtf8(
a0a0: 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46 69 6c  LPCWSTR zWideFil
a0b0: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
a0c0: 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  yte;.  char *zFi
a0d0: 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65  lename;..  nByte
a0e0: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
a0f0: 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38  ultiByte(CP_UTF8
a100: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
a110: 6d 65 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  me, -1, 0, 0, 0,
a120: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
a130: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74   == 0 ){.    ret
a140: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69  urn 0;.  }.  zFi
a150: 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  lename = sqlite3
a160: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
a170: 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  e );.  if( zFile
a180: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
a190: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
a1a0: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
a1b0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f  rToMultiByte(CP_
a1c0: 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46 69  UTF8, 0, zWideFi
a1d0: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c  lename, -1, zFil
a1e0: 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20 20  ename, nByte,.  
a1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
a210: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
a220: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c   == 0 ){.    sql
a230: 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e  ite3_free(zFilen
a240: 61 6d 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e  ame);.    zFilen
a250: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
a260: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b  eturn zFilename;
a270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
a280: 74 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67  t an ANSI string
a290: 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e   to Microsoft Un
a2a0: 69 63 6f 64 65 2c 20 62 61 73 65 64 20 6f 6e 20  icode, based on 
a2b0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 63  the.** current c
a2c0: 6f 64 65 70 61 67 65 20 73 65 74 74 69 6e 67 73  odepage settings
a2d0: 20 66 6f 72 20 66 69 6c 65 20 61 70 69 73 2e 0a   for file apis..
a2e0: 2a 2a 20 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  ** .** Space to 
a2f0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
a300: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
a310: 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c  ined.** from sql
a320: 69 74 65 33 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a  ite3_malloc..*/.
a330: 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 6d 62  static LPWSTR mb
a340: 63 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73  csToUnicode(cons
a350: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
a360: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
a370: 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 46  .  LPWSTR zMbcsF
a380: 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 63  ilename;.  int c
a390: 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65 46  odepage = osAreF
a3a0: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20  ileApisANSI() ? 
a3b0: 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43  CP_ACP : CP_OEMC
a3c0: 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  P;..  nByte = os
a3d0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
a3e0: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
a3f0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
a400: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a420: 20 20 20 20 20 20 30 29 2a 73 69 7a 65 6f 66 28        0)*sizeof(
a430: 57 43 48 41 52 29 3b 0a 20 20 69 66 28 20 6e 42  WCHAR);.  if( nB
a440: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  yte==0 ){.    re
a450: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d  turn 0;.  }.  zM
a460: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71  bcsFilename = sq
a470: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
a480: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 4d   nByte*sizeof(zM
a490: 62 63 73 46 69 6c 65 6e 61 6d 65 5b 30 5d 29 20  bcsFilename[0]) 
a4a0: 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73 46 69  );.  if( zMbcsFi
a4b0: 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  lename==0 ){.   
a4c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a4d0: 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69   nByte = osMulti
a4e0: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63  ByteToWideChar(c
a4f0: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c  odepage, 0, zFil
a500: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 4d 62 63 73  ename, -1, zMbcs
a510: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
a520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a530: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 29            nByte)
a540: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30  ;.  if( nByte==0
a550: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
a560: 66 72 65 65 28 7a 4d 62 63 73 46 69 6c 65 6e 61  free(zMbcsFilena
a570: 6d 65 29 3b 0a 20 20 20 20 7a 4d 62 63 73 46 69  me);.    zMbcsFi
a580: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
a590: 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 46 69    return zMbcsFi
a5a0: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
a5b0: 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f   Convert Microso
a5c0: 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 6d 75  ft Unicode to mu
a5d0: 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74  lti-byte charact
a5e0: 65 72 20 73 74 72 69 6e 67 2c 20 62 61 73 65 64  er string, based
a5f0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 75 73 65 72 27   on the.** user'
a600: 73 20 41 4e 53 49 20 63 6f 64 65 70 61 67 65 2e  s ANSI codepage.
a610: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
a620: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
a630: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
a640: 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
a650: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
a660: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75  /.static char *u
a670: 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43  nicodeToMbcs(LPC
a680: 57 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61  WSTR zWideFilena
a690: 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65  me){.  int nByte
a6a0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  ;.  char *zFilen
a6b0: 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70  ame;.  int codep
a6c0: 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41  age = osAreFileA
a6d0: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
a6e0: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a  CP : CP_OEMCP;..
a6f0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
a700: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
a710: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69  codepage, 0, zWi
a720: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
a730: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69  0, 0, 0, 0);.  i
a740: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
a750: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
a760: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d   }.  zFilename =
a770: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
a780: 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  ro( nByte );.  i
a790: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
a7a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
a7b0: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
a7c0: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
a7d0: 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30  Byte(codepage, 0
a7e0: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
a7f0: 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a   -1, zFilename,.
a800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a820: 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20  nByte, 0, 0);.  
a830: 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29  if( nByte == 0 )
a840: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
a850: 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ee(zFilename);. 
a860: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30     zFilename = 0
a870: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
a880: 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  Filename;.}../*.
a890: 2a 2a 20 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69  ** Convert multi
a8a0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
a8b0: 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20  tring to UTF-8. 
a8c0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
a8d0: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73  he.** returned s
a8e0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
a8f0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
a900: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72  alloc()..*/.char
a910: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
a920: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e  mbcs_to_utf8(con
a930: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
a940: 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  me){.  char *zFi
a950: 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 20 20 4c 50  lenameUtf8;.  LP
a960: 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a  WSTR zTmpWide;..
a970: 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 6d 62 63    zTmpWide = mbc
a980: 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  sToUnicode(zFile
a990: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d  name);.  if( zTm
a9a0: 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pWide==0 ){.    
a9b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
a9c0: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20  zFilenameUtf8 = 
a9d0: 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54  unicodeToUtf8(zT
a9e0: 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74  mpWide);.  sqlit
a9f0: 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65  e3_free(zTmpWide
aa00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c  );.  return zFil
aa10: 65 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a  enameUtf8;.}../*
aa20: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54 46 2d  .** Convert UTF-
aa30: 38 20 74 6f 20 6d 75 6c 74 69 62 79 74 65 20 63  8 to multibyte c
aa40: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e  haracter string.
aa50: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
aa60: 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64  the .** returned
aa70: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
aa80: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
aa90: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68  _malloc()..*/.ch
aaa0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33  ar *sqlite3_win3
aab0: 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 63  2_utf8_to_mbcs(c
aac0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
aad0: 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  name){.  char *z
aae0: 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 20 20  FilenameMbcs;.  
aaf0: 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b  LPWSTR zTmpWide;
ab00: 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 75  ..  zTmpWide = u
ab10: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
ab20: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
ab30: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
ab40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ab50: 20 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 20    zFilenameMbcs 
ab60: 3d 20 75 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28  = unicodeToMbcs(
ab70: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c  zTmpWide);.  sql
ab80: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69  ite3_free(zTmpWi
ab90: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46  de);.  return zF
aba0: 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a  ilenameMbcs;.}..
abb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
abc0: 69 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61 74  ion sets the dat
abd0: 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20 74  a directory or t
abe0: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
abf0: 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e 0a  ectory based on.
ac00: 2a 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64 20  ** the provided 
ac10: 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65 20  arguments.  The 
ac20: 74 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d 75  type argument mu
ac30: 73 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65 72  st be 1 in order
ac40: 20 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20 64   to set the.** d
ac50: 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72  ata directory or
ac60: 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73   2 in order to s
ac70: 65 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  et the temporary
ac80: 20 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68 65   directory.  The
ac90: 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75 6d   zValue.** argum
aca0: 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
acb0: 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
acc0: 20 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72 65   to use.  The re
acd0: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c 20  turn value will 
ace0: 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  be.** SQLITE_OK 
acf0: 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
ad00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
ad10: 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72  n32_set_director
ad20: 79 28 44 57 4f 52 44 20 74 79 70 65 2c 20 4c 50  y(DWORD type, LP
ad30: 43 57 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a 20  CWSTR zValue){. 
ad40: 20 63 68 61 72 20 2a 2a 70 70 44 69 72 65 63 74   char **ppDirect
ad50: 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  ory = 0;.#ifndef
ad60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ad70: 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72 63 20 3d  OINIT.  int rc =
ad80: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
ad90: 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
ada0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
adb0: 64 69 66 0a 20 20 69 66 28 20 74 79 70 65 3d 3d  dif.  if( type==
adc0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
add0: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
ade0: 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63 74   ){.    ppDirect
adf0: 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f 64  ory = &sqlite3_d
ae00: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  ata_directory;. 
ae10: 20 7d 65 6c 73 65 20 69 66 28 20 74 79 70 65 3d   }else if( type=
ae20: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45  =SQLITE_WIN32_TE
ae30: 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  MP_DIRECTORY_TYP
ae40: 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63  E ){.    ppDirec
ae50: 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f  tory = &sqlite3_
ae60: 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a  temp_directory;.
ae70: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
ae80: 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 74 79  pDirectory || ty
ae90: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
aea0: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
aeb0: 54 59 50 45 0a 20 20 20 20 20 20 20 20 20 20 7c  TYPE.          |
aec0: 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  | type==SQLITE_W
aed0: 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54  IN32_TEMP_DIRECT
aee0: 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20 20  ORY_TYPE.  );.  
aef0: 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65 63  assert( !ppDirec
af00: 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74 65 33 4d  tory || sqlite3M
af10: 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28 2a  emdebugHasType(*
af20: 70 70 44 69 72 65 63 74 6f 72 79 2c 20 4d 45 4d  ppDirectory, MEM
af30: 54 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20 20  TYPE_HEAP) );.  
af40: 69 66 28 20 70 70 44 69 72 65 63 74 6f 72 79 20  if( ppDirectory 
af50: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 61  ){.    char *zVa
af60: 6c 75 65 55 74 66 38 20 3d 20 30 3b 0a 20 20 20  lueUtf8 = 0;.   
af70: 20 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20 7a   if( zValue && z
af80: 56 61 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20  Value[0] ){.    
af90: 20 20 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 75    zValueUtf8 = u
afa0: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61  nicodeToUtf8(zVa
afb0: 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28  lue);.      if (
afc0: 20 7a 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29   zValueUtf8==0 )
afd0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
afe0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
aff0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b000: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70   sqlite3_free(*p
b010: 70 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  pDirectory);.   
b020: 20 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20   *ppDirectory = 
b030: 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20 20 20 20  zValueUtf8;.    
b040: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b050: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
b060: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
b070: 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  /*.** The return
b080: 20 76 61 6c 75 65 20 6f 66 20 67 65 74 4c 61 73   value of getLas
b090: 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20  tErrorMsg.** is 
b0a0: 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
b0b0: 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69  r message fits i
b0c0: 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72  n the buffer, or
b0d0: 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68   non-zero.** oth
b0e0: 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d  erwise (if the m
b0f0: 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63  essage was trunc
b100: 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ated)..*/.static
b110: 20 69 6e 74 20 67 65 74 4c 61 73 74 45 72 72 6f   int getLastErro
b120: 72 4d 73 67 28 44 57 4f 52 44 20 6c 61 73 74 45  rMsg(DWORD lastE
b130: 72 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 2c 20  rrno, int nBuf, 
b140: 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f  char *zBuf){.  /
b150: 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  * FormatMessage 
b160: 72 65 74 75 72 6e 73 20 30 20 6f 6e 20 66 61 69  returns 0 on fai
b170: 6c 75 72 65 2e 20 20 4f 74 68 65 72 77 69 73 65  lure.  Otherwise
b180: 20 69 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73   it.  ** returns
b190: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 54   the number of T
b1a0: 43 48 41 52 73 20 77 72 69 74 74 65 6e 20 74 6f  CHARs written to
b1b0: 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a   the output.  **
b1c0: 20 62 75 66 66 65 72 2c 20 65 78 63 6c 75 64 69   buffer, excludi
b1d0: 6e 67 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  ng the terminati
b1e0: 6e 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20  ng null char..  
b1f0: 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 4c 65 6e  */.  DWORD dwLen
b200: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f   = 0;.  char *zO
b210: 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69  ut = 0;..  if( i
b220: 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
b230: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
b240: 20 57 43 48 41 52 20 7a 54 65 6d 70 57 69 64 65   WCHAR zTempWide
b250: 5b 4d 41 58 5f 50 41 54 48 2b 31 5d 3b 20 2f 2a  [MAX_PATH+1]; /*
b260: 20 4e 4f 54 45 3a 20 53 6f 6d 65 77 68 61 74 20   NOTE: Somewhat 
b270: 61 72 62 69 74 72 61 72 79 2e 20 2a 2f 0a 20 20  arbitrary. */.  
b280: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
b290: 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41  atMessageW(FORMA
b2a0: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
b2b0: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
b2e0: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
b2f0: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b310: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
b320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b330: 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b350: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b370: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d              zTem
b380: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
b390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3a0: 20 20 20 20 4d 41 58 5f 50 41 54 48 2c 0a 20 20      MAX_PATH,.  
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3c0: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23             0);.#
b3d0: 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54 52 20  else.    LPWSTR 
b3e0: 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c  zTempWide = NULL
b3f0: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
b400: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46  FormatMessageW(F
b410: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
b420: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
b430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
b450: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
b460: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _SYSTEM |.      
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
b490: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
b4a0: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20     NULL,.       
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4e0: 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
b4f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
b510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 4c                (L
b530: 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64  PWSTR) &zTempWid
b540: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b580: 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  0);.#endif.    i
b590: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
b5a0: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
b5b0: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
b5c0: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
b5d0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
b5e0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
b5f0: 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ();.      zOut =
b600: 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a   unicodeToUtf8(z
b610: 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 20  TempWide);.     
b620: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
b630: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20 21  nMalloc();.#if !
b640: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
b650: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
b660: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
b670: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
b680: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
b690: 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28      osLocalFree(
b6a0: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e 64  zTempWide);.#end
b6b0: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  if.    }.  }.#if
b6c0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
b6d0: 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
b6e0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
b6f0: 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77  p = NULL;.    dw
b700: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
b710: 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45  ssageA(FORMAT_ME
b720: 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42  SSAGE_ALLOCATE_B
b730: 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20  UFFER |.        
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b750: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
b760: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
b770: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
b790: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
b7a0: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7c0: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
b7d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
b7f0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b830: 20 20 20 20 20 20 28 4c 50 53 54 52 29 20 26 7a        (LPSTR) &z
b840: 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Temp,.          
b850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b860: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b880: 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64     0);.    if( d
b890: 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20  wLen > 0 ){.    
b8a0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20    /* allocate a 
b8b0: 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65  buffer and conve
b8c0: 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20  rt to UTF8 */.  
b8d0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
b8e0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
b8f0: 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c        zOut = sql
b900: 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
b910: 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a  to_utf8(zTemp);.
b920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
b930: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
b940: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
b950: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
b960: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
b970: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
b980: 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28      osLocalFree(
b990: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  zTemp);.    }.  
b9a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 30  }.#endif.  if( 0
b9b0: 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20   == dwLen ){.   
b9c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
b9d0: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f  f(nBuf, zBuf, "O
b9e0: 73 45 72 72 6f 72 20 30 78 25 78 20 28 25 75 29  sError 0x%x (%u)
b9f0: 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61  ", lastErrno, la
ba00: 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73  stErrno);.  }els
ba10: 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 61  e{.    /* copy a
ba20: 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66   maximum of nBuf
ba30: 20 63 68 61 72 73 20 74 6f 20 6f 75 74 70 75 74   chars to output
ba40: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73   buffer */.    s
ba50: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
ba60: 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 22  nBuf, zBuf, "%s"
ba70: 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20  , zOut);.    /* 
ba80: 66 72 65 65 20 74 68 65 20 55 54 46 38 20 62 75  free the UTF8 bu
ba90: 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ffer */.    sqli
baa0: 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
bab0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
bac0: 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  }../*.**.** This
bad0: 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c   function - winL
bae0: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 20  ogErrorAtLine() 
baf0: 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63  - is only ever c
bb00: 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61  alled via the ma
bb10: 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72  cro.** winLogErr
bb20: 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  or()..**.** This
bb30: 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f   routine is invo
bb40: 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72  ked after an err
bb50: 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20  or occurs in an 
bb60: 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  OS function..** 
bb70: 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67  It logs a messag
bb80: 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  e using sqlite3_
bb90: 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67  log() containing
bba0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
bbb0: 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63  ue of.** error c
bbc0: 6f 64 65 20 61 6e 64 2c 20 69 66 20 70 6f 73 73  ode and, if poss
bbd0: 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d  ible, the human-
bbe0: 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c  readable equival
bbf0: 65 6e 74 20 66 72 6f 6d 20 0a 2a 2a 20 46 6f 72  ent from .** For
bc00: 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a  matMessage..**.*
bc10: 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
bc20: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
bc30: 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20  he macro should 
bc40: 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  be the error cod
bc50: 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62  e that.** will b
bc60: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  e returned to SQ
bc70: 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54  Lite (e.g. SQLIT
bc80: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
bc90: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29  SQLITE_CANTOPEN)
bca0: 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75  . .** The two su
bcb0: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
bcc0: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ts should be the
bcd0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20   name of the OS 
bce0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
bcf0: 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68 65 20   failed and the 
bd00: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
bd10: 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20  system path, if 
bd20: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
bd30: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c  winLogError(a,b,
bd40: 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45 72 72  c,d)   winLogErr
bd50: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64  orAtLine(a,b,c,d
bd60: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69  ,__LINE__).stati
bd70: 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f  c int winLogErro
bd80: 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65  rAtLine(.  int e
bd90: 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20  rrcode,         
bda0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
bdb0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
bdc0: 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
bdd0: 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  rrno,           
bde0: 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61       /* Win32 la
bdf0: 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f  st error */.  co
be00: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be20: 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63   Name of OS func
be30: 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64  tion that failed
be40: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
be50: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
be60: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61        /* File pa
be70: 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  th associated wi
be80: 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e  th error */.  in
be90: 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20  t iLine         
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
beb0: 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d   Source line num
bec0: 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20  ber where error 
bed0: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20  occurred */.){. 
bee0: 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b   char zMsg[500];
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64 61 62   /* Human readab
bf10: 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20 2a 2f  le error text */
bf20: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
bf50: 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d  er */..  zMsg[0]
bf60: 20 3d 20 30 3b 0a 20 20 67 65 74 4c 61 73 74 45   = 0;.  getLastE
bf70: 72 72 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e  rrorMsg(lastErrn
bf80: 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c  o, sizeof(zMsg),
bf90: 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74   zMsg);.  assert
bfa0: 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54  ( errcode!=SQLIT
bfb0: 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50  E_OK );.  if( zP
bfc0: 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d  ath==0 ) zPath =
bfd0: 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   "";.  for(i=0; 
bfe0: 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b  zMsg[i] && zMsg[
bff0: 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67  i]!='\r' && zMsg
c000: 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b  [i]!='\n'; i++){
c010: 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b  }.  zMsg[i] = 0;
c020: 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65  .  sqlite3_log(e
c030: 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f  rrcode,.      "o
c040: 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28 25 64 29  s_win.c:%d: (%d)
c050: 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20   %s(%s) - %s",. 
c060: 20 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74       iLine, last
c070: 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50  Errno, zFunc, zP
c080: 61 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a  ath, zMsg.  );..
c090: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65    return errcode
c0a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e  ;.}../*.** The n
c0b0: 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
c0c0: 68 61 74 20 61 20 52 65 61 64 46 69 6c 65 28 29  hat a ReadFile()
c0d0: 2c 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61  , WriteFile(), a
c0e0: 6e 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a  nd DeleteFile().
c0f0: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69  ** will be retri
c100: 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c  ed following a l
c110: 6f 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70  ocking error - p
c120: 72 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20 62  robably caused b
c130: 79 20 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20  y .** antivirus 
c140: 73 6f 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20  software.  Also 
c150: 74 68 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61  the initial dela
c160: 79 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  y before the fir
c170: 73 74 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65  st retry..** The
c180: 20 64 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73   delay increases
c190: 20 6c 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65   linearly with e
c1a0: 61 63 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69  ach retry..*/.#i
c1b0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
c1c0: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23  32_IOERR_RETRY.#
c1d0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
c1e0: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
c1f0: 20 31 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64   10.#endif.#ifnd
c200: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
c210: 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
c220: 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  Y.# define SQLIT
c230: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
c240: 54 52 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e  TRY_DELAY 25.#en
c250: 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77  dif.static int w
c260: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20 3d  in32IoerrRetry =
c270: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
c280: 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61 74 69  ERR_RETRY;.stati
c290: 63 20 69 6e 74 20 77 69 6e 33 32 49 6f 65 72 72  c int win32Ioerr
c2a0: 52 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c  RetryDelay = SQL
c2b0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
c2c0: 52 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a  RETRY_DELAY;../*
c2d0: 0a 2a 2a 20 49 66 20 61 20 52 65 61 64 46 69 6c  .** If a ReadFil
c2e0: 65 28 29 20 6f 72 20 57 72 69 74 65 46 69 6c 65  e() or WriteFile
c2f0: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
c300: 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75   invoke this rou
c310: 74 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69  tine.** to see i
c320: 66 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72  f it should be r
c330: 65 74 72 69 65 64 2e 20 20 52 65 74 75 72 6e 20  etried.  Return 
c340: 54 52 55 45 20 74 6f 20 72 65 74 72 79 2e 20 20  TRUE to retry.  
c350: 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
c360: 74 6f 20 67 69 76 65 20 75 70 20 77 69 74 68 20  to give up with 
c370: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  an error..*/.sta
c380: 74 69 63 20 69 6e 74 20 72 65 74 72 79 49 6f 65  tic int retryIoe
c390: 72 72 28 69 6e 74 20 2a 70 6e 52 65 74 72 79 2c  rr(int *pnRetry,
c3a0: 20 44 57 4f 52 44 20 2a 70 45 72 72 6f 72 29 7b   DWORD *pError){
c3b0: 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47  .  DWORD e = osG
c3c0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
c3d0: 20 69 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77   if( *pnRetry>=w
c3e0: 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20 29  in32IoerrRetry )
c3f0: 7b 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f 72  {.    if( pError
c400: 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f   ){.      *pErro
c410: 72 20 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20 20  r = e;.    }.   
c420: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
c430: 20 69 66 28 20 65 3d 3d 45 52 52 4f 52 5f 41 43   if( e==ERROR_AC
c440: 43 45 53 53 5f 44 45 4e 49 45 44 20 7c 7c 0a 20  CESS_DENIED ||. 
c450: 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f       e==ERROR_LO
c460: 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0a  CK_VIOLATION ||.
c470: 20 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 53        e==ERROR_S
c480: 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e  HARING_VIOLATION
c490: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c4a0: 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 33  win32_sleep(win3
c4b0: 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  2IoerrRetryDelay
c4c0: 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a  *(1+*pnRetry));.
c4d0: 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a      ++*pnRetry;.
c4e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
c4f0: 7d 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20 29  }.  if( pError )
c500: 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20  {.    *pError = 
c510: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
c520: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20  0;.}../*.** Log 
c530: 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72  a I/O error retr
c540: 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74  y episode..*/.st
c550: 61 74 69 63 20 76 6f 69 64 20 6c 6f 67 49 6f 65  atic void logIoe
c560: 72 72 28 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a  rr(int nRetry){.
c570: 20 20 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a    if( nRetry ){.
c580: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
c590: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 0a 20  SQLITE_IOERR, . 
c5a0: 20 20 20 20 20 22 64 65 6c 61 79 65 64 20 25 64       "delayed %d
c5b0: 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72  ms for lock/shar
c5c0: 69 6e 67 20 63 6f 6e 66 6c 69 63 74 22 2c 0a 20  ing conflict",. 
c5d0: 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52       win32IoerrR
c5e0: 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79  etryDelay*nRetry
c5f0: 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 0a 20 20  *(nRetry+1)/2.  
c600: 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20    );.  }.}..#if 
c610: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
c620: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
c630: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c640: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68  **********.** Th
c670: 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61  is section conta
c680: 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69 6e  ins code for Win
c690: 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20  CE only..*/.#if 
c6a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
c6b0: 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41  MSVC_LOCALTIME_A
c6c0: 50 49 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 4d  PI) || !SQLITE_M
c6d0: 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50  SVC_LOCALTIME_AP
c6e0: 49 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 53 56 43  I./*.** The MSVC
c6f0: 20 43 52 54 20 6f 6e 20 57 69 6e 64 6f 77 73 20   CRT on Windows 
c700: 43 45 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  CE may not have 
c710: 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75  a localtime() fu
c720: 6e 63 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 63  nction.  So.** c
c730: 72 65 61 74 65 20 61 20 73 75 62 73 74 69 74 75  reate a substitu
c740: 74 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  te..*/.#include 
c750: 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20  <time.h>.struct 
c760: 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61  tm *__cdecl loca
c770: 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65  ltime(const time
c780: 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69  _t *t).{.  stati
c790: 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20  c struct tm y;. 
c7a0: 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c   FILETIME uTm, l
c7b0: 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45  Tm;.  SYSTEMTIME
c7c0: 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f   pTm;.  sqlite3_
c7d0: 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36 34  int64 t64;.  t64
c7e0: 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28   = *t;.  t64 = (
c7f0: 74 36 34 20 2b 20 31 31 36 34 34 34 37 33 36 30  t64 + 1164447360
c800: 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20 75  0)*10000000;.  u
c810: 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  Tm.dwLowDateTime
c820: 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 26   = (DWORD)(t64 &
c830: 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a 20 20   0xFFFFFFFF);.  
c840: 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54 69  uTm.dwHighDateTi
c850: 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20  me= (DWORD)(t64 
c860: 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65  >> 32);.  osFile
c870: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
c880: 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a  ime(&uTm,&lTm);.
c890: 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79    osFileTimeToSy
c8a0: 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70  stemTime(&lTm,&p
c8b0: 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72  Tm);.  y.tm_year
c8c0: 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31   = pTm.wYear - 1
c8d0: 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20  900;.  y.tm_mon 
c8e0: 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31  = pTm.wMonth - 1
c8f0: 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20  ;.  y.tm_wday = 
c900: 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a  pTm.wDayOfWeek;.
c910: 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54    y.tm_mday = pT
c920: 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68  m.wDay;.  y.tm_h
c930: 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b  our = pTm.wHour;
c940: 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54  .  y.tm_min = pT
c950: 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74  m.wMinute;.  y.t
c960: 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63  m_sec = pTm.wSec
c970: 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79  ond;.  return &y
c980: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66  ;.}.#endif..#def
c990: 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  ine HANDLE_TO_WI
c9a0: 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69 6c  NFILE(a) (winFil
c9b0: 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b 2d  e*)&((char*)a)[-
c9c0: 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28 77 69  (int)offsetof(wi
c9d0: 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a  nFile,h)]../*.**
c9e0: 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b 20   Acquire a lock 
c9f0: 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68 0a  on the handle h.
ca00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
ca10: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
ca20: 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44  (HANDLE h){.   D
ca30: 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20 64  WORD dwErr;.   d
ca40: 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20 3d  o {.     dwErr =
ca50: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
ca60: 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e 49  Object(h, INFINI
ca70: 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20  TE);.   } while 
ca80: 28 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 4f  (dwErr != WAIT_O
ca90: 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72 72  BJECT_0 && dwErr
caa0: 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e   != WAIT_ABANDON
cab0: 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c  ED);.}./*.** Rel
cac0: 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 75  ease a lock acqu
cad0: 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75 74  ired by winceMut
cae0: 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23  exAcquire().*/.#
caf0: 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65  define winceMute
cb00: 78 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65  xRelease(h) Rele
cb10: 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a  aseMutex(h)../*.
cb20: 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d 75  ** Create the mu
cb30: 74 65 78 20 61 6e 64 20 73 68 61 72 65 64 20 6d  tex and shared m
cb40: 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c  emory used for l
cb50: 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 69  ocking in the fi
cb60: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
cb70: 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63   pFile.*/.static
cb80: 20 42 4f 4f 4c 20 77 69 6e 63 65 43 72 65 61 74   BOOL winceCreat
cb90: 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72  eLock(const char
cba0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e   *zFilename, win
cbb0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
cbc0: 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c  LPWSTR zTok;.  L
cbd0: 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20 42  PWSTR zName;.  B
cbe0: 4f 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45  OOL bInit = TRUE
cbf0: 3b 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 75 74 66  ;..  zName = utf
cc00: 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  8ToUnicode(zFile
cc10: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  name);.  if( zNa
cc20: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
cc30: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f  out of memory */
cc40: 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c 53  .    return FALS
cc50: 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  E;.  }..  /* Ini
cc60: 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
cc70: 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
cc80: 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c  memset(&pFile->l
cc90: 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocal, 0, sizeof(
cca0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
ccb0: 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
ccc0: 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
ccd0: 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
cce0: 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
ccf0: 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
cd00: 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
cd10: 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72  .  zTok = osChar
cd20: 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
cd30: 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
cd40: 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
cd50: 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
cd60: 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
cd70: 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
cd80: 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
cd90: 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
cda0: 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74  ex = osCreateMut
cdb0: 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c  exW(NULL, FALSE,
cdc0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21   zName);.  if (!
cdd0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
cde0: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
cdf0: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
ce00: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e  Error();.    win
ce10: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
ce20: 45 52 52 4f 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  ERROR, pFile->la
ce30: 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 63 65 43  stErrno, "winceC
ce40: 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a 46 69  reateLock1", zFi
ce50: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  lename);.    sql
ce60: 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
ce70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 46 41 4c  ;.    return FAL
ce80: 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63  SE;.  }..  /* Ac
ce90: 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
cea0: 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
ceb0: 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65  g */.  winceMute
cec0: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
ced0: 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a  hMutex);.  .  /*
cee0: 20 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73   Since the names
cef0: 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65   of named mutexe
cf00: 73 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66  s, semaphores, f
cf10: 69 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63  ile mappings etc
cf20: 20 61 72 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d   are .  ** case-
cf30: 73 65 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20  sensitive, take 
cf40: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61  advantage of tha
cf50: 74 20 62 79 20 75 70 70 65 72 63 61 73 69 6e 67  t by uppercasing
cf60: 20 74 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a   the mutex name.
cf70: 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74    ** and using t
cf80: 68 61 74 20 61 73 20 74 68 65 20 73 68 61 72 65  hat as the share
cf90: 64 20 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61  d filemapping na
cfa0: 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61  me..  */.  osCha
cfb0: 72 55 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rUpperW(zName);.
cfc0: 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64    pFile->hShared
cfd0: 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
cfe0: 61 70 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f  appingW(INVALID_
cff0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55  HANDLE_VALUE, NU
d000: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d020: 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
d030: 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73  _READWRITE, 0, s
d040: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
d050: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
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 7a 4e 61 6d 65 29            zName)
d080: 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20  ;  ..  /* Set a 
d090: 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63 61  flag that indica
d0a0: 74 65 73 20 77 65 27 72 65 20 74 68 65 20 66 69  tes we're the fi
d0b0: 72 73 74 20 74 6f 20 63 72 65 61 74 65 20 74 68  rst to create th
d0c0: 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74 20 0a  e memory so it .
d0d0: 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65 72    ** must be zer
d0e0: 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f  o-initialized */
d0f0: 0a 20 20 69 66 20 28 6f 73 47 65 74 4c 61 73 74  .  if (osGetLast
d100: 45 72 72 6f 72 28 29 20 3d 3d 20 45 52 52 4f 52  Error() == ERROR
d110: 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29  _ALREADY_EXISTS)
d120: 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41  {.    bInit = FA
d130: 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  LSE;.  }..  sqli
d140: 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b  te3_free(zName);
d150: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63  ..  /* If we suc
d160: 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67  ceeded in making
d170: 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
d180: 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69  ry handle, map i
d190: 74 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  t. */.  if (pFil
d1a0: 65 2d 3e 68 53 68 61 72 65 64 29 7b 0a 20 20 20  e->hShared){.   
d1b0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d   pFile->shared =
d1c0: 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d   (winceLock*)osM
d1d0: 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
d1e0: 6c 65 2d 3e 68 53 68 61 72 65 64 2c 20 0a 20 20  le->hShared, .  
d1f0: 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f             FILE_
d200: 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41  MAP_READ|FILE_MA
d210: 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73  P_WRITE, 0, 0, s
d220: 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
d230: 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70  );.    /* If map
d240: 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f  ping failed, clo
d250: 73 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  se the shared me
d260: 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20  mory handle and 
d270: 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20  erase it */.    
d280: 69 66 20 28 21 70 46 69 6c 65 2d 3e 73 68 61 72  if (!pFile->shar
d290: 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ed){.      pFile
d2a0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
d2b0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
d2c0: 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
d2d0: 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  r(SQLITE_ERROR, 
d2e0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d2f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d300: 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
d310: 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k2", zFilename);
d320: 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  .      osCloseHa
d330: 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
d340: 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c  red);.      pFil
d350: 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c  e->hShared = NUL
d360: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
d370: 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d  /* If shared mem
d380: 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ory could not be
d390: 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63   created, then c
d3a0: 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 61  lose the mutex a
d3b0: 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 20  nd fail */.  if 
d3c0: 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20  (pFile->hShared 
d3d0: 3d 3d 20 4e 55 4c 4c 29 7b 0a 20 20 20 20 77 69  == NULL){.    wi
d3e0: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
d3f0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
d400: 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
d410: 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
d420: 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
d430: 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tex = NULL;.    
d440: 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 20 20  return FALSE;.  
d450: 7d 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61  }.  .  /* Initia
d460: 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 20  lize the shared 
d470: 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20  memory if we're 
d480: 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20  supposed to */. 
d490: 20 69 66 20 28 62 49 6e 69 74 29 20 7b 0a 20 20   if (bInit) {.  
d4a0: 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e    memset(pFile->
d4b0: 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f  shared, 0, sizeo
d4c0: 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20  f(winceLock));. 
d4d0: 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
d4e0: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
d4f0: 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
d500: 20 54 52 55 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   TRUE;.}../*.** 
d510: 44 65 73 74 72 6f 79 20 74 68 65 20 70 61 72 74  Destroy the part
d520: 20 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74   of winFile that
d530: 20 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63   deals with winc
d540: 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69  e locks.*/.stati
d550: 63 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74  c void winceDest
d560: 72 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  royLock(winFile 
d570: 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70  *pFile){.  if (p
d580: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20  File->hMutex){. 
d590: 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68     /* Acquire th
d5a0: 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77  e mutex */.    w
d5b0: 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
d5c0: 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
d5d0: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ..    /* The fol
d5e0: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68  lowing blocks sh
d5f0: 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73  ould probably as
d600: 73 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f  sert in debug mo
d610: 64 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20  de, but they.   
d620: 20 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e      are to clean
d630: 75 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c  up in case any l
d640: 6f 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70  ocks remained op
d650: 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  en */.    if (pF
d660: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
d670: 65 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ers){.      pFil
d680: 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
d690: 65 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  ers --;.    }.  
d6a0: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
d6b0: 61 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20  al.bReserved){. 
d6c0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
d6d0: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
d6e0: 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20  FALSE;.    }.   
d6f0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
d700: 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20  l.bPending){.   
d710: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
d720: 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  ->bPending = FAL
d730: 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  SE;.    }.    if
d740: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62   (pFile->local.b
d750: 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20  Exclusive){.    
d760: 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
d770: 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  >bExclusive = FA
d780: 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LSE;.    }..    
d790: 2f 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20  /* De-reference 
d7a0: 61 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f  and close our co
d7b0: 70 79 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  py of the shared
d7c0: 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a   memory handle *
d7d0: 2f 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65  /.    osUnmapVie
d7e0: 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73  wOfFile(pFile->s
d7f0: 68 61 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c  hared);.    osCl
d800: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
d810: 3e 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20  >hShared);..    
d820: 2f 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65  /* Done with the
d830: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69   mutex */.    wi
d840: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
d850: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 20  pFile->hMutex); 
d860: 20 20 20 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48     .    osCloseH
d870: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75  andle(pFile->hMu
d880: 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  tex);.    pFile-
d890: 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  >hMutex = NULL;.
d8a0: 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41 6e    }.}../* .** An
d8b0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
d8c0: 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28  of the LockFile(
d8d0: 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73  ) API of Windows
d8e0: 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69   for CE.*/.stati
d8f0: 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b  c BOOL winceLock
d900: 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
d910: 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
d920: 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
d930: 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
d940: 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
d950: 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
d960: 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  esToLockLow,.  D
d970: 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
d980: 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b  tesToLockHigh.){
d990: 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
d9a0: 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  e = HANDLE_TO_WI
d9b0: 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20  NFILE(phFile);. 
d9c0: 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20   BOOL bReturn = 
d9d0: 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44  FALSE;..  UNUSED
d9e0: 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c  _PARAMETER(dwFil
d9f0: 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20  eOffsetHigh);.  
da00: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
da10: 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
da20: 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  oLockHigh);..  i
da30: 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
da40: 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
da50: 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
da60: 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
da70: 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e  x);..  /* Wantin
da80: 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
da90: 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77  ock? */.  if (dw
daa0: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
dab0: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
dac0: 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e  IRST.       && n
dad0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
dae0: 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
daf0: 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20  )SHARED_SIZE){. 
db00: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
db10: 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d  ared->nReaders =
db20: 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68  = 0 && pFile->sh
db30: 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
db40: 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70   == 0){.       p
db50: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
db60: 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
db70: 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  .       pFile->l
db80: 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20  ocal.bExclusive 
db90: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62  = TRUE;.       b
dba0: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
dbb0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
dbc0: 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ant a read-only 
dbd0: 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20  lock? */.  else 
dbe0: 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
dbf0: 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
dc00: 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20  ARED_FIRST &&.  
dc10: 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 72           nNumber
dc20: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
dc30: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
dc40: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
dc50: 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b  Exclusive == 0){
dc60: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
dc70: 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  cal.nReaders ++;
dc80: 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
dc90: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
dca0: 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 20   == 1){.        
dcb0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
dcc0: 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20  Readers ++;.    
dcd0: 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72    }.      bRetur
dce0: 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
dcf0: 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
dd00: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a   pending lock? *
dd10: 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
dd20: 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
dd30: 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42  (DWORD)PENDING_B
dd40: 59 54 45 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66  YTE && nNumberOf
dd50: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
dd60: 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  = 1){.    /* If 
dd70: 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  no pending lock 
dd80: 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65  has been acquire
dd90: 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  d, then acquire 
dda0: 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  it */.    if (pF
ddb0: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
ddc0: 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20  nding == 0) {.  
ddd0: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
dde0: 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  d->bPending = TR
ddf0: 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  UE;.      pFile-
de00: 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
de10: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52  = TRUE;.      bR
de20: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
de30: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
de40: 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  nt a reserved lo
de50: 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
de60: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
de70: 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45  w == (DWORD)RESE
de80: 52 56 45 44 5f 42 59 54 45 20 26 26 20 6e 4e 75  RVED_BYTE && nNu
de90: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
dea0: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
deb0: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
dec0: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20  d->bReserved == 
ded0: 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0) {.      pFile
dee0: 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
def0: 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
df00: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
df10: 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b  Reserved = TRUE;
df20: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
df30: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
df40: 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
df50: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
df60: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  tex);.  return b
df70: 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Return;.}../*.**
df80: 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
df90: 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b  on of the Unlock
dfa0: 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64  File API of Wind
dfb0: 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74  ows for CE.*/.st
dfc0: 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55  atic BOOL winceU
dfd0: 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  nlockFile(.  LPH
dfe0: 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
dff0: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
e000: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
e010: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
e020: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
e030: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
e040: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  ow,.  DWORD nNum
e050: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
e060: 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
e070: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
e080: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
e090: 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
e0a0: 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
e0b0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
e0c0: 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
e0d0: 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
e0e0: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
e0f0: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
e100: 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
e110: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
e120: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
e130: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
e140: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
e150: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
e160: 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20   reader lock or 
e170: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
e180: 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c  k */.  if (dwFil
e190: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
e1a0: 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
e1b0: 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77  T){.    /* Did w
e1c0: 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  e have an exclus
e1d0: 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20  ive lock? */.   
e1e0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
e1f0: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
e200: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
e210: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
e220: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
e230: 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20  SHARED_SIZE);.  
e240: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
e250: 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  .bExclusive = FA
e260: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
e270: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
e280: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
e290: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
e2a0: 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  UE;.    }..    /
e2b0: 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61  * Did we just ha
e2c0: 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  ve a reader lock
e2d0: 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  ? */.    else if
e2e0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
e2f0: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
e300: 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
e310: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
e320: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
e330: 44 5f 53 49 5a 45 20 7c 7c 20 6e 4e 75 6d 62 65  D_SIZE || nNumbe
e340: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
e350: 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20  Low == 1);.     
e360: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52   pFile->local.nR
e370: 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20  eaders --;.     
e380: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
e390: 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 29  l.nReaders == 0)
e3a0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
e3b0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
e3c0: 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
e3d0: 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
e3e0: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
e3f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  .  }..  /* Relea
e400: 73 69 6e 67 20 61 20 70 65 6e 64 69 6e 67 20 6c  sing a pending l
e410: 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ock */.  else if
e420: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
e430: 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
e440: 49 4e 47 5f 42 59 54 45 20 26 26 20 6e 4e 75 6d  ING_BYTE && nNum
e450: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
e460: 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
e470: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
e480: 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20  l.bPending){.   
e490: 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
e4a0: 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
e4b0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  ;.      pFile->s
e4c0: 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
e4d0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
e4e0: 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
e4f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65     }.  }.  /* Re
e500: 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72 76  leasing a reserv
e510: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73  ed lock */.  els
e520: 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
e530: 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
e540: 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 26 26  RESERVED_BYTE &&
e550: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
e560: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
e570: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
e580: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
e590: 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
e5a0: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
e5b0: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
e5c0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
e5d0: 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
e5e0: 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  ;.      bReturn 
e5f0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
e600: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
e610: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
e620: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
e630: 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a  bReturn;.}./*.**
e640: 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63   End of the spec
e650: 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e  ial code for win
e660: 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ce.*************
e670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e6b0: 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  /.#endif /* SQLI
e6c0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a  TE_OS_WINCE */..
e6d0: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c  /*.** Lock a fil
e6e0: 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  e region..*/.sta
e6f0: 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b  tic BOOL winLock
e700: 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
e710: 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
e720: 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20   flags,.  DWORD 
e730: 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  offsetLow,.  DWO
e740: 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20  RD offsetHigh,. 
e750: 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c   DWORD numBytesL
e760: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42  ow,.  DWORD numB
e770: 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20  ytesHigh.){.#if 
e780: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
e790: 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20    /*.  ** NOTE: 
e7a0: 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61  Windows CE is ha
e7b0: 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
e7c0: 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c  y here due its l
e7d0: 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ack of the Win32
e7e0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20  .  **       API 
e7f0: 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20  LockFile..  */. 
e800: 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63   return winceLoc
e810: 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66  kFile(phFile, of
e820: 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48  fsetLow, offsetH
e830: 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  igh,.           
e840: 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
e850: 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65  ytesLow, numByte
e860: 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20  sHigh);.#else.  
e870: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
e880: 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
e890: 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  p;.    memset(&o
e8a0: 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  vlp, 0, sizeof(O
e8b0: 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
e8c0: 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f   ovlp.Offset = o
e8d0: 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76  ffsetLow;.    ov
e8e0: 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  lp.OffsetHigh = 
e8f0: 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20  offsetHigh;.    
e900: 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c  return osLockFil
e910: 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61  eEx(*phFile, fla
e920: 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  gs, 0, numBytesL
e930: 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
e940: 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
e950: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
e960: 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65  LockFile(*phFile
e970: 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
e980: 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65  setHigh, numByte
e990: 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  sLow,.          
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
e9b0: 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23  ytesHigh);.  }.#
e9c0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  endif.}../*.** U
e9d0: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67  nlock a file reg
e9e0: 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ion.. */.static 
e9f0: 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  BOOL winUnlockFi
ea00: 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
ea10: 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f  hFile,.  DWORD o
ea20: 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
ea30: 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  D offsetHigh,.  
ea40: 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f  DWORD numBytesLo
ea50: 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  w,.  DWORD numBy
ea60: 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53  tesHigh.){.#if S
ea70: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
ea80: 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57   /*.  ** NOTE: W
ea90: 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
eaa0: 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
eab0: 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
eac0: 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
ead0: 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55    **       API U
eae0: 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a  nlockFile..  */.
eaf0: 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e    return winceUn
eb00: 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c  lockFile(phFile,
eb10: 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
eb20: 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20  etHigh,.        
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb40: 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
eb50: 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c  mBytesHigh);.#el
eb60: 73 65 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20  se.  if( isNT() 
eb70: 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
eb80: 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73  D ovlp;.    mems
eb90: 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
eba0: 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
ebb0: 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
ebc0: 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20  t = offsetLow;. 
ebd0: 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69     ovlp.OffsetHi
ebe0: 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b  gh = offsetHigh;
ebf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
ec00: 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69  lockFileEx(*phFi
ec10: 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  le, 0, numBytesL
ec20: 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
ec30: 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
ec40: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
ec50: 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69  UnlockFile(*phFi
ec60: 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
ec70: 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79  ffsetHigh, numBy
ec80: 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20  tesLow,.        
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eca0: 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
ecb0: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a   }.#endif.}../**
ecc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ecd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ece0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ecf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
ed10: 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
ed20: 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
ed30: 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  ent the I/O meth
ed40: 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ods specified.**
ed50: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
ed60: 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
ed70: 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t..*************
ed80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ed90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
eda0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
edb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
edc0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  */../*.** Some M
edd0: 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
ede0: 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
edf0: 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
ee00: 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  def INVALID_SET_
ee10: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64  FILE_POINTER.# d
ee20: 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45  efine INVALID_SE
ee30: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28  T_FILE_POINTER (
ee40: 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69  (DWORD)-1).#endi
ee50: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
ee60: 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
ee70: 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  on of the file h
ee80: 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
ee90: 74 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72  the first .** ar
eea0: 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74  gument to offset
eeb0: 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20   iOffset within 
eec0: 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63  the file. If suc
eed0: 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20  cessful, return 
eee0: 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  0. .** Otherwise
eef0: 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
ef00: 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
ef10: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
ef20: 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 57 69  tatic int seekWi
ef30: 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  nFile(winFile *p
ef40: 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
ef50: 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69  t64 iOffset){.#i
ef60: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
ef70: 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  RT.  LONG upperB
ef80: 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
ef90: 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67       /* Most sig
efa0: 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
efb0: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e   offset */.  LON
efc0: 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20  G lowerBits;    
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
efe0: 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 69  Least sig. 32 bi
eff0: 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
f000: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65   */.  DWORD dwRe
f010: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
f020: 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
f030: 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
f040: 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20  lePointer() */. 
f050: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
f060: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f070: 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
f080: 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
f090: 6f 72 28 29 20 2a 2f 0a 0a 20 20 75 70 70 65 72  or() */..  upper
f0a0: 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69  Bits = (LONG)((i
f0b0: 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  Offset>>32) & 0x
f0c0: 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77  7fffffff);.  low
f0d0: 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
f0e0: 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  iOffset & 0xffff
f0f0: 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49  ffff);..  /* API
f100: 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 63   oddity: If succ
f110: 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50  essful, SetFileP
f120: 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73  ointer() returns
f130: 20 61 20 64 77 6f 72 64 20 0a 20 20 2a 2a 20 63   a dword .  ** c
f140: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f  ontaining the lo
f150: 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74  wer 32-bits of t
f160: 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73  he new file-offs
f170: 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61  et. Or, if it fa
f180: 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74  ils,.  ** it ret
f190: 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54  urns INVALID_SET
f1a0: 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48  _FILE_POINTER. H
f1b0: 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67  owever according
f1c0: 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20   to MSDN, .  ** 
f1d0: 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
f1e0: 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73  _POINTER may als
f1f0: 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77  o be a valid new
f200: 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64   offset. So to d
f210: 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
f220: 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72 20  hether an error 
f230: 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63 63  has actually occ
f240: 75 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f  ured, it is also
f250: 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63 61   necessary to ca
f260: 6c 6c 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74  ll .  ** GetLast
f270: 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  Error()..  */.  
f280: 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c  dwRet = osSetFil
f290: 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e  ePointer(pFile->
f2a0: 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75  h, lowerBits, &u
f2b0: 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42  pperBits, FILE_B
f2c0: 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64  EGIN);..  if( (d
f2d0: 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45  wRet==INVALID_SE
f2e0: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20  T_FILE_POINTER. 
f2f0: 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72       && ((lastEr
f300: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
f310: 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f  rror())!=NO_ERRO
f320: 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  R)) ){.    pFile
f330: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
f340: 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e  stErrno;.    win
f350: 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
f360: 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c  IOERR_SEEK, pFil
f370: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
f380: 20 20 20 20 20 20 20 20 20 20 20 22 73 65 65 6b             "seek
f390: 57 69 6e 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  WinFile", pFile-
f3a0: 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74  >zPath);.    ret
f3b0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65  urn 1;.  }..  re
f3c0: 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20  turn 0;.#else.  
f3d0: 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20 61 73 20  /*.  ** Same as 
f3e0: 61 62 6f 76 65 2c 20 65 78 63 65 70 74 20 74 68  above, except th
f3f0: 61 74 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e  at this implemen
f400: 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72  tation works for
f410: 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20   WinRT..  */..  
f420: 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 78 3b  LARGE_INTEGER x;
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66 66 73 65  /* The new offse
f450: 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74  t */.  BOOL bRet
f460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f470: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
f480: 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46  returned by SetF
f490: 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 29 20 2a  ilePointerEx() *
f4a0: 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61 72 74 20  /..  x.QuadPart 
f4b0: 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20 62 52 65  = iOffset;.  bRe
f4c0: 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69  t = osSetFilePoi
f4d0: 6e 74 65 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c  nterEx(pFile->h,
f4e0: 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42 45 47 49   x, 0, FILE_BEGI
f4f0: 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52 65 74 29  N);..  if(!bRet)
f500: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
f510: 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
f520: 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 77  stError();.    w
f530: 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
f540: 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46  E_IOERR_SEEK, pF
f550: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73 65               "se
f570: 65 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46 69 6c  ekWinFile", pFil
f580: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72  e->zPath);.    r
f590: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
f5a0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
f5b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
f5c0: 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74  a file..**.** It
f5d0: 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 68 61   is reported tha
f5e0: 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  t an attempt to 
f5f0: 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d  close a handle m
f600: 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ight sometimes.*
f610: 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73  * fail.  This is
f620: 20 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e   a very unreason
f630: 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74  able result, but
f640: 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f   Windows is noto
f650: 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69  rious.** for bei
f660: 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  ng unreasonable 
f670: 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62  so I do not doub
f680: 74 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  t that it might 
f690: 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74  happen.  If.** t
f6a0: 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20  he close fails, 
f6b0: 77 65 20 70 61 75 73 65 20 66 6f 72 20 31 30 30  we pause for 100
f6c0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e   milliseconds an
f6d0: 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73  d try again.  As
f6e0: 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43  .** many as MX_C
f6f0: 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74  LOSE_ATTEMPT att
f700: 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74  empts to close t
f710: 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61  he handle are ma
f720: 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76  de before.** giv
f730: 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75 72  ing up and retur
f740: 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
f750: 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f  /.#define MX_CLO
f760: 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61  SE_ATTEMPT 3.sta
f770: 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65  tic int winClose
f780: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
f790: 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e  d){.  int rc, cn
f7a0: 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65  t = 0;.  winFile
f7b0: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
f7c0: 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
f7d0: 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69 66 6e  t( id!=0 );.#ifn
f7e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
f7f0: 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20 70 46  WAL.  assert( pF
f800: 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  ile->pShm==0 );.
f810: 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45  #endif.  OSTRACE
f820: 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  (("CLOSE %d\n", 
f830: 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 64 6f  pFile->h));.  do
f840: 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f  {.    rc = osClo
f850: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
f860: 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c  h);.    /* Simul
f870: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 30  ateIOError( rc=0
f880: 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41  ; cnt=MX_CLOSE_A
f890: 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20  TTEMPT; ); */.  
f8a0: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26  }while( rc==0 &&
f8b0: 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53   ++cnt < MX_CLOS
f8c0: 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73 71  E_ATTEMPT && (sq
f8d0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
f8e0: 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69  p(100), 1) );.#i
f8f0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
f900: 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45 5f  E.#define WINCE_
f910: 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
f920: 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74 72  S 3.  winceDestr
f930: 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  oyLock(pFile);. 
f940: 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c   if( pFile->zDel
f950: 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20  eteOnClose ){.  
f960: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
f970: 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20 20     while(.      
f980: 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69 6c       osDeleteFil
f990: 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  eW(pFile->zDelet
f9a0: 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20  eOnClose)==0.   
f9b0: 20 20 20 20 20 26 26 20 6f 73 47 65 74 46 69 6c       && osGetFil
f9c0: 65 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69  eAttributesW(pFi
f9d0: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
f9e0: 73 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 20  se)!=0xffffffff 
f9f0: 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b  .        && cnt+
fa00: 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49  + < WINCE_DELETI
fa10: 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20  ON_ATTEMPTS.    
fa20: 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
fa30: 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30  3_win32_sleep(10
fa40: 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 6c  0);  /* Wait a l
fa50: 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72 79  ittle before try
fa60: 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  ing again */.   
fa70: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
fa80: 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  ree(pFile->zDele
fa90: 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a  teOnClose);.  }.
faa0: 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45  #endif.  OSTRACE
fab0: 28 28 22 43 4c 4f 53 45 20 25 64 20 25 73 5c 6e  (("CLOSE %d %s\n
fac0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20  ", pFile->h, rc 
fad0: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
fae0: 22 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  "));.  if( rc ){
faf0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  .    pFile->h = 
fb00: 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e  NULL;.  }.  Open
fb10: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72  Counter(-1);.  r
fb20: 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54  eturn rc ? SQLIT
fb30: 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
fb40: 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   : winLogError(S
fb50: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53  QLITE_IOERR_CLOS
fb60: 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  E, osGetLastErro
fb70: 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
fb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
fb90: 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65  winClose", pFile
fba0: 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  ->zPath);.}../*.
fbb0: 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
fbc0: 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
fbd0: 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
fbe0: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
fbf0: 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
fc00: 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
fc10: 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
fc20: 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
fc30: 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
fc40: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65  static int winRe
fc50: 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
fc60: 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
fc70: 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64   /* File to read
fc80: 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20   from */.  void 
fc90: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
fca0: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
fcb0: 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73  ontent into this
fcc0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
fcd0: 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
fce0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
fcf0: 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65  r of bytes to re
fd00: 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ad */.  sqlite3_
fd10: 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20  int64 offset    
fd20: 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64     /* Begin read
fd30: 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73  ing at this offs
fd40: 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51  et */.){.#if !SQ
fd50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
fd60: 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c  OVERLAPPED overl
fd70: 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 20 20  apped;          
fd80: 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f  /* The offset fo
fd90: 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23  r ReadFile. */.#
fda0: 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20  endif.  winFile 
fdb0: 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
fdc0: 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20  e*)id;  /* file 
fdd0: 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52  handle */.  DWOR
fde0: 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20  D nRead;        
fdf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
fe00: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
fe10: 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f  ctually read fro
fe20: 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  m file */.  int 
fe30: 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20  nRetry = 0;     
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
fe50: 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73 20  umber of retrys 
fe60: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
fe70: 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  !=0 );.  Simulat
fe80: 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
fe90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
fea0: 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  D);.  OSTRACE(("
feb0: 52 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c  READ %d lock=%d\
fec0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46  n", pFile->h, pF
fed0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
fee0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
fef0: 57 49 4e 43 45 0a 20 20 69 66 28 20 73 65 65 6b  WINCE.  if( seek
ff00: 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f  WinFile(pFile, o
ff10: 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 72 65  ffset) ){.    re
ff20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
ff30: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 21  ;.  }.  while( !
ff40: 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65  osReadFile(pFile
ff50: 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
ff60: 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 23 65  &nRead, 0) ){.#e
ff70: 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76  lse.  memset(&ov
ff80: 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a  erlapped, 0, siz
ff90: 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
ffa0: 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f  ;.  overlapped.O
ffb0: 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f  ffset = (LONG)(o
ffc0: 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
ffd0: 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65  ff);.  overlappe
ffe0: 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28  d.OffsetHigh = (
fff0: 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33  LONG)((offset>>3
10000 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
10010 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65  ;.  while( !osRe
10020 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  adFile(pFile->h,
10030 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65   pBuf, amt, &nRe
10040 61 64 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29  ad, &overlapped)
10050 20 26 26 0a 20 20 20 20 20 20 20 20 20 6f 73 47   &&.         osG
10060 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 45  etLastError()!=E
10070 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f 46 20  RROR_HANDLE_EOF 
10080 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 44 57  ){.#endif.    DW
10090 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
100a0 20 20 20 69 66 28 20 72 65 74 72 79 49 6f 65 72     if( retryIoer
100b0 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74  r(&nRetry, &last
100c0 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75  Errno) ) continu
100d0 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e;.    pFile->la
100e0 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
100f0 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rno;.    return 
10100 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
10110 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 70  TE_IOERR_READ, p
10120 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
10130 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77  .             "w
10140 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e  inRead", pFile->
10150 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 6c 6f  zPath);.  }.  lo
10160 67 49 6f 65 72 72 28 6e 52 65 74 72 79 29 3b 0a  gIoerr(nRetry);.
10170 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f    if( nRead<(DWO
10180 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a  RD)amt ){.    /*
10190 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66   Unread parts of
101a0 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74   the buffer must
101b0 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20   be zero-filled 
101c0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28  */.    memset(&(
101d0 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65  (char*)pBuf)[nRe
101e0 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61  ad], 0, amt-nRea
101f0 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  d);.    return S
10200 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
10210 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 72  T_READ;.  }..  r
10220 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10230 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
10240 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
10250 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  er into a file. 
10260 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
10270 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20  K on success.** 
10280 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72  or some other er
10290 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c  ror code on fail
102a0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
102b0 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73  nt winWrite(.  s
102c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
102e0 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20  * File to write 
102f0 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  into */.  const 
10300 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
10310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10320 20 62 79 74 65 73 20 74 6f 20 62 65 20 77 72 69   bytes to be wri
10330 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d  tten */.  int am
10340 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
10350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10360 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
10370 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  write */.  sqlit
10380 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20  e3_int64 offset 
10390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
103a0 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69  fset into the fi
103b0 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74  le to begin writ
103c0 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69  ing at */.){.  i
103d0 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
103e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
103f0 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f 72 20  * True if error 
10400 68 61 73 20 6f 63 63 75 72 65 64 2c 20 65 6c 73  has occured, els
10410 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e  e false */.  win
10420 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
10430 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20  inFile*)id;  /* 
10440 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  File handle */. 
10450 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b   int nRetry = 0;
10460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10470 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
10480 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  tries */..  asse
10490 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61  rt( amt>0 );.  a
104a0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
104b0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
104c0 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
104d0 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20  IOERR_WRITE);.  
104e0 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
104f0 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
10500 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53  ITE_FULL);..  OS
10510 54 52 41 43 45 28 28 22 57 52 49 54 45 20 25 64  TRACE(("WRITE %d
10520 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69   lock=%d\n", pFi
10530 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
10540 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53  cktype));..#if S
10550 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
10560 20 72 63 20 3d 20 73 65 65 6b 57 69 6e 46 69 6c   rc = seekWinFil
10570 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29  e(pFile, offset)
10580 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
10590 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e 64 69  .#else.  {.#endi
105a0 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  f.#if !SQLITE_OS
105b0 5f 57 49 4e 43 45 0a 20 20 20 20 4f 56 45 52 4c  _WINCE.    OVERL
105c0 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64  APPED overlapped
105d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
105e0 6f 66 66 73 65 74 20 66 6f 72 20 57 72 69 74 65  offset for Write
105f0 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  File. */.#endif.
10600 20 20 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28      u8 *aRem = (
10610 75 38 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20  u8 *)pBuf;      
10620 20 20 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f    /* Data yet to
10630 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
10640 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d     int nRem = am
10650 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
10660 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
10670 74 65 73 20 79 65 74 20 74 6f 20 62 65 20 77 72  tes yet to be wr
10680 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f  itten */.    DWO
10690 52 44 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  RD nWrite;      
106a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
106b0 74 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 65  tes written by e
106c0 61 63 68 20 57 72 69 74 65 46 69 6c 65 28 29 20  ach WriteFile() 
106d0 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52  call */.    DWOR
106e0 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  D lastErrno = NO
106f0 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c  _ERROR;   /* Val
10700 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47  ue returned by G
10710 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f  etLastError() */
10720 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
10730 5f 57 49 4e 43 45 0a 20 20 20 20 6d 65 6d 73 65  _WINCE.    memse
10740 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30  t(&overlapped, 0
10750 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50  , sizeof(OVERLAP
10760 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 65 72 6c  PED));.    overl
10770 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
10780 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30  LONG)(offset & 0
10790 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20  xffffffff);.    
107a0 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
107b0 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28  tHigh = (LONG)((
107c0 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  offset>>32) & 0x
107d0 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69  7fffffff);.#endi
107e0 66 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 52  f..    while( nR
107f0 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51 4c 49  em>0 ){.#if SQLI
10800 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
10810 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69    if( !osWriteFi
10820 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65  le(pFile->h, aRe
10830 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65  m, nRem, &nWrite
10840 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20  , 0) ){.#else.  
10850 20 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65      if( !osWrite
10860 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61  File(pFile->h, a
10870 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69  Rem, nRem, &nWri
10880 74 65 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29  te, &overlapped)
10890 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   ){.#endif.     
108a0 20 20 20 69 66 28 20 72 65 74 72 79 49 6f 65 72     if( retryIoer
108b0 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74  r(&nRetry, &last
108c0 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75  Errno) ) continu
108d0 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
108e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
108f0 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d  assert( nWrite==
10900 30 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57  0 || nWrite<=(DW
10910 4f 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20  ORD)nRem );.    
10920 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d 30 20    if( nWrite==0 
10930 7c 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f 52 44  || nWrite>(DWORD
10940 29 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20  )nRem ){.       
10950 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
10960 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
10970 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10980 20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54      }.#if !SQLIT
10990 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 20  E_OS_WINCE.     
109a0 20 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72 69 74   offset += nWrit
109b0 65 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70  e;.      overlap
109c0 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f  ped.Offset = (LO
109d0 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66  NG)(offset & 0xf
109e0 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20  fffffff);.      
109f0 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
10a00 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28  tHigh = (LONG)((
10a10 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  offset>>32) & 0x
10a20 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69  7fffffff);.#endi
10a30 66 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d 20  f.      aRem += 
10a40 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e 52  nWrite;.      nR
10a50 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20  em -= nWrite;.  
10a60 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d    }.    if( nRem
10a70 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  >0 ){.      pFil
10a80 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
10a90 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
10aa0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
10ab0 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  }..  if( rc ){. 
10ac0 20 20 20 69 66 28 20 20 20 28 20 70 46 69 6c 65     if(   ( pFile
10ad0 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ->lastErrno==ERR
10ae0 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46  OR_HANDLE_DISK_F
10af0 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c 20  ULL ).       || 
10b00 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
10b10 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46  no==ERROR_DISK_F
10b20 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 72 65  ULL )){.      re
10b30 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
10b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
10b50 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
10b60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
10b70 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  E, pFile->lastEr
10b80 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
10b90 20 20 22 77 69 6e 57 72 69 74 65 22 2c 20 70 46    "winWrite", pF
10ba0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
10bb0 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65  else{.    logIoe
10bc0 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 7d 0a  rr(nRetry);.  }.
10bd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10be0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  OK;.}../*.** Tru
10bf0 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
10c00 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
10c10 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
10c20 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65   int winTruncate
10c30 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
10c40 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  d, sqlite3_int64
10c50 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69   nByte){.  winFi
10c60 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
10c70 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69  File*)id;  /* Fi
10c80 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74  le handle object
10c90 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
10ca0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
10cb0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
10cc0 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66 75  code for this fu
10cd0 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73  nction */..  ass
10ce0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
10cf0 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43   OSTRACE(("TRUNC
10d00 41 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20  ATE %d %lld\n", 
10d10 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29  pFile->h, nByte)
10d20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
10d30 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
10d40 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
10d50 45 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  E);..  /* If the
10d60 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
10d70 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
10d80 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
10d90 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
10da0 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  ** file so that 
10db0 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  it consists of a
10dc0 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
10dd0 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e   of chunks (i.e.
10de0 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
10df0 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72   file size after
10e00 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
10e10 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ay be larger tha
10e20 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  n the requested.
10e30 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f    ** size)..  */
10e40 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
10e50 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e  Chunk>0 ){.    n
10e60 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b  Byte = ((nByte +
10e70 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
10e80 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68  - 1)/pFile->szCh
10e90 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
10ea0 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Chunk;.  }..  /*
10eb0 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20   SetEndOfFile() 
10ec0 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
10ed0 20 77 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c   when successful
10ee0 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69  , or zero when i
10ef0 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66  t fails. */.  if
10f00 28 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46  ( seekWinFile(pF
10f10 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ile, nByte) ){. 
10f20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
10f30 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
10f40 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65  _TRUNCATE, pFile
10f50 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
10f60 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72            "winTr
10f70 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d  uncate1", pFile-
10f80 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65  >zPath);.  }else
10f90 20 69 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64   if( 0==osSetEnd
10fa0 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29  OfFile(pFile->h)
10fb0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
10fc0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
10fd0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
10fe0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
10ff0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
11000 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e  RUNCATE, pFile->
11010 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
11020 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e          "winTrun
11030 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a  cate2", pFile->z
11040 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 4f 53  Path);.  }..  OS
11050 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45  TRACE(("TRUNCATE
11060 20 25 64 20 25 6c 6c 64 20 25 73 5c 6e 22 2c 20   %d %lld %s\n", 
11070 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c  pFile->h, nByte,
11080 20 72 63 20 3f 20 22 66 61 69 6c 65 64 22 20 3a   rc ? "failed" :
11090 20 22 6f 6b 22 29 29 3b 0a 20 20 72 65 74 75 72   "ok"));.  retur
110a0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
110b0 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
110c0 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
110d0 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20  er of fullsyncs 
110e0 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73  and normal syncs
110f0 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
11100 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20  to test.** that 
11110 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79  syncs and fullsy
11120 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67  ncs are occuring
11130 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
11140 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
11150 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
11160 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
11170 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
11180 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
11190 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
111a0 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74  writes to a part
111b0 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20  icular file are 
111c0 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73  committed to dis
111d0 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
111e0 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33   winSync(sqlite3
111f0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
11200 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53  lags){.#ifndef S
11210 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
11220 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c  /*.  ** Used onl
11230 79 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f  y when SQLITE_NO
11240 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66  _SYNC is not def
11250 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f  ined..   */.  BO
11260 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69  OL rc;.#endif.#i
11270 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
11280 47 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  G) || !defined(S
11290 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c  QLITE_NO_SYNC) |
112a0 7c 20 5c 0a 20 20 20 20 28 64 65 66 69 6e 65 64  | \.    (defined
112b0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
112c0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
112d0 44 45 42 55 47 29 29 0a 20 20 2f 2a 0a 20 20 2a  DEBUG)).  /*.  *
112e0 2a 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49  * Used when SQLI
112f0 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f  TE_NO_SYNC is no
11300 74 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79  t defined and by
11310 20 74 68 65 20 61 73 73 65 72 74 28 29 20 61 6e   the assert() an
11320 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43  d/or.  ** OSTRAC
11330 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a  E() macros..   *
11340 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
11350 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
11360 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  d;.#else.  UNUSE
11370 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b  D_PARAMETER(id);
11380 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
11390 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a  t( pFile );.  /*
113a0 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20   Check that one 
113b0 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  of SQLITE_SYNC_N
113c0 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61  ORMAL or FULL wa
113d0 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73  s passed */.  as
113e0 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46  sert((flags&0x0F
113f0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  )==SQLITE_SYNC_N
11400 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28  ORMAL.      || (
11410 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
11420 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20  ITE_SYNC_FULL.  
11430 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
11440 53 59 4e 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c  SYNC %d lock=%d\
11450 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46  n", pFile->h, pF
11460 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
11470 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
11480 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
11490 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
114a0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
114b0 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
114c0 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
114d0 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
114e0 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
114f0 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
11500 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
11510 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
11520 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
11530 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11540 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41  TEST.  UNUSED_PA
11550 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a  RAMETER(flags);.
11560 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61  #else.  if( (fla
11570 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
11580 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20  _SYNC_FULL ){.  
11590 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79    sqlite3_fullsy
115a0 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a  nc_count++;.  }.
115b0 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
115c0 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
115d0 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
115e0 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
115f0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
11600 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
11610 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20  s a.  ** no-op. 
11620 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
11630 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 65 74 75  E_NO_SYNC.  retu
11640 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
11650 6c 73 65 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75  lse.  rc = osFlu
11660 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70 46  shFileBuffers(pF
11670 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c  ile->h);.  Simul
11680 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 46  ateIOError( rc=F
11690 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72 63  ALSE );.  if( rc
116a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
116b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
116c0 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
116d0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
116e0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
116f0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
11700 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
11710 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61  FSYNC, pFile->la
11720 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
11730 20 20 20 20 20 20 22 77 69 6e 53 79 6e 63 22 2c        "winSync",
11740 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
11750 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
11760 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
11770 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
11780 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
11790 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
117a0 77 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  winFileSize(sqli
117b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71  te3_file *id, sq
117c0 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69  lite3_int64 *pSi
117d0 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ze){.  winFile *
117e0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
117f0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
11800 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
11810 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
11820 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
11830 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
11840 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 23 69  IOERR_FSTAT);.#i
11850 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
11860 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53  T.  {.    FILE_S
11870 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66  TANDARD_INFO inf
11880 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  o;.    if( osGet
11890 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
118a0 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d  yHandleEx(pFile-
118b0 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72 64  >h, FileStandard
118c0 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  Info,.          
118d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
118e0 20 20 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f             &info
118f0 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20  , sizeof(info)) 
11900 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  ){.      *pSize 
11910 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65  = info.EndOfFile
11920 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20 7d  .QuadPart;.    }
11930 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
11940 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
11950 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
11960 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
11970 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
11980 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c  OERR_FSTAT, pFil
11990 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
119a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119b0 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a       "winFileSiz
119c0 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
119d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
119e0 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44  se.  {.    DWORD
119f0 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20 20   upperBits;.    
11a00 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b  DWORD lowerBits;
11a10 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
11a20 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72  rrno;..    lower
11a30 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c 65  Bits = osGetFile
11a40 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Size(pFile->h, &
11a50 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20 20  upperBits);.    
11a60 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69  *pSize = (((sqli
11a70 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42  te3_int64)upperB
11a80 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65  its)<<32) + lowe
11a90 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20 20  rBits;.    if(  
11aa0 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49   (lowerBits == I
11ab0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45  NVALID_FILE_SIZE
11ac0 29 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c 61  ).       && ((la
11ad0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
11ae0 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f  astError())!=NO_
11af0 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20 20  ERROR) ){.      
11b00 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11b10 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
11b20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
11b30 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
11b40 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e  R_FSTAT, pFile->
11b50 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
11b60 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65          "winFile
11b70 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Size", pFile->zP
11b80 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ath);.    }.  }.
11b90 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
11ba0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43  rc;.}../*.** LOC
11bb0 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
11bc0 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69  IATELY is undefi
11bd0 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64  ned on some Wind
11be0 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  ows systems..*/.
11bf0 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45  #ifndef LOCKFILE
11c00 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
11c10 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46  Y.# define LOCKF
11c20 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
11c30 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23  TELY 1.#endif..#
11c40 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
11c50 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23  EXCLUSIVE_LOCK.#
11c60 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45   define LOCKFILE
11c70 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  _EXCLUSIVE_LOCK 
11c80 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  2.#endif../*.** 
11c90 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51  Historically, SQ
11ca0 4c 69 74 65 20 68 61 73 20 75 73 65 64 20 62 6f  Lite has used bo
11cb0 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20  th the LockFile 
11cc0 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66  and LockFileEx f
11cd0 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65  unctions..** Whe
11ce0 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66  n the LockFile f
11cf0 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64  unction was used
11d00 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79 73 20  , it was always 
11d10 65 78 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c  expected to fail
11d20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
11d30 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c  if the lock coul
11d40 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  d not be obtaine
11d50 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77  d.  Also, it alw
11d60 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a  ays expected to.
11d70 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63  ** obtain an exc
11d80 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68  lusive lock.  Th
11d90 65 73 65 20 66 6c 61 67 73 20 61 72 65 20 75 73  ese flags are us
11da0 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b  ed with the Lock
11db0 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a  FileEx function.
11dc0 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74  ** and reflect t
11dd0 68 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e  hose expectation
11de0 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68  s; therefore, th
11df0 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ey should not be
11e00 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66   changed..*/.#if
11e10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ndef SQLITE_LOCK
11e20 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66  FILE_FLAGS.# def
11e30 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  ine SQLITE_LOCKF
11e40 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43  ILE_FLAGS   (LOC
11e50 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
11e60 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20  IATELY | \.     
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43               LOC
11e90 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
11ea0 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  LOCK).#endif../*
11eb0 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53  .** Currently, S
11ec0 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c  QLite never call
11ed0 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  s the LockFileEx
11ee0 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75   function withou
11ef0 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a  t wanting the.**
11f00 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d   call to fail im
11f10 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65  mediately if the
11f20 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
11f30 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66  obtained..*/.#if
11f40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ndef SQLITE_LOCK
11f50 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64  FILEEX_FLAGS.# d
11f60 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43  efine SQLITE_LOC
11f70 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c  KFILEEX_FLAGS (L
11f80 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
11f90 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66  EDIATELY).#endif
11fa0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
11fb0 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a  a reader lock..*
11fc0 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20  * Different API 
11fd0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c  routines are cal
11fe0 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  led depending on
11ff0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
12000 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78  this.** is Win9x
12010 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74   or WinNT..*/.st
12020 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61 64  atic int getRead
12030 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
12040 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  ile){.  int res;
12050 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
12060 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
12070 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20 20 20 20  INCE.    /*.    
12080 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73  ** NOTE: Windows
12090 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64   CE is handled d
120a0 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20  ifferently here 
120b0 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20  due its lack of 
120c0 74 68 65 20 57 69 6e 33 32 0a 20 20 20 20 2a 2a  the Win32.    **
120d0 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46         API LockF
120e0 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  ileEx..    */.  
120f0 20 20 72 65 73 20 3d 20 77 69 6e 63 65 4c 6f 63    res = winceLoc
12100 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
12110 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
12120 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20  , 1, 0);.#else. 
12130 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b     res = winLock
12140 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
12150 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
12160 58 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f  X_FLAGS, SHARED_
12170 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20  FIRST, 0,.      
12180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12190 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
121a0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64  .#endif.  }.#ifd
121b0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
121c0 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
121d0 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20  .    int lk;.   
121e0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
121f0 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20  ess(sizeof(lk), 
12200 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  &lk);.    pFile-
12210 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20  >sharedLockByte 
12220 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b 20 26 20  = (short)((lk & 
12230 30 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41  0x7fffffff)%(SHA
12240 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a  RED_SIZE - 1));.
12250 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
12260 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
12270 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
12280 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20  _FLAGS,.        
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
122a0 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65  ARED_FIRST+pFile
122b0 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
122c0 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
122d0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73  #endif.  if( res
122e0 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69   == 0 ){.    pFi
122f0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
12300 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
12310 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64  ;.    /* No need
12320 20 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75 72   to log a failur
12330 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  e to lock */.  }
12340 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
12350 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72  ../*.** Undo a r
12360 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69  eadlock.*/.stati
12370 63 20 69 6e 74 20 75 6e 6c 6f 63 6b 52 65 61 64  c int unlockRead
12380 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
12390 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  ile){.  int res;
123a0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
123b0 6e 6f 3b 0a 20 20 69 66 28 20 69 73 4e 54 28 29  no;.  if( isNT()
123c0 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   ){.    res = wi
123d0 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
123e0 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
123f0 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
12400 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66  IZE, 0);.  }.#if
12410 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
12420 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
12430 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  {.    res = winU
12440 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
12450 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
12460 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
12470 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
12480 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
12490 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28  if( res==0 && ((
124a0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
124b0 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45  tLastError())!=E
124c0 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29  RROR_NOT_LOCKED)
124d0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
124e0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
124f0 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
12500 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
12510 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65  RR_UNLOCK, pFile
12520 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
12530 20 20 20 20 20 20 20 20 20 20 22 75 6e 6c 6f 63            "unloc
12540 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c  kReadLock", pFil
12550 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  e->zPath);.  }. 
12560 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
12570 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
12580 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
12590 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
125a0 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
125b0 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
125c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
125d0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
125e0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
125f0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
12600 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
12610 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
12620 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
12630 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
12640 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
12650 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
12660 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
12670 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
12680 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
12690 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
126a0 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
126b0 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
126c0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
126d0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
126e0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
126f0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
12700 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
12710 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
12720 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
12730 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
12740 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
12750 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
12760 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
12770 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
12780 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
12790 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
127a0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
127b0 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
127c0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
127d0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
127e0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
127f0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
12800 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
12810 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
12820 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
12830 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
12840 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
12850 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29   The winUnlock()
12860 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73   routine.** eras
12870 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20  es all locks at 
12880 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73  once and returns
12890 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   us immediately 
128a0 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
128b0 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74   0..** It is not
128c0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77   possible to low
128d0 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
128e0 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74  evel one step at
128f0 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a   a time.  You.**
12900 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68   must go straigh
12910 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  t to locking lev
12920 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  el 0..*/.static 
12930 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69  int winLock(sqli
12940 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
12950 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
12960 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12970 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  K;    /* Return 
12980 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75  code from subrou
12990 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tines */.  int r
129a0 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
129b0 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61    /* Result of a
129c0 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61   Windows lock ca
129d0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c  ll */.  int newL
129e0 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f  ocktype;       /
129f0 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63  * Set pFile->loc
12a00 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61  ktype to this va
12a10 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69  lue before exiti
12a20 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50  ng */.  int gotP
12a30 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f  endingLock = 0;/
12a40 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71  * True if we acq
12a50 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20  uired a PENDING 
12a60 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a  lock this time *
12a70 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
12a80 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
12a90 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  d;.  DWORD lastE
12aa0 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
12ab0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
12ac0 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
12ad0 22 4c 4f 43 4b 20 25 64 20 25 64 20 77 61 73 20  "LOCK %d %d was 
12ae0 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20  %d(%d)\n",.     
12af0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
12b00 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
12b10 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65  >locktype, pFile
12b20 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
12b30 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
12b40 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
12b50 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
12b60 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
12b70 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
12b80 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  * OsFile, do not
12b90 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
12ba0 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
12bb0 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
12bc0 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
12bd0 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
12be0 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
12bf0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
12c00 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74  >locktype>=lockt
12c10 79 70 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ype ){.    retur
12c20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12c30 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
12c40 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
12c50 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
12c60 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
12c70 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
12c80 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b  =NO_LOCK || lock
12c90 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
12ca0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
12cb0 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47  ocktype!=PENDING
12cc0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
12cd0 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53  t( locktype!=RES
12ce0 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
12cf0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
12d00 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
12d10 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e   /* Lock the PEN
12d20 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69  DING_LOCK byte i
12d30 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71  f we need to acq
12d40 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
12d50 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48  ock or.  ** a SH
12d60 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77  ARED lock.  If w
12d70 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20  e are acquiring 
12d80 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
12d90 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f  he acquisition o
12da0 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49  f.  ** the PENDI
12db0 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20  NG_LOCK byte is 
12dc0 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a  temporary..  */.
12dd0 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
12de0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
12df0 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c 65 2d  .  if(   (pFile-
12e00 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f  >locktype==NO_LO
12e10 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20 20 20  CK).     || (   
12e20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55  (locktype==EXCLU
12e30 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 20  SIVE_LOCK).     
12e40 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d 3e 6c      && (pFile->l
12e50 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
12e60 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
12e70 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20    int cnt = 3;. 
12e80 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e     while( cnt-->
12e90 30 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e 4c  0 && (res = winL
12ea0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
12eb0 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
12ec0 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20  LE_FLAGS,.      
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ef0 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c     PENDING_BYTE,
12f00 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b   0, 1, 0))==0 ){
12f10 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20  .      /* Try 3 
12f20 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65  times to get the
12f30 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20   pending lock.  
12f40 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 74  This is needed t
12f50 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20  o work.      ** 
12f60 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20  around problems 
12f70 63 61 75 73 65 64 20 62 79 20 69 6e 64 65 78 69  caused by indexi
12f80 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76  ng and/or anti-v
12f90 69 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e  irus software on
12fa0 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77  .      ** Window
12fb0 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20  s systems..     
12fc0 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75   ** If you are u
12fd0 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61  sing this code a
12fe0 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c  s a model for al
12ff0 74 65 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c  ternative VFSes,
13000 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a   do not.      **
13010 20 63 6f 70 79 20 74 68 69 73 20 72 65 74 72 79   copy this retry
13020 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61   logic.  It is a
13030 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66   hack intended f
13040 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e  or Windows only.
13050 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13060 4f 53 54 52 41 43 45 28 28 22 63 6f 75 6c 64 20  OSTRACE(("could 
13070 6e 6f 74 20 67 65 74 20 61 20 50 45 4e 44 49 4e  not get a PENDIN
13080 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e  G lock. cnt=%d\n
13090 22 2c 20 63 6e 74 29 29 3b 0a 20 20 20 20 20 20  ", cnt));.      
130a0 69 66 28 20 63 6e 74 20 29 20 73 71 6c 69 74 65  if( cnt ) sqlite
130b0 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 29  3_win32_sleep(1)
130c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 50  ;.    }.    gotP
130d0 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65 73  endingLock = res
130e0 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20 29  ;.    if( !res )
130f0 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
13100 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
13110 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
13120 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
13130 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f  shared lock.  */
13140 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
13150 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
13160 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
13170 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
13180 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20  pe==NO_LOCK );. 
13190 20 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64     res = getRead
131a0 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
131b0 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
131c0 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
131d0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
131e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
131f0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
13200 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
13210 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  }.  }..  /* Acqu
13220 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
13230 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
13240 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45  ocktype==RESERVE
13250 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  D_LOCK && res ){
13260 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
13270 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
13280 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
13290 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
132a0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
132b0 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
132c0 41 47 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59  AGS, RESERVED_BY
132d0 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
132e0 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
132f0 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
13300 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a   RESERVED_LOCK;.
13310 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13320 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
13330 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
13340 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
13350 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47  cquire a PENDING
13360 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
13370 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
13380 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73  SIVE_LOCK && res
13390 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74   ){.    newLockt
133a0 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ype = PENDING_LO
133b0 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69  CK;.    gotPendi
133c0 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a  ngLock = 0;.  }.
133d0 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e  .  /* Acquire an
133e0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a   EXCLUSIVE lock.
133f0 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
13400 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
13410 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
13420 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
13430 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45  >locktype>=SHARE
13440 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  D_LOCK );.    re
13450 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f  s = unlockReadLo
13460 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 4f  ck(pFile);.    O
13470 53 54 52 41 43 45 28 28 22 75 6e 72 65 61 64 6c  STRACE(("unreadl
13480 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73  ock = %d\n", res
13490 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  ));.    res = wi
134a0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
134b0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
134c0 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52  FILE_FLAGS, SHAR
134d0 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20  ED_FIRST, 0,.   
134e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
134f0 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
13500 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
13510 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
13520 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45  type = EXCLUSIVE
13530 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
13540 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
13550 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
13560 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  or();.      OSTR
13570 41 43 45 28 28 22 65 72 72 6f 72 2d 63 6f 64 65  ACE(("error-code
13580 20 3d 20 25 64 5c 6e 22 2c 20 6c 61 73 74 45 72   = %d\n", lastEr
13590 72 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 65 74  rno));.      get
135a0 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
135b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
135c0 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69   If we are holdi
135d0 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  ng a PENDING loc
135e0 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20  k that ought to 
135f0 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65  be released, the
13600 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69  n.  ** release i
13610 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  t now..  */.  if
13620 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b  ( gotPendingLock
13630 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   && locktype==SH
13640 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
13650 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
13660 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e  pFile->h, PENDIN
13670 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
13680 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  ;.  }..  /* Upda
13690 74 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  te the state of 
136a0 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c  the lock has hel
136b0 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65  d in the file de
136c0 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20  scriptor then.  
136d0 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 70  ** return the ap
136e0 70 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74  propriate result
136f0 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   code..  */.  if
13700 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20  ( res ){.    rc 
13710 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
13720 65 6c 73 65 7b 0a 20 20 20 20 4f 53 54 52 41 43  else{.    OSTRAC
13730 45 28 28 22 4c 4f 43 4b 20 46 41 49 4c 45 44 20  E(("LOCK FAILED 
13740 25 64 20 74 72 79 69 6e 67 20 66 6f 72 20 25 64  %d trying for %d
13750 20 62 75 74 20 67 6f 74 20 25 64 5c 6e 22 2c 20   but got %d\n", 
13760 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
13770 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 2c 20 6e       locktype, n
13780 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  ewLocktype));.  
13790 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
137a0 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
137b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
137c0 42 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  BUSY;.  }.  pFil
137d0 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75  e->locktype = (u
137e0 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20  8)newLocktype;. 
137f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13800 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13810 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
13820 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
13830 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
13840 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
13850 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
13860 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
13870 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
13880 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
13890 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68  ** non-zero, oth
138a0 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a  erwise zero..*/.
138b0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68  static int winCh
138c0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
138d0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
138e0 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
138f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69 6e  .  int rc;.  win
13900 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
13910 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  inFile*)id;..  S
13920 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
13930 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
13940 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
13950 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73  DLOCK; );..  ass
13960 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
13970 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
13980 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
13990 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 31  CK ){.    rc = 1
139a0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
139b0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
139c0 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70  %d (local)\n", p
139d0 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a 20  File->h, rc));. 
139e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
139f0 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
13a00 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
13a10 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52  OCKFILE_FLAGS, R
13a20 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c  ESERVED_BYTE, 0,
13a30 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   1, 0);.    if( 
13a40 72 63 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55  rc ){.      winU
13a50 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
13a60 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
13a70 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
13a80 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 21 72 63    }.    rc = !rc
13a90 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
13aa0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
13ab0 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20  %d (remote)\n", 
13ac0 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a  pFile->h, rc));.
13ad0 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
13ae0 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 53 51   rc;.  return SQ
13af0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13b00 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
13b10 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
13b20 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20  e descriptor id 
13b30 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
13b40 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
13b50 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
13b60 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
13b70 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
13b80 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
13b90 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
13ba0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
13bb0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
13bc0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
13bd0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
13be0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
13bf0 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e  p..**.** It is n
13c00 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
13c10 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
13c20 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f  fail if the seco
13c30 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
13c40 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74  s NO_LOCK.  If t
13c50 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
13c60 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43  nt is SHARED_LOC
13c70 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K then this rout
13c80 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74  ine.** might ret
13c90 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13ca0 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.*/.static int 
13cb0 77 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  winUnlock(sqlite
13cc0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13cd0 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74  locktype){.  int
13ce0 20 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65   type;.  winFile
13cf0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
13d00 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
13d10 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
13d20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
13d30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
13d40 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c  cktype<=SHARED_L
13d50 4f 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  OCK );.  OSTRACE
13d60 28 28 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20  (("UNLOCK %d to 
13d70 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22  %d was %d(%d)\n"
13d80 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
13d90 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20  type,.          
13da0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
13db0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
13dc0 63 6b 42 79 74 65 29 29 3b 0a 20 20 74 79 70 65  ckByte));.  type
13dd0 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
13de0 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d  pe;.  if( type>=
13df0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
13e00 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
13e10 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
13e20 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
13e30 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
13e40 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
13e50 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
13e60 26 20 21 67 65 74 52 65 61 64 4c 6f 63 6b 28 70  & !getReadLock(p
13e70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  File) ){.      /
13e80 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
13e90 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20  ver happen.  We 
13ea0 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
13eb0 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a   able to.      *
13ec0 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  * reacquire the 
13ed0 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read lock */.   
13ee0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
13ef0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
13f00 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61  _UNLOCK, osGetLa
13f10 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
13f20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e            "winUn
13f30 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  lock", pFile->zP
13f40 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ath);.    }.  }.
13f50 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45    if( type>=RESE
13f60 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
13f70 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
13f80 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
13f90 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
13fa0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 63  );.  }.  if( loc
13fb0 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26  ktype==NO_LOCK &
13fc0 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c  & type>=SHARED_L
13fd0 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  OCK ){.    unloc
13fe0 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  kReadLock(pFile)
13ff0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65  ;.  }.  if( type
14000 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  >=PENDING_LOCK )
14010 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
14020 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50  ile(&pFile->h, P
14030 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20  ENDING_BYTE, 0, 
14040 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69  1, 0);.  }.  pFi
14050 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28  le->locktype = (
14060 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72  u8)locktype;.  r
14070 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14080 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69  ** If *pArg is i
14090 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67 61 74  nititially negat
140a0 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73  ive then this is
140b0 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a   a query.  Set *
140c0 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20  pArg to.** 1 or 
140d0 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  0 depending on w
140e0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69  hether or not bi
140f0 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d  t mask of pFile-
14100 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65  >ctrlFlags is se
14110 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  t..**.** If *pAr
14120 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65  g is 0 or 1, the
14130 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74  n clear or set t
14140 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70  he mask bit of p
14150 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e  File->ctrlFlags.
14160 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14170 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46 69  winModeBit(winFi
14180 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67  le *pFile, unsig
14190 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69  ned char mask, i
141a0 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28  nt *pArg){.  if(
141b0 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20   *pArg<0 ){.    
141c0 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e  *pArg = (pFile->
141d0 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b  ctrlFlags & mask
141e0 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  )!=0;.  }else if
141f0 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a  ( (*pArg)==0 ){.
14200 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
14210 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  lags &= ~mask;. 
14220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
14230 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
14240 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  mask;.  }.}../* 
14250 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
14260 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion */.static in
14270 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  t getTempname(in
14280 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
14290 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74  uf);../*.** Cont
142a0 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66  rol and query of
142b0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68   the open file h
142c0 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
142d0 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74   int winFileCont
142e0 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
142f0 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
14300 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e  id *pArg){.  win
14310 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
14320 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77  inFile*)id;.  sw
14330 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
14340 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
14350 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
14360 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
14370 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
14380 70 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  pe;.      return
14390 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
143a0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
143b0 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a  E_LAST_ERRNO: {.
143c0 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
143d0 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e  g = (int)pFile->
143e0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
143f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14400 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
14410 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
14420 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
14430 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
14440 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
14450 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
14460 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
14470 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
14480 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a  FCNTL_SIZE_HINT:
14490 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69   {.      if( pFi
144a0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
144b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
144c0 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20  _int64 oldSz;.  
144d0 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77        int rc = w
144e0 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c 20 26  inFileSize(id, &
144f0 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20 20 20  oldSz);.        
14500 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14510 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
14520 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 65 77  qlite3_int64 new
14530 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69  Sz = *(sqlite3_i
14540 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20  nt64*)pArg;.    
14550 20 20 20 20 20 20 69 66 28 20 6e 65 77 53 7a 3e        if( newSz>
14560 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20 20 20  oldSz ){.       
14570 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
14580 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
14590 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
145a0 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64 2c 20  winTruncate(id, 
145b0 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20 20 20  newSz);.        
145c0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
145d0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
145e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
145f0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
14600 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
14610 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
14620 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
14630 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
14640 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
14650 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42  {.      winModeB
14660 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c  it(pFile, WINFIL
14670 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28  E_PERSIST_WAL, (
14680 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
14690 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
146a0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
146b0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
146c0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
146d0 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e  ITE: {.      win
146e0 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57  ModeBit(pFile, W
146f0 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e  INFILE_PSOW, (in
14700 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
14710 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
14730 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
14740 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
14750 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
14760 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
14770 77 69 6e 33 32 22 29 3b 0a 20 20 20 20 20 20 72  win32");.      r
14780 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14790 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
147a0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e  SQLITE_FCNTL_WIN
147b0 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20  32_AV_RETRY: {. 
147c0 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69       int *a = (i
147d0 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  nt*)pArg;.      
147e0 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20  if( a[0]>0 ){.  
147f0 20 20 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72        win32Ioerr
14800 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20  Retry = a[0];.  
14810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14820 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 33 32 49     a[0] = win32I
14830 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20  oerrRetry;.     
14840 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31   }.      if( a[1
14850 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ]>0 ){.        w
14860 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 44 65  in32IoerrRetryDe
14870 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20  lay = a[1];.    
14880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14890 20 61 5b 31 5d 20 3d 20 77 69 6e 33 32 49 6f 65   a[1] = win32Ioe
148a0 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20  rrRetryDelay;.  
148b0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
148c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
148d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
148e0 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49  ITE_FCNTL_TEMPFI
148f0 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  LENAME: {.      
14900 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73  char *zTFile = s
14910 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70  qlite3_malloc( p
14920 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  File->pVfs->mxPa
14930 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20  thname );.      
14940 69 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20  if( zTFile ){.  
14950 20 20 20 20 20 20 67 65 74 54 65 6d 70 6e 61 6d        getTempnam
14960 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d  e(pFile->pVfs->m
14970 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c  xPathname, zTFil
14980 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28 63 68  e);.        *(ch
14990 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69  ar**)pArg = zTFi
149a0 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  le;.      }.    
149b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
149c0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
149d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
149e0 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TFOUND;.}../*.**
149f0 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
14a00 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or size in bytes
14a10 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
14a20 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20  ng block device 
14a30 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  for.** the speci
14a40 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20  fied file. This 
14a50 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
14a60 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20   512 bytes, but 
14a70 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72  may be.** larger
14a80 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65   for some device
14a90 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
14aa0 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69  code assumes thi
14ab0 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  s function canno
14ac0 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20  t fail. It also 
14ad0 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
14ae0 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65  if two files are
14af0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
14b00 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
14b10 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
14b20 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
14b30 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  nd its journal f
14b40 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
14b50 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
14b60 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
14b70 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
14b80 63 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53  c int winSectorS
14b90 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
14ba0 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69   *id){.  (void)i
14bb0 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
14bc0 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
14bd0 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  R_SIZE;.}../*.**
14be0 20 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72   Return a vector
14bf0 20 6f 66 20 64 65 76 69 63 65 20 63 68 61 72 61   of device chara
14c00 63 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73  cteristics..*/.s
14c10 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76  tatic int winDev
14c20 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
14c30 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
14c40 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  *id){.  winFile 
14c50 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  *p = (winFile*)i
14c60 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
14c70 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
14c80 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c  ABLE_WHEN_OPEN |
14c90 0a 20 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63  .         ((p->c
14ca0 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49  trlFlags & WINFI
14cb0 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f  LE_PSOW)?SQLITE_
14cc0 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
14cd0 4f 56 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a  OVERWRITE:0);.}.
14ce0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14cf0 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 20 0a 2a 2a  OMIT_WAL../* .**
14d00 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e   Windows will on
14d10 6c 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74  ly let you creat
14d20 65 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70  e file view mapp
14d30 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63  ings.** on alloc
14d40 61 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75  ation size granu
14d50 6c 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65  larity boundarie
14d60 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c  s..** During sql
14d70 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
14d80 65 20 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d  e do a GetSystem
14d90 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74  Info().** to get
14da0 20 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79   the granularity
14db0 20 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54 45 4d   size..*/.SYSTEM
14dc0 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f  _INFO winSysInfo
14dd0 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  ;../*.** Helper 
14de0 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
14df0 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
14e00 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
14e10 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
14e20 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
14e30 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
14e40 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65  winLockInfo obje
14e50 63 74 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20  cts used by .** 
14e60 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
14e70 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73  f which may be s
14e80 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c  hared by multipl
14e90 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a  e threads..**.**
14ea0 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d   Function winShm
14eb0 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75  MutexHeld() is u
14ec0 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20  sed to assert() 
14ed0 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20  that the global 
14ee0 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c  mutex .** is hel
14ef0 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e  d when required.
14f00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
14f10 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70  s only used as p
14f20 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
14f30 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  .** statements. 
14f40 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e  e.g..**.**   win
14f50 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  ShmEnterMutex().
14f60 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 77  **     assert( w
14f70 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
14f80 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c   );.**   winShmL
14f90 65 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73  eaveMutex().*/.s
14fa0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68  tatic void winSh
14fb0 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64  mEnterMutex(void
14fc0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
14fd0 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
14fe0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
14ff0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
15000 41 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69  ASTER));.}.stati
15010 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61  c void winShmLea
15020 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  veMutex(void){. 
15030 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
15040 65 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65  eave(sqlite3Mute
15050 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
15060 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
15070 52 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  R));.}.#ifdef SQ
15080 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
15090 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65  c int winShmMute
150a0 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20  xHeld(void) {.  
150b0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
150c0 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65  utex_held(sqlite
150d0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
150e0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
150f0 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64  MASTER));.}.#end
15100 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  if../*.** Object
15110 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
15120 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65  nt a single file
15130 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70   opened and mmap
15140 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a  ped to provide.*
15150 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  * shared memory.
15160 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20    When multiple 
15170 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65  threads all refe
15180 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a  rence the same.*
15190 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65  * log-summary, e
151a0 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20 69  ach thread has i
151b0 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f  ts own winFile o
151c0 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20  bject, but they 
151d0 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  all.** point to 
151e0 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
151f0 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74  e of this object
15200 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
15210 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73  s, each.** log-s
15220 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64  ummary is opened
15230 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70   only once per p
15240 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69  rocess..**.** wi
15250 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
15260 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65  must be true whe
15270 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65  n creating or de
15280 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73  stroying.** this
15290 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65   object or while
152a0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
152b0 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
152c0 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20  g fields:.**.** 
152d0 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20       nRef.**    
152e0 20 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54    pNext .**.** T
152f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
15300 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  lds are read-onl
15310 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65  y after the obje
15320 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a  ct is created:.*
15330 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a  * .**      fid.*
15340 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  *      zFilename
15350 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69  .**.** Either wi
15360 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d  nShmNode.mutex m
15370 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77  ust be held or w
15380 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  inShmNode.nRef==
15390 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d  0 and.** winShmM
153a0 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72  utexHeld() is tr
153b0 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20  ue when reading 
153c0 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f  or writing any o
153d0 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e  ther field.** in
153e0 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e   this structure.
153f0 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69  .**.*/.struct wi
15400 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c  nShmNode {.  sql
15410 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
15420 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78  x;      /* Mutex
15430 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20   to access this 
15440 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
15450 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
15460 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
15470 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
15480 77 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20  winFile hFile;  
15490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
154a0 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77  le handle from w
154b0 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74  inOpen */..  int
154c0 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
154d0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
154e0 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
154f0 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
15500 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  t nRegion;      
15510 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
15520 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
15530 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  on */.  struct S
15540 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48  hmRegion {.    H
15550 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20  ANDLE hMap;     
15560 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
15570 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61  handle from Crea
15580 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f  teFileMapping */
15590 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b  .    void *pMap;
155a0 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20  .  } *aRegion;. 
155b0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
155c0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
155d0 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f  he Windows errno
155e0 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49   from the last I
155f0 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69  /O error */..  i
15600 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
15610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15620 62 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62  ber of winShm ob
15630 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
15640 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53  o this */.  winS
15650 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  hm *pFirst;     
15660 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69         /* All wi
15670 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  nShm objects poi
15680 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
15690 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
156a0 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Next;         /*
156b0 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66   Next in list of
156c0 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20   all winShmNode 
156d0 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 65  objects */.#ifde
156e0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
156f0 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20   u8 nextShmId;  
15700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15710 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69  ext available wi
15720 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f  nShm.id value */
15730 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
15740 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79  * A global array
15750 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f   of all winShmNo
15760 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a  de objects..**.*
15770 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65  * The winShmMute
15780 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
15790 74 72 75 65 20 77 68 69 6c 65 20 72 65 61 64 69  true while readi
157a0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
157b0 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  is list..*/.stat
157c0 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77  ic winShmNode *w
157d0 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20  inShmNodeList = 
157e0 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  0;../*.** Struct
157f0 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61  ure used interna
15800 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20  lly by this VFS 
15810 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74  to record the st
15820 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65  ate of an.** ope
15830 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
15840 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
15850 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
15860 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69  fields are initi
15870 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73  alized when this
15880 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
15890 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65  ed and.** are re
158a0 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74  ad-only thereaft
158b0 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e  er:.**.**    win
158c0 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20  Shm.pShmNode.** 
158d0 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a     winShm.id.**.
158e0 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65  ** All other fie
158f0 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  lds are read/wri
15900 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e  te.  The winShm.
15910 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
15920 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
15930 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20  while accessing 
15940 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66  any read/write f
15950 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  ields..*/.struct
15960 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53   winShm {.  winS
15970 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
15980 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e  ;      /* The un
15990 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e  derlying winShmN
159a0 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ode object */.  
159b0 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20  winShm *pNext;  
159c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
159d0 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74  xt winShm with t
159e0 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f  he same winShmNo
159f0 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75  de */.  u8 hasMu
15a00 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  tex;            
15a10 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f     /* True if ho
15a20 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d  lding the winShm
15a30 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20  Node mutex */.  
15a40 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20  u16 sharedMask; 
15a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
15a60 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
15a70 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36  ks held */.  u16
15a80 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
15a90 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
15aa0 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  of exclusive loc
15ab0 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65  ks held */.#ifde
15ac0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
15ad0 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20   u8 id;         
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
15af0 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63  d of this connec
15b00 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69  tion with its wi
15b10 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64  nShmNode */.#end
15b20 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  if.};../*.** Con
15b30 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20  stants used for 
15b40 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69  locking.*/.#defi
15b50 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20  ne WIN_SHM_BASE 
15b60 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
15b70 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
15b80 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
15b90 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
15ba0 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20   WIN_SHM_DMS    
15bb0 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51  (WIN_SHM_BASE+SQ
15bc0 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20  LITE_SHM_NLOCK) 
15bd0 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74   /* deadman swit
15be0 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ch */../*.** App
15bf0 6c 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ly advisory lock
15c00 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65  s for all n byte
15c10 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f  s beginning at o
15c20 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  fst..*/.#define 
15c30 5f 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64  _SHM_UNLCK  1.#d
15c40 65 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b  efine _SHM_RDLCK
15c50 20 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d    2.#define _SHM
15c60 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63  _WRLCK  3.static
15c70 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65   int winShmSyste
15c80 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e  mLock(.  winShmN
15c90 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f  ode *pFile,    /
15ca0 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f  * Apply locks to
15cb0 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65   this open share
15cc0 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
15cd0 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79   */.  int lockTy
15ce0 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f  pe,         /* _
15cf0 53 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f  SHM_UNLCK, _SHM_
15d00 52 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57  RDLCK, or _SHM_W
15d10 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
15d20 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
15d30 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72  /* Offset to fir
15d40 73 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f  st byte to be lo
15d50 63 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f  cked/unlocked */
15d60 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20  .  int nByte    
15d70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
15d80 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c  er of bytes to l
15d90 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f  ock or unlock */
15da0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
15db0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
15dc0 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
15dd0 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45  Lock/UnlockFileE
15de0 78 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  x() */..  /* Acc
15df0 65 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68  ess to the winSh
15e00 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
15e10 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68  serialized by th
15e20 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73  e caller */.  as
15e30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15e40 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e  tex_held(pFile->
15e50 6d 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d  mutex) || pFile-
15e60 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
15e70 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72  * Release/Acquir
15e80 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  e the system-lev
15e90 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28  el lock */.  if(
15ea0 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f   lockType==_SHM_
15eb0 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20  UNLCK ){.    rc 
15ec0 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28  = winUnlockFile(
15ed0 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c  &pFile->hFile.h,
15ee0 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c   ofst, 0, nByte,
15ef0 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
15f00 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
15f10 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61  the locking para
15f20 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 44 57  meters */.    DW
15f30 4f 52 44 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f  ORD dwFlags = LO
15f40 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
15f50 44 49 41 54 45 4c 59 3b 0a 20 20 20 20 69 66 28  DIATELY;.    if(
15f60 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48   lockType == _SH
15f70 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67  M_WRLCK ) dwFlag
15f80 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58  s |= LOCKFILE_EX
15f90 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20  CLUSIVE_LOCK;.  
15fa0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69    rc = winLockFi
15fb0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65  le(&pFile->hFile
15fc0 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66 73  .h, dwFlags, ofs
15fd0 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b  t, 0, nByte, 0);
15fe0 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
15ff0 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  != 0 ){.    rc =
16000 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
16010 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
16020 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47  lastErrno =  osG
16030 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
16040 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
16050 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  USY;.  }..  OSTR
16060 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25  ACE(("SHM-LOCK %
16070 64 20 25 73 20 25 73 20 30 78 25 30 38 6c 78 5c  d %s %s 0x%08lx\
16080 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
16090 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  pFile->hFile.h,.
160a0 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53             rc==S
160b0 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
160c0 3a 20 22 66 61 69 6c 65 64 22 2c 0a 20 20 20 20  : "failed",.    
160d0 20 20 20 20 20 20 20 6c 6f 63 6b 54 79 70 65 3d         lockType=
160e0 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55  =_SHM_UNLCK ? "U
160f0 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 20 3a 20 22  nlockFileEx" : "
16100 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 0a 20 20 20  LockFileEx",.   
16110 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
16120 61 73 74 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 72  astErrno));..  r
16130 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
16140 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
16150 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64  es to VFS method
16160 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
16170 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  winOpen(sqlite3_
16180 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  vfs*,const char*
16190 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  ,sqlite3_file*,i
161a0 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63  nt,int*);.static
161b0 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73   int winDelete(s
161c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e  qlite3_vfs *,con
161d0 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a  st char*,int);..
161e0 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  /*.** Purge the 
161f0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c  winShmNodeList l
16200 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  ist of all entri
16210 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f  es with winShmNo
16220 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
16230 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
16240 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
16250 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
16260 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
16270 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
16280 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
16290 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
162a0 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
162b0 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66  Purge(sqlite3_vf
162c0 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c  s *pVfs, int del
162d0 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53  eteFlag){.  winS
162e0 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77  hmNode **pp;.  w
162f0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20  inShmNode *p;.  
16300 42 4f 4f 4c 20 62 52 63 3b 0a 20 20 61 73 73 65  BOOL bRc;.  asse
16310 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  rt( winShmMutexH
16320 65 6c 64 28 29 20 29 3b 0a 20 20 70 70 20 3d 20  eld() );.  pp = 
16330 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b  &winShmNodeList;
16340 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a  .  while( (p = *
16350 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pp)!=0 ){.    if
16360 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ( p->nRef==0 ){.
16370 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
16380 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20     if( p->mutex 
16390 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ) sqlite3_mutex_
163a0 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a  free(p->mutex);.
163b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
163c0 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b  <p->nRegion; i++
163d0 29 7b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d  ){.        bRc =
163e0 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   osUnmapViewOfFi
163f0 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
16400 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .pMap);.        
16410 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
16420 52 47 45 20 70 69 64 2d 25 64 20 75 6e 6d 61 70  RGE pid-%d unmap
16430 20 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22   region=%d %s\n"
16440 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16450 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72     (int)osGetCur
16460 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
16470 20 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   i,.            
16480 20 20 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20       bRc ? "ok" 
16490 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
164a0 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c        bRc = osCl
164b0 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65  oseHandle(p->aRe
164c0 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20  gion[i].hMap);. 
164d0 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
164e0 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25  "SHM-PURGE pid-%
164f0 64 20 63 6c 6f 73 65 20 72 65 67 69 6f 6e 3d 25  d close region=%
16500 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
16510 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f            (int)o
16520 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
16530 73 73 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20  ssId(), i,.     
16540 20 20 20 20 20 20 20 20 20 20 20 20 62 52 63 20              bRc 
16550 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
16560 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
16570 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e     if( p->hFile.
16580 68 20 21 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  h != INVALID_HAN
16590 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
165a0 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
165b0 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
165c0 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65 28         winClose(
165d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
165e0 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20  &p->hFile);.    
165f0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
16600 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
16610 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16620 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20 20  deleteFlag ){.  
16630 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16640 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
16650 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
16660 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
16670 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 44  ();.        winD
16680 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a  elete(pVfs, p->z
16690 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  Filename, 0);.  
166a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
166b0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
166c0 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
166d0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
166e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
166f0 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
16700 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
16710 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a  ee(p->aRegion);.
16720 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
16730 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ee(p);.    }else
16740 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70 2d  {.      pp = &p-
16750 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
16760 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  }.}../*.** Open 
16770 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  the shared-memor
16780 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65  y area associate
16790 64 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20  d with database 
167a0 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a  file pDbFd..**.*
167b0 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
167c0 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f   new shared-memo
167d0 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f  ry file, if no o
167e0 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f  ther instances o
167f0 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61  f that.** file a
16800 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  re currently ope
16810 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  n, in this proce
16820 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70  ss or in other p
16830 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a  rocesses, then.*
16840 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20  * the file must 
16850 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
16860 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68  zero length or h
16870 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63  ave its header c
16880 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  leared..*/.stati
16890 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61  c int winOpenSha
168a0 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c  redMemory(winFil
168b0 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72  e *pDbFd){.  str
168c0 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20  uct winShm *p;  
168d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168e0 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
168f0 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  n to be opened *
16900 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  /.  struct winSh
16910 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
16920 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  = 0;   /* The un
16930 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64  derlying mmapped
16940 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72   file */.  int r
16950 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16970 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
16980 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e    struct winShmN
16990 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  ode *pNew;      
169a0 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c       /* Newly al
169b0 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f  located winShmNo
169c0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d  de */.  int nNam
169d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
169e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
169f0 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62  ze of zName in b
16a00 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ytes */..  asser
16a10 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  t( pDbFd->pShm==
16a20 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70  0 );    /* Not p
16a30 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64  reviously opened
16a40 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
16a50 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
16a60 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68 6d   new sqlite3_shm
16a70 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73   object.  Also s
16a80 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a  peculatively.  *
16a90 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * allocate space
16aa0 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53 68   for a new winSh
16ab0 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e 61  mNode and filena
16ac0 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73  me..  */.  p = s
16ad0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
16ae0 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
16af0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
16b00 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
16b10 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65 20  _NOMEM;.  nName 
16b20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
16b30 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  0(pDbFd->zPath);
16b40 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
16b50 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
16b60 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b  eof(*pShmNode) +
16b70 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20   nName + 17 );. 
16b80 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
16b90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
16ba0 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
16bb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
16bc0 45 4d 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  EM;.  }.  pNew->
16bd0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
16be0 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73  r*)&pNew[1];.  s
16bf0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
16c00 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e  nName+15, pNew->
16c10 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73  zFilename, "%s-s
16c20 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
16c30 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c  h);.  sqlite3Fil
16c40 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e  eSuffix3(pDbFd->
16c50 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69  zPath, pNew->zFi
16c60 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a 20  lename); ..  /* 
16c70 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74  Look to see if t
16c80 68 65 72 65 20 69 73 20 61 6e 20 65 78 69 73 74  here is an exist
16c90 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74  ing winShmNode t
16ca0 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e  hat can be used.
16cb0 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63  .  ** If no matc
16cc0 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  hing winShmNode 
16cd0 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
16ce0 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  , create a new o
16cf0 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68  ne..  */.  winSh
16d00 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  mEnterMutex();. 
16d10 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20   for(pShmNode = 
16d20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20  winShmNodeList; 
16d30 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f  pShmNode; pShmNo
16d40 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65  de=pShmNode->pNe
16d50 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20  xt){.    /* TBD 
16d60 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20  need to come up 
16d70 77 69 74 68 20 62 65 74 74 65 72 20 6d 61 74 63  with better matc
16d80 68 20 68 65 72 65 2e 20 20 50 65 72 68 61 70 73  h here.  Perhaps
16d90 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45  .    ** use FILE
16da0 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46  _ID_BOTH_DIR_INF
16db0 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20 20  O Structure..   
16dc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
16dd0 74 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d 4e  te3StrICmp(pShmN
16de0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ode->zFilename, 
16df0 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  pNew->zFilename)
16e00 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ==0 ) break;.  }
16e10 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20  .  if( pShmNode 
16e20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
16e30 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c  ree(pNew);.  }el
16e40 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  se{.    pShmNode
16e50 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65   = pNew;.    pNe
16e60 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e  w = 0;.    ((win
16e70 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65  File*)(&pShmNode
16e80 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49  ->hFile))->h = I
16e90 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
16ea0 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  LUE;.    pShmNod
16eb0 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68  e->pNext = winSh
16ec0 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  mNodeList;.    w
16ed0 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20  inShmNodeList = 
16ee0 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70  pShmNode;..    p
16ef0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d  ShmNode->mutex =
16f00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
16f10 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
16f20 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28  X_FAST);.    if(
16f30 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
16f40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
16f50 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
16f60 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
16f70 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
16f80 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 77     }..    rc = w
16f90 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70 56  inOpen(pDbFd->pV
16fa0 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fs,.            
16fb0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a       pShmNode->z
16fc0 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20  Filename,       
16fd0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
16fe0 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38   the file (UTF-8
16ff0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
17000 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 66        (sqlite3_f
17010 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  ile*)&pShmNode->
17020 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65 20  hFile,  /* File 
17030 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
17040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17050 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
17060 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
17070 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
17080 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 2f 2a  _OPEN_CREATE, /*
17090 20 4d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20   Mode flags */. 
170a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170b0 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  0);.    if( SQLI
170c0 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
170d0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
170e0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
170f0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
17100 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   if another proc
17110 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
17120 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74  he dead-man swit
17130 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f  ch..    ** If no
17140 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  t, truncate the 
17150 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
17160 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  gth. .    */.   
17170 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65   if( winShmSyste
17180 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
17190 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f  _SHM_WRLCK, WIN_
171a0 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c  SHM_DMS, 1)==SQL
171b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
171c0 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
171d0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
171e0 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
171f0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
17200 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17210 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
17220 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
17230 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c  E_IOERR_SHMOPEN,
17240 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
17250 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
17260 20 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22      "winOpenShm"
17270 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
17280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17290 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
172a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69  E_OK ){.      wi
172b0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
172c0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
172d0 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
172e0 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 1);.      rc =
172f0 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
17300 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
17310 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _RDLCK, WIN_SHM_
17320 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  DMS, 1);.    }. 
17330 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
17340 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
17350 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
17360 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
17370 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
17380 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
17390 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
173a0 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53  hmNode;.#ifdef S
173b0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
173c0 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
173d0 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
173e0 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
173f0 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
17400 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e  >pShm = p;.  win
17410 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
17420 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
17430 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
17440 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
17450 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
17460 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
17470 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
17480 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
17490 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
174a0 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
174b0 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
174c0 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63  ct winShm) objec
174d0 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64  t to the pShmNod
174e0 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  e has been set. 
174f0 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  All that is.  **
17500 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74   left to do is t
17510 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f  o link the new o
17520 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c  bject into the l
17530 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
17540 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d  ing.  ** at pShm
17550 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68  Node->pFirst. Th
17560 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  is must be done 
17570 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68  while holding th
17580 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e pShmNode->mute
17590 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20  x .  ** mutex.. 
175a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
175b0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
175c0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d  de->mutex);.  p-
175d0 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64  >pNext = pShmNod
175e0 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68  e->pFirst;.  pSh
175f0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20  mNode->pFirst = 
17600 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  p;.  sqlite3_mut
17610 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
17620 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
17630 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
17640 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f    /* Jump here o
17650 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73  n any error */.s
17660 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77  hm_open_err:.  w
17670 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
17680 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
17690 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  NLCK, WIN_SHM_DM
176a0 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50  S, 1);.  winShmP
176b0 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
176c0 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68  , 0);      /* Th
176d0 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
176e0 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
176f0 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
17700 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  free(p);.  sqlit
17710 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
17720 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
17730 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
17740 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
17750 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
17760 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
17770 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
17780 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61  rlying .** stora
17790 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67  ge if deleteFlag
177a0 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
177b0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e  tic int winShmUn
177c0 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  map(.  sqlite3_f
177d0 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
177e0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
177f0 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
17800 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ory */.  int del
17810 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20  eteFlag         
17820 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66      /* Delete af
17830 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74  ter closing if t
17840 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  rue */.){.  winF
17850 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
17860 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
17870 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lding shared-mem
17880 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ory */.  winShm 
17890 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p;            /
178a0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
178b0 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
178c0 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
178d0 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20  ShmNode; /* The 
178e0 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
178f0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
17900 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20  .  winShm **pp; 
17910 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
17920 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
17930 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
17940 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28   */..  pDbFd = (
17950 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  winFile*)fd;.  p
17960 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
17970 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
17980 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17990 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
179a0 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52  ShmNode;..  /* R
179b0 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
179c0 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
179d0 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
179e0 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
179f0 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
17a00 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
17a10 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
17a20 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
17a30 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
17a40 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
17a50 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
17a60 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
17a70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
17a80 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
17a90 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
17aa0 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
17ab0 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
17ac0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
17ad0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
17ae0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
17af0 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
17b00 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
17b10 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
17b20 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
17b30 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
17b40 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
17b50 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
17b60 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
17b70 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
17b80 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
17b90 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
17ba0 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68  ==0 ){.    winSh
17bb0 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56  mPurge(pDbFd->pV
17bc0 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b  fs, deleteFlag);
17bd0 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61  .  }.  winShmLea
17be0 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
17bf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17c00 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
17c10 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
17c20 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
17c30 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ry segment..*/.s
17c40 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
17c50 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  Lock(.  sqlite3_
17c60 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
17c70 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
17c80 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
17c90 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
17ca0 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17cc0 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61   First lock to a
17cd0 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
17ce0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  e */.  int n,   
17cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
17d10 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20  ocks to acquire 
17d20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
17d30 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
17d40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
17d50 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
17d60 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77  e lock */.){.  w
17d70 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  inFile *pDbFd = 
17d80 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20  (winFile*)fd;   
17d90 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
17da0 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  on holding share
17db0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69  d memory */.  wi
17dc0 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  nShm *p = pDbFd-
17dd0 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  >pShm;          
17de0 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
17df0 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c  d memory being l
17e00 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68  ocked */.  winSh
17e10 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  m *pX;          
17e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e30 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
17e40 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
17e50 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
17e60 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  e *pShmNode = p-
17e70 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  >pShmNode;.  int
17e80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ea0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
17eb0 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b  e */.  u16 mask;
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17ee0 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
17ef0 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   take or release
17f00 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f   */..  assert( o
17f10 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
17f20 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
17f30 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
17f40 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
17f50 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
17f60 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
17f70 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
17f80 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
17f90 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
17fa0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
17fb0 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
17fc0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
17fd0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
17fe0 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
17ff0 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
18000 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
18010 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
18020 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
18030 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
18040 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
18050 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
18060 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20  )!=0 );..  mask 
18070 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66  = (u16)((1U<<(of
18080 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66  st+n)) - (1U<<of
18090 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  st));.  assert( 
180a0 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c  n>1 || mask==(1<
180b0 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69  <ofst) );.  sqli
180c0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
180d0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
180e0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
180f0 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
18100 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  K ){.    u16 all
18110 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73  Mask = 0; /* Mas
18120 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  k of locks held 
18130 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a  by siblings */..
18140 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e      /* See if an
18150 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20  y siblings hold 
18160 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a  this same lock *
18170 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
18180 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
18190 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
181a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  {.      if( pX==
181b0 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
181c0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d      assert( (pX-
181d0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e  >exclMask & (p->
181e0 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72  exclMask|p->shar
181f0 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20  edMask))==0 );. 
18200 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20       allMask |= 
18210 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
18220 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
18230 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d  lock the system-
18240 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  level locks */. 
18250 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61     if( (mask & a
18260 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  llMask)==0 ){.  
18270 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
18280 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
18290 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20  de, _SHM_UNLCK, 
182a0 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
182b0 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
182c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
182d0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
182e0 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
182f0 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
18300 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18310 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
18320 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
18330 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
18340 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
18350 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20  .    } .  }else 
18360 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
18370 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
18380 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
18390 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
183a0 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
183b0 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
183c0 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
183d0 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
183e0 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
183f0 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
18400 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
18410 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
18420 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
18430 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
18440 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
18450 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
18460 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
18470 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
18480 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
18490 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
184a0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
184b0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
184c0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
184d0 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
184e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
184f0 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
18500 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
18510 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
18520 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
18530 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
18540 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
18550 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
18560 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
18570 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
18580 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18590 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
185a0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
185b0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
185c0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
185d0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
185e0 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
185f0 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
18600 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
18610 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18620 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
18630 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
18640 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
18650 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
18660 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18670 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
18680 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
18690 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
186a0 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
186b0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
186c0 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
186d0 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
186e0 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
186f0 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
18700 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
18710 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
18720 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
18730 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
18740 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
18750 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
18760 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
18770 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
18780 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
18790 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
187a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
187b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
187c0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
187d0 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75  /* Get the exclu
187e0 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68  sive locks at th
187f0 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20  e system level. 
18800 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73   Then if success
18810 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ful.    ** also 
18820 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
18830 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
18840 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a  ng locked..    *
18850 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
18860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18870 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
18880 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
18890 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73   _SHM_WRLCK, ofs
188a0 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
188b0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
188c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
188d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
188e0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  p->sharedMask & 
188f0 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  mask)==0 );.    
18900 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
18910 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  |= mask;.      }
18920 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
18930 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
18940 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
18950 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
18960 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64  HM-LOCK shmid-%d
18970 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33  , pid-%d got %03
18980 78 2c 25 30 33 78 20 25 73 5c 6e 22 2c 0a 20 20  x,%03x %s\n",.  
18990 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20           p->id, 
189a0 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e  (int)osGetCurren
189b0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d  tProcessId(), p-
189c0 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
189d0 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20  exclMask,.      
189e0 20 20 20 20 20 72 63 20 3f 20 22 66 61 69 6c 65       rc ? "faile
189f0 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72  d" : "ok"));.  r
18a00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18a10 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d  ** Implement a m
18a20 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72  emory barrier or
18a30 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e   memory fence on
18a40 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
18a50 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64   .**.** All load
18a60 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67  s and stores beg
18a70 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  un before the ba
18a80 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c  rrier must compl
18a90 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ete before.** an
18aa0 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20  y load or store 
18ab0 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20  begun after the 
18ac0 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
18ad0 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61  ic void winShmBa
18ae0 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
18af0 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
18b00 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
18b10 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
18b20 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
18b30 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
18b40 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f  R(fd);.  /* Memo
18b50 72 79 42 61 72 72 69 65 72 28 29 3b 20 2f 2f 20  ryBarrier(); // 
18b60 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d  does not work --
18b70 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79   do not know why
18b80 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d   not */.  winShm
18b90 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
18ba0 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
18bb0 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ();.}../*.** Thi
18bc0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
18bd0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
18be0 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69   pointer to regi
18bf0 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68  on iRegion of th
18c00 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  e .** shared-mem
18c10 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
18c20 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
18c30 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64   file fd. Shared
18c40 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
18c50 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64  .** are numbered
18c60 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a   starting from z
18c70 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64  ero. Each shared
18c80 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69  -memory region i
18c90 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62  s szRegion .** b
18ca0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
18cb0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
18cc0 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
18cd0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
18ce0 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74  d and *pp is set
18cf0 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
18d00 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
18d10 65 20 69 73 57 72 69 74 65 20 70 61 72 61 6d 65  e isWrite parame
18d20 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65  ter is 0 and the
18d30 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
18d40 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69  d-memory.** regi
18d50 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  on has not been 
18d60 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e  allocated (by an
18d70 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64  y client, includ
18d80 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20  ing one running 
18d90 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65  in a.** separate
18da0 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20   process), then 
18db0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
18dc0 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
18dd0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a   returned. If .*
18de0 2a 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e  * isWrite is non
18df0 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65  -zero and the re
18e00 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
18e10 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
18e20 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65   not yet .** bee
18e30 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
18e40 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  is allocated by 
18e50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
18e60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72  *.** If the shar
18e70 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
18e80 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
18e90 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69  n allocated or i
18ea0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
18eb0 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64  * this call as d
18ec0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20  escribed above, 
18ed0 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65  then it is mappe
18ee0 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
18ef0 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73  esses .** addres
18f00 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69  s space (if it i
18f10 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20  s not already), 
18f20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f  *pp is set to po
18f30 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65  int to the mappe
18f40 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64  d .** memory and
18f50 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
18f60 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
18f70 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20  nt winShmMap(.  
18f80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
18f90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18fa0 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f  /* Handle open o
18fb0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
18fc0 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e  */.  int iRegion
18fd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18fe0 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74       /* Region t
18ff0 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20  o retrieve */.  
19000 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20  int szRegion,   
19010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19020 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f  /* Size of regio
19030 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72  ns */.  int isWr
19040 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
19050 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
19060 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69  to extend file i
19070 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
19080 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a   void volatile *
19090 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20  *pp             
190a0 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20   /* OUT: Mapped 
190b0 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77  memory */.){.  w
190c0 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  inFile *pDbFd = 
190d0 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20  (winFile*)fd;.  
190e0 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  winShm *p = pDbF
190f0 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68  d->pShm;.  winSh
19100 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
19110 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19120 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70  TE_OK;..  if( !p
19130 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
19140 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
19150 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28  (pDbFd);.    if(
19160 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19170 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19180 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
19190 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20  .  }.  pShmNode 
191a0 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
191b0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
191c0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
191d0 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
191e0 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d  ( szRegion==pShm
191f0 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c  Node->szRegion |
19200 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  | pShmNode->nReg
19210 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ion==0 );..  if(
19220 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
19230 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20  on<=iRegion ){. 
19240 20 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67     struct ShmReg
19250 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20  ion *apNew;     
19260 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65        /* New aRe
19270 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  gion[] array */.
19280 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
19290 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65  (iRegion+1)*szRe
192a0 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  gion;  /* Minimu
192b0 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20  m required file 
192c0 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  size */.    sqli
192d0 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20  te3_int64 sz;   
192e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
192f0 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * Current size o
19300 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  f wal-index file
19310 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64   */..    pShmNod
19320 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a  e->szRegion = sz
19330 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20  Region;..    /* 
19340 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
19350 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
19360 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
19370 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
19380 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65  pace..    ** Che
19390 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
193a0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
193b0 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  ed (i.e. if the 
193c0 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69  wal-index file i
193d0 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65  s.    ** large e
193e0 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e  nough to contain
193f0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
19400 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20  egion)..    */. 
19410 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53     rc = winFileS
19420 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ize((sqlite3_fil
19430 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
19440 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20  File, &sz);.    
19450 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19460 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
19470 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
19480 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
19490 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
194a0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
194b0 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c     "winShmMap1",
194c0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
194d0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
194e0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
194f0 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20     if( sz<nByte 
19500 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
19510 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
19520 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74   region does not
19530 20 65 78 69 73 74 2e 20 49 66 20 69 73 57 72 69   exist. If isWri
19540 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20  te is set to.   
19550 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74     ** zero, exit
19560 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c   early. *pp will
19570 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
19580 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
19590 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a  turned..      **
195a0 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e  .      ** Altern
195b0 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72  atively, if isWr
195c0 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ite is non-zero,
195d0 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 29   use ftruncate()
195e0 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20   to allocate.   
195f0 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73     ** the reques
19600 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
19610 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
19620 20 20 69 66 28 20 21 69 73 57 72 69 74 65 20 29    if( !isWrite )
19630 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
19640 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  t;.      rc = wi
19650 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74  nTruncate((sqlit
19660 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e  e3_file *)&pShmN
19670 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74  ode->hFile, nByt
19680 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
19690 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
196a0 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
196b0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
196c0 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73  OERR_SHMSIZE, os
196d0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
196e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196f0 20 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70   "winShmMap2", p
19700 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
19710 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
19720 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
19730 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
19740 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  p the requested 
19750 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e  memory region in
19760 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
19770 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
19780 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20   */.    apNew = 
19790 28 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f  (struct ShmRegio
197a0 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  n *)sqlite3_real
197b0 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68  loc(.        pSh
197c0 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20  mNode->aRegion, 
197d0 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65  (iRegion+1)*size
197e0 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20  of(apNew[0]).   
197f0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e   );.    if( !apN
19800 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ew ){.      rc =
19810 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
19820 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
19830 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
19840 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d   }.    pShmNode-
19850 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77  >aRegion = apNew
19860 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53  ;..    while( pS
19870 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
19880 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
19890 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20    HANDLE hMap = 
198a0 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a  NULL;         /*
198b0 20 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61   file-mapping ha
198c0 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f  ndle */.      vo
198d0 69 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20  id *pMap = 0;   
198e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70            /* Map
198f0 70 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ped memory regio
19900 6e 20 2a 2f 0a 20 20 20 20 20 0a 23 69 66 20 53  n */.     .#if S
19910 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
19920 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
19930 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
19940 72 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d  romApp(pShmNode-
19950 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20  >hFile.h,.      
19960 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52      NULL, PAGE_R
19970 45 41 44 57 52 49 54 45 2c 20 6e 42 79 74 65 2c  EADWRITE, nByte,
19980 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23   NULL.      );.#
19990 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
199a0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
199b0 44 45 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d  DE).      hMap =
199c0 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
199d0 70 69 6e 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e  pingW(pShmNode->
199e0 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20  hFile.h, .      
199f0 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52      NULL, PAGE_R
19a00 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79  EADWRITE, 0, nBy
19a10 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29  te, NULL.      )
19a20 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
19a30 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
19a40 5f 41 4e 53 49 29 0a 20 20 20 20 20 20 68 4d 61  _ANSI).      hMa
19a50 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
19a60 4d 61 70 70 69 6e 67 41 28 70 53 68 6d 4e 6f 64  MappingA(pShmNod
19a70 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20  e->hFile.h, .   
19a80 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47         NULL, PAG
19a90 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20  E_READWRITE, 0, 
19aa0 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
19ab0 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20    );.#endif.    
19ac0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
19ad0 4d 41 50 20 70 69 64 2d 25 64 20 63 72 65 61 74  MAP pid-%d creat
19ae0 65 20 72 65 67 69 6f 6e 3d 25 64 20 6e 62 79 74  e region=%d nbyt
19af0 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
19b00 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
19b10 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
19b20 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64  essId(), pShmNod
19b30 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74  e->nRegion, nByt
19b40 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
19b50 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20    hMap ? "ok" : 
19b60 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
19b70 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20    if( hMap ){.  
19b80 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65        int iOffse
19b90 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  t = pShmNode->nR
19ba0 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a  egion*szRegion;.
19bb0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
19bc0 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73  setShift = iOffs
19bd0 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e  et % winSysInfo.
19be0 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
19bf0 75 6c 61 72 69 74 79 3b 0a 23 69 66 20 53 51 4c  ularity;.#if SQL
19c00 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
19c10 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61       pMap = osMa
19c20 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
19c30 70 70 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41  pp(hMap, FILE_MA
19c40 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d  P_WRITE | FILE_M
19c50 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20  AP_READ,.       
19c60 20 20 20 20 20 69 4f 66 66 73 65 74 20 2d 20 69       iOffset - i
19c70 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52  OffsetShift, szR
19c80 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53  egion + iOffsetS
19c90 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a  hift.        );.
19ca0 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d  #else.        pM
19cb0 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ap = osMapViewOf
19cc0 46 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f  File(hMap, FILE_
19cd0 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45  MAP_WRITE | FILE
19ce0 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20  _MAP_READ,.     
19cf0 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66 73 65         0, iOffse
19d00 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74  t - iOffsetShift
19d10 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66  , szRegion + iOf
19d20 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20  fsetShift.      
19d30 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20    );.#endif.    
19d40 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
19d50 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 6d 61 70  M-MAP pid-%d map
19d60 20 72 65 67 69 6f 6e 3d 25 64 20 6f 66 66 73 65   region=%d offse
19d70 74 3d 25 64 20 73 69 7a 65 3d 25 64 20 25 73 5c  t=%d size=%d %s\
19d80 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
19d90 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43       (int)osGetC
19da0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
19db0 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  ), pShmNode->nRe
19dc0 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20  gion, iOffset,. 
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19de0 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f  szRegion, pMap ?
19df0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
19e00 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
19e10 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20    if( !pMap ){. 
19e20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
19e30 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
19e40 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
19e50 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
19e60 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
19e70 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68  OERR_SHMMAP, pSh
19e80 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  mNode->lastErrno
19e90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19ea0 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c     "winShmMap3",
19eb0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
19ec0 20 20 20 20 20 20 20 20 69 66 28 20 68 4d 61 70          if( hMap
19ed0 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65   ) osCloseHandle
19ee0 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  (hMap);.        
19ef0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
19f00 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
19f10 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
19f20 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
19f30 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61  gion].pMap = pMa
19f40 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  p;.      pShmNod
19f50 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  e->aRegion[pShmN
19f60 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d  ode->nRegion].hM
19f70 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20  ap = hMap;.     
19f80 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
19f90 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  on++;.    }.  }.
19fa0 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20  .shmpage_out:.  
19fb0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
19fc0 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b  egion>iRegion ){
19fd0 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74  .    int iOffset
19fe0 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67   = iRegion*szReg
19ff0 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  ion;.    int iOf
1a000 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66  fsetShift = iOff
1a010 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  set % winSysInfo
1a020 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
1a030 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68  nularity;.    ch
1a040 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29  ar *p = (char *)
1a050 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1a060 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b  n[iRegion].pMap;
1a070 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64  .    *pp = (void
1a080 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69   *)&p[iOffsetShi
1a090 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ft];.  }else{.  
1a0a0 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
1a0b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1a0c0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1a0d0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1a0e0 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64  rc;.}..#else.# d
1a0f0 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20  efine winShmMap 
1a100 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77      0.# define w
1a110 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23  inShmLock    0.#
1a120 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61   define winShmBa
1a130 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65  rrier 0.# define
1a140 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30   winShmUnmap   0
1a150 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
1a160 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1a170 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  AL */../*.** Her
1a180 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65  e ends the imple
1a190 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mentation of all
1a1a0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
1a1b0 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  thods..**.******
1a1c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a1d0 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c   End sqlite3_fil
1a1e0 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e Methods ******
1a1f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a200 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1a210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a250 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
1a260 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66   This vector def
1a270 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74  ines all the met
1a280 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70  hods that can op
1a290 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73  erate on an.** s
1a2a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72 20  qlite3_file for 
1a2b0 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74 69 63  win32..*/.static
1a2c0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
1a2d0 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4d  o_methods winIoM
1a2e0 65 74 68 6f 64 20 3d 20 7b 0a 20 20 32 2c 20 20  ethod = {.  2,  
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1a310 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e  Version */.  win
1a320 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1a330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a340 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e 52  xClose */.  winR
1a350 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
1a360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1a370 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72 69  Read */.  winWri
1a380 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1a390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72            /* xWr
1a3a0 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75 6e  ite */.  winTrun
1a3b0 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
1a3c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75           /* xTru
1a3d0 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53 79  ncate */.  winSy
1a3e0 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
1a3f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1a400 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ync */.  winFile
1a410 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
1a420 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
1a430 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f  eSize */.  winLo
1a440 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1a450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1a460 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f  ock */.  winUnlo
1a470 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1a480 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
1a490 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68 65 63  ock */.  winChec
1a4a0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
1a4b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65           /* xChe
1a4c0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a  ckReservedLock *
1a4d0 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72  /.  winFileContr
1a4e0 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
1a4f0 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74      /* xFileCont
1a500 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63 74  rol */.  winSect
1a510 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
1a520 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
1a530 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e  torSize */.  win
1a540 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1a550 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a 20  stics,       /* 
1a560 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  xDeviceCharacter
1a570 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e 53  istics */.  winS
1a580 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20 20  hmMap,          
1a590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1a5a0 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e 53  ShmMap */.  winS
1a5b0 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  hmLock,         
1a5c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1a5d0 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  ShmLock */.  win
1a5e0 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20  ShmBarrier,     
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a600 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a 20  xShmBarrier */. 
1a610 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 20   winShmUnmap    
1a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a630 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
1a640 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .};../**********
1a650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a690 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
1a6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1a6b0 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
1a6c0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
1a6d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a6e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
1a6f0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
1a700 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1a710 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
1a720 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
1a730 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a  s object..*/../*
1a740 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
1a750 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  F-8 filename int
1a760 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20  o whatever form 
1a770 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
1a780 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
1a790 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d  em wants filenam
1a7a0 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f  es in.  Space to
1a7b0 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74   hold the result
1a7c0 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
1a7d0 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20  from malloc and 
1a7e0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
1a7f0 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
1a800 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
1a810 74 69 63 20 76 6f 69 64 20 2a 63 6f 6e 76 65 72  tic void *conver
1a820 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f  tUtf8Filename(co
1a830 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1a840 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43  ame){.  void *zC
1a850 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20  onverted = 0;.  
1a860 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
1a870 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 75    zConverted = u
1a880 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
1a890 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66  lename);.  }.#if
1a8a0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
1a8b0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
1a8c0 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
1a8d0 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
1a8e0 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a 46  _utf8_to_mbcs(zF
1a8f0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 65  ilename);.  }.#e
1a900 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72  ndif.  /* caller
1a910 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74   will handle out
1a920 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20   of memory */.  
1a930 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65  return zConverte
1a940 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  d;.}../*.** Crea
1a950 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
1a960 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
1a970 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
1a980 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a  big enough to.**
1a990 20 68 6f 6c 64 20 61 74 20 70 56 66 73 2d 3e 6d   hold at pVfs->m
1a9a0 78 50 61 74 68 6e 61 6d 65 20 63 68 61 72 61 63  xPathname charac
1a9b0 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
1a9c0 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28  int getTempname(
1a9d0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
1a9e0 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20  zBuf){.  static 
1a9f0 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
1aa00 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
1aa10 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
1aa20 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
1aa30 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
1aa40 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
1aa50 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20  9";.  size_t i, 
1aa60 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 6d 70 50 61  j;.  int nTempPa
1aa70 74 68 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70  th;.  char zTemp
1aa80 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 2b 32 5d  Path[MAX_PATH+2]
1aa90 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64  ;..  /* It's odd
1aaa0 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20   to simulate an 
1aab0 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62  io-error here, b
1aac0 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69  ut really this i
1aad0 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e  s just.  ** usin
1aae0 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69  g the io-error i
1aaf0 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f  nfrastructure to
1ab00 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74   test that SQLit
1ab10 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20  e handles this. 
1ab20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69   ** function fai
1ab30 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69  ling. .  */.  Si
1ab40 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1ab50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1ab60 52 52 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  RR );..  memset(
1ab70 7a 54 65 6d 70 50 61 74 68 2c 20 30 2c 20 4d 41  zTempPath, 0, MA
1ab80 58 5f 50 41 54 48 2b 32 29 3b 0a 0a 20 20 69 66  X_PATH+2);..  if
1ab90 28 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  ( sqlite3_temp_d
1aba0 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20  irectory ){.    
1abb0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1abc0 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54  (MAX_PATH-30, zT
1abd0 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c 20 73  empPath, "%s", s
1abe0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
1abf0 63 74 6f 72 79 29 3b 0a 20 20 7d 0a 23 69 66 20  ctory);.  }.#if 
1ac00 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
1ac10 0a 20 20 65 6c 73 65 20 69 66 28 20 69 73 4e 54  .  else if( isNT
1ac20 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  () ){.    char *
1ac30 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 57 43 48 41  zMulti;.    WCHA
1ac40 52 20 7a 57 69 64 65 50 61 74 68 5b 4d 41 58 5f  R zWidePath[MAX_
1ac50 50 41 54 48 5d 3b 0a 20 20 20 20 6f 73 47 65 74  PATH];.    osGet
1ac60 54 65 6d 70 50 61 74 68 57 28 4d 41 58 5f 50 41  TempPathW(MAX_PA
1ac70 54 48 2d 33 30 2c 20 7a 57 69 64 65 50 61 74 68  TH-30, zWidePath
1ac80 29 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20  );.    zMulti = 
1ac90 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57  unicodeToUtf8(zW
1aca0 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66  idePath);.    if
1acb0 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20  ( zMulti ){.    
1acc0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1acd0 74 66 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  tf(MAX_PATH-30, 
1ace0 7a 54 65 6d 70 50 61 74 68 2c 20 22 25 73 22 2c  zTempPath, "%s",
1acf0 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20   zMulti);.      
1ad00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 75  sqlite3_free(zMu
1ad10 6c 74 69 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  lti);.    }else{
1ad20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ad30 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1ad40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  ;.    }.  }.#ifd
1ad50 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1ad60 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
1ad70 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38  .    char *zUtf8
1ad80 3b 0a 20 20 20 20 63 68 61 72 20 7a 4d 62 63 73  ;.    char zMbcs
1ad90 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a  Path[MAX_PATH];.
1ada0 20 20 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74      osGetTempPat
1adb0 68 41 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  hA(MAX_PATH-30, 
1adc0 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20 20 20 20  zMbcsPath);.    
1add0 7a 55 74 66 38 20 3d 20 73 71 6c 69 74 65 33 5f  zUtf8 = sqlite3_
1ade0 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
1adf0 66 38 28 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20  f8(zMbcsPath);. 
1ae00 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a     if( zUtf8 ){.
1ae10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
1ae20 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 2d  printf(MAX_PATH-
1ae30 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 22  30, zTempPath, "
1ae40 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20  %s", zUtf8);.   
1ae50 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1ae60 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73  zUtf8);.    }els
1ae70 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
1ae80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1ae90 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  EM;.    }.  }.#e
1aea0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ndif.#endif..  /
1aeb0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
1aec0 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
1aed0 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  s large enough f
1aee0 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
1aef0 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65   file .  ** name
1af00 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20  . If it is not, 
1af10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
1af20 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 6e 54 65 6d  ROR..  */.  nTem
1af30 70 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 53  pPath = sqlite3S
1af40 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74  trlen30(zTempPat
1af50 68 29 3b 0a 0a 20 20 69 66 28 20 28 6e 54 65 6d  h);..  if( (nTem
1af60 70 50 61 74 68 20 2b 20 73 71 6c 69 74 65 33 53  pPath + sqlite3S
1af70 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f 54  trlen30(SQLITE_T
1af80 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
1af90 20 2b 20 31 38 29 20 3e 3d 20 6e 42 75 66 20 29   + 18) >= nBuf )
1afa0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1afb0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
1afc0 20 20 66 6f 72 28 69 3d 6e 54 65 6d 70 50 61 74    for(i=nTempPat
1afd0 68 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50  h; i>0 && zTempP
1afe0 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20  ath[i-1]=='\\'; 
1aff0 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61  i--){}.  zTempPa
1b000 74 68 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20 73 71  th[i] = 0;..  sq
1b010 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
1b020 42 75 66 2d 31 38 2c 20 7a 42 75 66 2c 20 28 6e  Buf-18, zBuf, (n
1b030 54 65 6d 70 50 61 74 68 20 3e 20 30 29 20 3f 0a  TempPath > 0) ?.
1b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b050 20 20 20 20 20 20 20 22 25 73 5c 5c 22 53 51 4c         "%s\\"SQL
1b060 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
1b070 45 46 49 58 20 3a 20 53 51 4c 49 54 45 5f 54 45  EFIX : SQLITE_TE
1b080 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 0a  MP_FILE_PREFIX,.
1b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0a0 20 20 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20     zTempPath);. 
1b0b0 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   j = sqlite3Strl
1b0c0 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71  en30(zBuf);.  sq
1b0d0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
1b0e0 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
1b0f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
1b100 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
1b110 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29  zBuf[j] = (char)
1b120 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e  zChars[ ((unsign
1b130 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29  ed char)zBuf[j])
1b140 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  %(sizeof(zChars)
1b150 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75  -1) ];.  }.  zBu
1b160 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66  f[j] = 0;.  zBuf
1b170 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 0a 20 20 4f 53  [j+1] = 0;..  OS
1b180 54 52 41 43 45 28 28 22 54 45 4d 50 20 46 49 4c  TRACE(("TEMP FIL
1b190 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42  ENAME: %s\n", zB
1b1a0 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  uf));.  return S
1b1b0 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a  QLITE_OK; .}../*
1b1c0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1b1d0 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  if the named fil
1b1e0 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 64 69  e is really a di
1b1f0 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75 72 6e  rectory.  Return
1b200 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74 20   false if.** it 
1b210 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  is something oth
1b220 65 72 20 74 68 61 6e 20 61 20 64 69 72 65 63 74  er than a direct
1b230 6f 72 79 2c 20 6f 72 20 69 66 20 74 68 65 72 65  ory, or if there
1b240 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20   is any kind of 
1b250 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61  memory.** alloca
1b260 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  tion failure..*/
1b270 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49  .static int winI
1b280 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20  sDir(const void 
1b290 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20 20  *zConverted){.  
1b2a0 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e  DWORD attr;.  in
1b2b0 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52  t rc = 0;.  DWOR
1b2c0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
1b2d0 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
1b2e0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
1b2f0 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
1b300 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
1b310 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73  trData;.    mems
1b320 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
1b330 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
1b340 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ta));.    while(
1b350 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c   !(rc = osGetFil
1b360 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28  eAttributesExW((
1b370 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
1b380 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
1b390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3a0 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
1b3b0 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20  andard,.        
1b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3d0 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29       &sAttrData)
1b3e0 29 20 26 26 20 72 65 74 72 79 49 6f 65 72 72 28  ) && retryIoerr(
1b3f0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
1b400 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72  ) ){}.    if( !r
1b410 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
1b420 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20  n 0; /* Invalid 
1b430 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20  name? */.    }. 
1b440 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
1b450 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
1b460 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45  utes;.#if SQLITE
1b470 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
1b480 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d  else{.    attr =
1b490 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
1b4a0 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f  utesA((char*)zCo
1b4b0 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
1b4c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61  .  }.  return (a
1b4d0 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
1b4e0 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26 26  E_ATTRIBUTES) &&
1b4f0 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52   (attr&FILE_ATTR
1b500 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29  IBUTE_DIRECTORY)
1b510 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1b520 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
1b530 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20  c int winOpen(. 
1b540 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1b550 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  fs,        /* No
1b560 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  t used */.  cons
1b570 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
1b580 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1b590 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38   the file (UTF-8
1b5a0 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  ) */.  sqlite3_f
1b5b0 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
1b5c0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51   /* Write the SQ
1b5d0 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  Lite file handle
1b5e0 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
1b5f0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
1b600 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64       /* Open mod
1b610 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74  e flags */.  int
1b620 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
1b630 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73         /* Status
1b640 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f   return flags */
1b650 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  .){.  HANDLE h;.
1b660 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
1b670 6f 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73  o;.  DWORD dwDes
1b680 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57  iredAccess;.  DW
1b690 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b  ORD dwShareMode;
1b6a0 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74  .  DWORD dwCreat
1b6b0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a  ionDisposition;.
1b6c0 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41    DWORD dwFlagsA
1b6d0 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 30  ndAttributes = 0
1b6e0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
1b6f0 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65  WINCE.  int isTe
1b700 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  mp = 0;.#endif. 
1b710 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
1b720 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
1b730 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
1b740 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
1b750 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20   /* Filename in 
1b760 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  OS encoding */. 
1b770 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74   const char *zUt
1b780 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20  f8Name = zName; 
1b790 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55  /* Filename in U
1b7a0 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  TF-8 encoding */
1b7b0 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
1b7c0 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
1b7d0 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c  t zPath is a NUL
1b7e0 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  L pointer, this 
1b7f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75  function is requ
1b800 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  ired to open.  *
1b810 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
1b820 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66  le. Use this buf
1b830 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
1b840 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20   file name in.. 
1b850 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e   */.  char zTmpn
1b860 61 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 32 5d 3b  ame[MAX_PATH+2];
1b870 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75       /* Buffer u
1b880 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 74 65  sed to create te
1b890 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a  mp filename */..
1b8a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1b8b0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
1b8c0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74   /* Function Ret
1b8d0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20  urn Code */.#if 
1b8e0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
1b8f0 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
1b900 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20  NCE.  int eType 
1b910 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
1b920 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
1b930 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
1b940 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73  #endif..  int is
1b950 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c  Exclusive  = (fl
1b960 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1b970 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  N_EXCLUSIVE);.  
1b980 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
1b990 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
1b9a0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
1b9b0 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73  CLOSE);.  int is
1b9c0 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c  Create     = (fl
1b9d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1b9e0 4e 5f 43 52 45 41 54 45 29 3b 0a 23 69 66 6e 64  N_CREATE);.#ifnd
1b9f0 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20  ef NDEBUG.  int 
1ba00 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28  isReadonly   = (
1ba10 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
1ba20 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 23  PEN_READONLY);.#
1ba30 65 6e 64 69 66 0a 20 20 69 6e 74 20 69 73 52 65  endif.  int isRe
1ba40 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67  adWrite  = (flag
1ba50 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
1ba60 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66  READWRITE);..#if
1ba70 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e  ndef NDEBUG.  in
1ba80 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20  t isOpenJournal 
1ba90 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28  = (isCreate && (
1baa0 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d  .        eType==
1bab0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
1bac0 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
1bad0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
1bae0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1baf0 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
1bb00 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1bb10 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66  WAL.  ));.#endif
1bb20 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65  ..  /* Check the
1bb30 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
1bb40 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20  ments are true: 
1bb50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29  .  **.  **   (a)
1bb60 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   Exactly one of 
1bb70 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e  the READWRITE an
1bb80 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73  d READONLY flags
1bb90 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e   must be set, an
1bba0 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66  d .  **   (b) if
1bbb0 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20   CREATE is set, 
1bbc0 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d  then READWRITE m
1bbd0 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c  ust also be set,
1bbe0 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20   and.  **   (c) 
1bbf0 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20  if EXCLUSIVE is 
1bc00 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
1bc10 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
1bc20 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66  t..  **   (d) if
1bc30 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69   DELETEONCLOSE i
1bc40 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
1bc50 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
1bc60 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
1bc70 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d  rt((isReadonly==
1bc80 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
1bc90 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57  ==0) && (isReadW
1bca0 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e  rite || isReadon
1bcb0 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ly));.  assert(i
1bcc0 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73  sCreate==0 || is
1bcd0 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73  ReadWrite);.  as
1bce0 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65  sert(isExclusive
1bcf0 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
1bd00 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c  ;.  assert(isDel
1bd10 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ete==0 || isCrea
1bd20 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  te);..  /* The m
1bd30 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75  ain DB, main jou
1bd40 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61  rnal, WAL file a
1bd50 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nd master journa
1bd60 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a  l are never .  *
1bd70 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
1bd80 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65  deleted. Nor are
1bd90 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f   they ever tempo
1bda0 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  rary files.  */.
1bdb0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
1bdc0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
1bdd0 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
1bde0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a  OPEN_MAIN_DB );.
1bdf0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
1be00 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
1be10 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
1be20 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
1be30 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
1be40 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
1be50 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
1be60 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
1be70 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
1be80 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
1be90 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
1bea0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
1beb0 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  _WAL );..  /* As
1bec0 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70  sert that the up
1bed0 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65  per layer has se
1bee0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69  t one of the "fi
1bef0 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20  le-type" flags. 
1bf00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  */.  assert( eTy
1bf10 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
1bf20 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20  MAIN_DB      || 
1bf30 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
1bf40 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20  EN_TEMP_DB .    
1bf50 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
1bf60 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
1bf70 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  URNAL || eType==
1bf80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
1bf90 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
1bfa0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
1bfb0 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
1bfc0 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  L   || eType==SQ
1bfd0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
1bfe0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
1bff0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
1c000 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
1c010 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  _DB || eType==SQ
1c020 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
1c030 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  );..  assert( id
1c040 21 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  !=0 );.  UNUSED_
1c050 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
1c060 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
1c070 57 49 4e 52 54 0a 20 20 69 66 28 20 21 73 71 6c  WINRT.  if( !sql
1c080 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
1c090 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ory ){.    sqlit
1c0a0 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52  e3_log(SQLITE_ER
1c0b0 52 4f 52 2c 0a 20 20 20 20 20 20 20 20 22 73 71  ROR,.        "sq
1c0c0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
1c0d0 74 6f 72 79 20 76 61 72 69 61 62 6c 65 20 73 68  tory variable sh
1c0e0 6f 75 6c 64 20 62 65 20 73 65 74 20 66 6f 72 20  ould be set for 
1c0f0 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a 23 65 6e  WinRT");.  }.#en
1c100 64 69 66 0a 0a 20 20 70 46 69 6c 65 2d 3e 68 20  dif..  pFile->h 
1c110 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
1c120 5f 56 41 4c 55 45 3b 0a 0a 20 20 2f 2a 20 49 66  _VALUE;..  /* If
1c130 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1c140 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
1c150 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67  ction is NULL, g
1c160 65 6e 65 72 61 74 65 20 61 20 0a 20 20 2a 2a 20  enerate a .  ** 
1c170 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
1c180 61 6d 65 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f  ame to use .  */
1c190 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d  .  if( !zUtf8Nam
1c1a0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
1c1b0 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f  isDelete && !isO
1c1c0 70 65 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  penJournal);.   
1c1d0 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e 61 6d   rc = getTempnam
1c1e0 65 28 4d 41 58 5f 50 41 54 48 2b 32 2c 20 7a 54  e(MAX_PATH+2, zT
1c1f0 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
1c200 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c210 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1c220 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74  c;.    }.    zUt
1c230 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d  f8Name = zTmpnam
1c240 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74  e;.  }..  /* Dat
1c250 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20  abase filenames 
1c260 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20  are double-zero 
1c270 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68  terminated if th
1c280 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20  ey are not.  ** 
1c290 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65  URIs with parame
1c2a0 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ters.  Hence, th
1c2b0 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65  ey can always be
1c2c0 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a   passed into.  *
1c2d0 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  * sqlite3_uri_pa
1c2e0 72 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a  rameter()..  */.
1c2f0 20 20 61 73 73 65 72 74 28 20 28 65 54 79 70 65    assert( (eType
1c300 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
1c310 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67 73  IN_DB) || (flags
1c320 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
1c330 52 49 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 7a  RI) ||.        z
1c340 55 74 66 38 4e 61 6d 65 5b 73 74 72 6c 65 6e 28  Utf8Name[strlen(
1c350 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30  zUtf8Name)+1]==0
1c360 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72   );..  /* Conver
1c370 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74  t the filename t
1c380 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63  o the system enc
1c390 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e  oding. */.  zCon
1c3a0 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74  verted = convert
1c3b0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74  Utf8Filename(zUt
1c3c0 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  f8Name);.  if( z
1c3d0 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
1c3e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c3f0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1c400 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49 73 44   }..  if( winIsD
1c410 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  ir(zConverted) )
1c420 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1c430 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
1c440 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c450 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
1c460 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 52  ;.  }..  if( isR
1c470 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20  eadWrite ){.    
1c480 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20  dwDesiredAccess 
1c490 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c  = GENERIC_READ |
1c4a0 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a   GENERIC_WRITE;.
1c4b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 44    }else{.    dwD
1c4c0 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
1c4d0 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d  ENERIC_READ;.  }
1c4e0 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50  ..  /* SQLITE_OP
1c4f0 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73 20  EN_EXCLUSIVE is 
1c500 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
1c510 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69 6c  e that a new fil
1c520 65 20 69 73 20 0a 20 20 2a 2a 20 63 72 65 61 74  e is .  ** creat
1c530 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e  ed. SQLite doesn
1c540 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64  't use it to ind
1c550 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65  icate "exclusive
1c560 20 61 63 63 65 73 73 22 20 0a 20 20 2a 2a 20 61   access" .  ** a
1c570 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20  s it is usually 
1c580 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f  understood..  */
1c590 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69  .  if( isExclusi
1c5a0 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65  ve ){.    /* Cre
1c5b0 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c  ates a new file,
1c5c0 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73   only if it does
1c5d0 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
1c5e0 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66  st. */.    /* If
1c5f0 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73   the file exists
1c600 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20  , it fails. */. 
1c610 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
1c620 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54  position = CREAT
1c630 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69  E_NEW;.  }else i
1c640 66 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20  f( isCreate ){. 
1c650 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74     /* Open exist
1c660 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65  ing file, or cre
1c670 61 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ate if it doesn'
1c680 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64  t exist */.    d
1c690 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
1c6a0 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41  tion = OPEN_ALWA
1c6b0 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  YS;.  }else{.   
1c6c0 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65   /* Opens a file
1c6d0 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69  , only if it exi
1c6e0 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72  sts. */.    dwCr
1c6f0 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
1c700 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e  n = OPEN_EXISTIN
1c710 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72  G;.  }..  dwShar
1c720 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41  eMode = FILE_SHA
1c730 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53  RE_READ | FILE_S
1c740 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69  HARE_WRITE;..  i
1c750 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
1c760 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1c770 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  CE.    dwFlagsAn
1c780 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
1c790 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44  LE_ATTRIBUTE_HID
1c7a0 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20  DEN;.    isTemp 
1c7b0 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64  = 1;.#else.    d
1c7c0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
1c7d0 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
1c7e0 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20  BUTE_TEMPORARY. 
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
1c810 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48  FILE_ATTRIBUTE_H
1c820 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20  IDDEN.          
1c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c840 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47       | FILE_FLAG
1c850 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45  _DELETE_ON_CLOSE
1c860 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
1c870 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  {.    dwFlagsAnd
1c880 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
1c890 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
1c8a0 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70  AL;.  }.  /* Rep
1c8b0 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e  orts from the in
1c8c0 74 65 72 6e 65 74 20 61 72 65 20 74 68 61 74 20  ternet are that 
1c8d0 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61  performance is a
1c8e0 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65  lways.  ** bette
1c8f0 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52  r if FILE_FLAG_R
1c900 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20  ANDOM_ACCESS is 
1c910 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32  used.  Ticket #2
1c920 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49  699. */.#if SQLI
1c930 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77  TE_OS_WINCE.  dw
1c940 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
1c950 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f  es |= FILE_FLAG_
1c960 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23  RANDOM_ACCESS;.#
1c970 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69 73 4e  endif..  if( isN
1c980 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  T() ){.#if SQLIT
1c990 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 43  E_OS_WINRT.    C
1c9a0 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e  REATEFILE2_EXTEN
1c9b0 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 20 65  DED_PARAMETERS e
1c9c0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
1c9d0 73 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  s;.    extendedP
1c9e0 61 72 61 6d 65 74 65 72 73 2e 64 77 53 69 7a 65  arameters.dwSize
1c9f0 20 3d 20 73 69 7a 65 6f 66 28 43 52 45 41 54 45   = sizeof(CREATE
1ca00 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50  FILE2_EXTENDED_P
1ca10 41 52 41 4d 45 54 45 52 53 29 3b 0a 20 20 20 20  ARAMETERS);.    
1ca20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
1ca30 72 73 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75  rs.dwFileAttribu
1ca40 74 65 73 20 3d 0a 20 20 20 20 20 20 20 20 20 20  tes =.          
1ca50 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
1ca60 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 41 54  ibutes & FILE_AT
1ca70 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20 20  TRIBUTE_MASK;.  
1ca80 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
1ca90 74 65 72 73 2e 64 77 46 69 6c 65 46 6c 61 67 73  ters.dwFileFlags
1caa0 20 3d 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74   = dwFlagsAndAtt
1cab0 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 46  ributes & FILE_F
1cac0 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78  LAG_MASK;.    ex
1cad0 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
1cae0 2e 64 77 53 65 63 75 72 69 74 79 51 6f 73 46 6c  .dwSecurityQosFl
1caf0 61 67 73 20 3d 20 53 45 43 55 52 49 54 59 5f 41  ags = SECURITY_A
1cb00 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65 78  NONYMOUS;.    ex
1cb10 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73  tendedParameters
1cb20 2e 6c 70 53 65 63 75 72 69 74 79 41 74 74 72 69  .lpSecurityAttri
1cb30 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20  butes = NULL;.  
1cb40 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65    extendedParame
1cb50 74 65 72 73 2e 68 54 65 6d 70 6c 61 74 65 46 69  ters.hTemplateFi
1cb60 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 77  le = NULL;.    w
1cb70 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65  hile( (h = osCre
1cb80 61 74 65 46 69 6c 65 32 28 28 4c 50 43 57 53 54  ateFile2((LPCWST
1cb90 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65              dwDe
1cbc0 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
1cbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbe0 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61             dwSha
1cbf0 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20 20 20 20  reMode,.        
1cc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc10 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
1cc20 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc40 20 20 20 20 20 20 20 20 20 20 20 26 65 78 74 65             &exte
1cc50 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 29 29  ndedParameters))
1cc60 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
1cc70 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
1cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc90 20 20 20 20 20 20 20 20 72 65 74 72 79 49 6f 65          retryIoe
1cca0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
1ccb0 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
1ccc0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a         /* Noop *
1ccd0 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  /.    }.#else.  
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 57 28 28 4c 50 43  CreateFileW((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 20 4e 55 4c 4c 2c  ShareMode, NULL,
1cd70 0a 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 20 20 20 20 20 20 64                 d
1cd90 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
1cda0 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
1cdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdc0 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
1cdd0 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20  tributes,.      
1cde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdf0 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d          NULL))==
1ce00 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
1ce10 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20  ALUE &&.        
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce30 20 20 20 20 20 20 72 65 74 72 79 49 6f 65 72 72        retryIoerr
1ce40 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
1ce50 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
1ce60 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a       /* Noop */.
1ce70 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
1ce80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
1ce90 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
1cea0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
1ceb0 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
1cec0 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e  leA((LPCSTR)zCon
1ced0 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
1cee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cef0 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
1cf00 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
1cf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
1cf30 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf50 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
1cf60 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
1cf70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf80 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
1cf90 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
1cfa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
1cfc0 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ULL))==INVALID_H
1cfd0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
1cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cff0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
1d000 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
1d010 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20  astErrno) ){.   
1d020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d030 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d  oop */.    }.  }
1d040 0a 23 65 6e 64 69 66 0a 20 20 6c 6f 67 49 6f 65  .#endif.  logIoe
1d050 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f 53 54 52  rr(cnt);..  OSTR
1d060 41 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE(("OPEN %d %s
1d070 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c 20 0a 20   0x%lx %s\n", . 
1d080 20 20 20 20 20 20 20 20 20 20 68 2c 20 7a 4e 61            h, zNa
1d090 6d 65 2c 20 64 77 44 65 73 69 72 65 64 41 63 63  me, dwDesiredAcc
1d0a0 65 73 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ess, .          
1d0b0 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44   h==INVALID_HAND
1d0c0 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66 61 69 6c  LE_VALUE ? "fail
1d0d0 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20  ed" : "ok"));.. 
1d0e0 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f   if( h==INVALID_
1d0f0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
1d100 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
1d110 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
1d120 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f  ;.    winLogErro
1d130 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
1d140 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  N, pFile->lastEr
1d150 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20  rno, "winOpen", 
1d160 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20  zUtf8Name);.    
1d170 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
1d180 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 69 66  nverted);.    if
1d190 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  ( isReadWrite &&
1d1a0 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b   !isExclusive ){
1d1b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
1d1c0 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d  nOpen(pVfs, zNam
1d1d0 65 2c 20 69 64 2c 20 0a 20 20 20 20 20 20 20 20  e, id, .        
1d1e0 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c       ((flags|SQL
1d1f0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1d200 59 29 26 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e  Y)&~(SQLITE_OPEN
1d210 5f 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f  _CREATE|SQLITE_O
1d220 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 29 2c  PEN_READWRITE)),
1d230 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20   pOutFlags);.   
1d240 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1d250 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
1d260 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
1d270 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74  .  }..  if( pOut
1d280 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28  Flags ){.    if(
1d290 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
1d2a0 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
1d2b0 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
1d2c0 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  EADWRITE;.    }e
1d2d0 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74  lse{.      *pOut
1d2e0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
1d2f0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
1d300 20 20 7d 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65    }.  }..  memse
1d310 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
1d320 6f 66 28 2a 70 46 69 6c 65 29 29 3b 0a 20 20 70  of(*pFile));.  p
1d330 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  File->pMethod = 
1d340 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20  &winIoMethod;.  
1d350 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20  pFile->h = h;.  
1d360 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1d370 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70   = NO_ERROR;.  p
1d380 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66  File->pVfs = pVf
1d390 73 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  s;.#ifndef SQLIT
1d3a0 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 70 46 69  E_OMIT_WAL.  pFi
1d3b0 6c 65 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 23 65  le->pShm = 0;.#e
1d3c0 6e 64 69 66 0a 20 20 70 46 69 6c 65 2d 3e 7a 50  ndif.  pFile->zP
1d3d0 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 69  ath = zName;.  i
1d3e0 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  f( sqlite3_uri_b
1d3f0 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70  oolean(zName, "p
1d400 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57  sow", SQLITE_POW
1d410 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1d420 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
1d430 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e  ctrlFlags |= WIN
1d440 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 0a  FILE_PSOW;.  }..
1d450 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1d460 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65 61 64  NCE.  if( isRead
1d470 57 72 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d  Write && eType==
1d480 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1d490 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20 21 77  _DB.       && !w
1d4a0 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a  inceCreateLock(z
1d4b0 4e 61 6d 65 2c 20 70 46 69 6c 65 29 0a 20 20 29  Name, pFile).  )
1d4c0 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  {.    osCloseHan
1d4d0 64 6c 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69  dle(h);.    sqli
1d4e0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
1d4f0 74 65 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ted);.    return
1d500 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1d510 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
1d520 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70   isTemp ){.    p
1d530 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
1d540 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65  lose = zConverte
1d550 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  d;.  }else.#endi
1d560 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
1d570 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
1d580 64 29 3b 0a 20 20 7d 0a 0a 20 20 4f 70 65 6e 43  d);.  }..  OpenC
1d590 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65  ounter(+1);.  re
1d5a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d5b0 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d  * Delete the nam
1d5c0 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e  ed file..**.** N
1d5d0 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f 77 73  ote that Windows
1d5e0 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20   does not allow 
1d5f0 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c  a file to be del
1d600 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  eted if some oth
1d610 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61  er.** process ha
1d620 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65  s it open.  Some
1d630 74 69 6d 65 73 20 61 20 76 69 72 75 73 20 73 63  times a virus sc
1d640 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e  anner or indexin
1d650 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c  g program.** wil
1d660 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c  l open a journal
1d670 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66   file shortly af
1d680 74 65 72 20 69 74 20 69 73 20 63 72 65 61 74 65  ter it is create
1d690 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f  d in order to do
1d6a0 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74 20  .** whatever it 
1d6b0 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69  does.  While thi
1d6c0 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  s other process 
1d6d0 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a  is holding the.*
1d6e0 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20  * file open, we 
1d6f0 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74  will be unable t
1d700 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f  o delete it.  To
1d710 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69   work around thi
1d720 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65  s.** problem, we
1d730 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69   delay 100 milli
1d740 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20  seconds and try 
1d750 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e  to delete again.
1d760 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45    Up.** to MX_DE
1d770 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20  LETION_ATTEMPTs 
1d780 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74  deletion attempt
1d790 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65  s are run before
1d7a0 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e   giving.** up an
1d7b0 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65  d returning an e
1d7c0 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
1d7d0 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20  int winDelete(. 
1d7e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1d7f0 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fs,          /* 
1d800 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
1d810 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
1d820 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
1d830 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69     /* Name of fi
1d840 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a  le to delete */.
1d850 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20    int syncDir   
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d870 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
1d880 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63  32 */.){.  int c
1d890 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  nt = 0;.  int rc
1d8a0 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a  ;.  DWORD attr;.
1d8b0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
1d8c0 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  o;.  void *zConv
1d8d0 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f  erted;.  UNUSED_
1d8e0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
1d8f0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1d900 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20  TER(syncDir);.. 
1d910 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1d920 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
1d930 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20  OERR_DELETE);.  
1d940 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e  zConverted = con
1d950 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65  vertUtf8Filename
1d960 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
1d970 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
1d980 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1d990 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1d9a0 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e  M;.  }.  if( isN
1d9b0 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a  T() ){.    do {.
1d9c0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1d9d0 4e 52 54 0a 20 20 20 20 20 20 57 49 4e 33 32 5f  NRT.      WIN32_
1d9e0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
1d9f0 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
1da00 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74       memset(&sAt
1da10 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
1da20 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
1da30 20 20 20 20 20 69 66 20 28 20 6f 73 47 65 74 46       if ( osGetF
1da40 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
1da50 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20 47 65 74  (zConverted, Get
1da60 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61  FileExInfoStanda
1da70 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
1da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da90 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
1daa0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74  ) ){.        att
1dab0 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77  r = sAttrData.dw
1dac0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a  FileAttributes;.
1dad0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1dae0 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
1daf0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1db00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
1db10 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
1db20 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 7c  FILE_NOT_FOUND |
1db30 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
1db40 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
1db50 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
1db60 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1db70 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
1db80 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
1db90 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
1dba0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1dbb0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1dbc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1dbd0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1dbe0 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74 72  #else.      attr
1dbf0 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
1dc00 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72 74  ibutesW(zConvert
1dc10 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ed);.#endif.    
1dc20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56    if ( attr==INV
1dc30 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
1dc40 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20  UTES ){.        
1dc50 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
1dc60 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
1dc70 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
1dc80 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno==ERROR_FILE_
1dc90 4e 4f 54 5f 46 4f 55 4e 44 20 7c 7c 20 6c 61 73  NOT_FOUND || las
1dca0 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41  tErrno==ERROR_PA
1dcb0 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
1dcc0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1dcd0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
1dce0 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72  TE_NOENT; /* Alr
1dcf0 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20  eady gone? */.  
1dd00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1dd10 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1dd20 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
1dd30 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
1dd40 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1dd50 20 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f   if ( attr&FILE_
1dd60 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54  ATTRIBUTE_DIRECT
1dd70 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ORY ){.        r
1dd80 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1dd90 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e  ; /* Files only.
1dda0 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
1ddb0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1ddc0 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69   if ( osDeleteFi
1ddd0 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  leW(zConverted) 
1dde0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ddf0 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65  SQLITE_OK; /* De
1de00 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20  leted OK. */.   
1de10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1de20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21    }.      if ( !
1de30 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
1de40 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
1de50 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1de60 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f  ITE_ERROR; /* No
1de70 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a   more retries. *
1de80 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
1de90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77  .      }.    } w
1dea0 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66  hile(1);.  }.#if
1deb0 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
1dec0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
1ded0 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
1dee0 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
1def0 65 41 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f  eAttributesA(zCo
1df00 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
1df10 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c  if ( attr==INVAL
1df20 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
1df30 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61  ES ){.        la
1df40 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1df50 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1df60 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
1df70 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o==ERROR_FILE_NO
1df80 54 5f 46 4f 55 4e 44 20 7c 7c 20 6c 61 73 74 45  T_FOUND || lastE
1df90 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48  rrno==ERROR_PATH
1dfa0 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
1dfb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1dfc0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
1dfd0 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61  _NOENT; /* Alrea
1dfe0 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20  dy gone? */.    
1dff0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e000 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e010 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
1e020 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
1e030 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1e040 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54  f ( attr&FILE_AT
1e050 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52  TRIBUTE_DIRECTOR
1e060 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  Y ){.        rc 
1e070 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
1e080 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a  /* Files only. *
1e090 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
1e0a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1e0b0 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  f ( osDeleteFile
1e0c0 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b  A(zConverted) ){
1e0d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1e0e0 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65  LITE_OK; /* Dele
1e0f0 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20  ted OK. */.     
1e100 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1e110 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 72 65  }.      if ( !re
1e120 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
1e130 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
1e140 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e150 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d  E_ERROR; /* No m
1e160 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a  ore retries. */.
1e170 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1e180 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69       }.    } whi
1e190 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  le(1);.  }.#endi
1e1a0 66 0a 20 20 69 66 28 20 72 63 20 26 26 20 72 63  f.  if( rc && rc
1e1b0 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  !=SQLITE_IOERR_D
1e1c0 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20  ELETE_NOENT ){. 
1e1d0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
1e1e0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1e1f0 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45 72 72  _DELETE, lastErr
1e200 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1e210 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46   "winDelete", zF
1e220 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  ilename);.  }els
1e230 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28  e{.    logIoerr(
1e240 63 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  cnt);.  }.  sqli
1e250 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
1e260 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ted);.  OSTRACE(
1e270 28 22 44 45 4c 45 54 45 20 5c 22 25 73 5c 22 20  ("DELETE \"%s\" 
1e280 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %s\n", zFilename
1e290 2c 20 28 72 63 20 3f 20 22 66 61 69 6c 65 64 22  , (rc ? "failed"
1e2a0 20 3a 20 22 6f 6b 22 20 29 29 29 3b 0a 20 20 72   : "ok" )));.  r
1e2b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e2c0 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78 69  ** Check the exi
1e2d0 73 74 61 6e 63 65 20 61 6e 64 20 73 74 61 74 75  stance and statu
1e2e0 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  s of a file..*/.
1e2f0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63  static int winAc
1e300 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
1e310 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
1e320 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
1e330 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e  n win32 */.  con
1e340 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1e350 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me,     /* Name 
1e360 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  of file to check
1e370 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
1e380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e390 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74   /* Type of test
1e3a0 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73   to make on this
1e3b0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   file */.  int *
1e3c0 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20  pResOut         
1e3d0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
1e3e0 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f  sult */.){.  DWO
1e3f0 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72  RD attr;.  int r
1e400 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c  c = 0;.  DWORD l
1e410 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64  astErrno;.  void
1e420 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
1e430 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1e440 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c  (pVfs);..  Simul
1e450 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
1e460 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1e470 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 7a 43 6f  ACCESS; );.  zCo
1e480 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
1e490 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  tUtf8Filename(zF
1e4a0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
1e4b0 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
1e4c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e4d0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
1e4e0 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29    }.  if( isNT()
1e4f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
1e500 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46  = 0;.    WIN32_F
1e510 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41  ILE_ATTRIBUTE_DA
1e520 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20  TA sAttrData;.  
1e530 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44    memset(&sAttrD
1e540 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ata, 0, sizeof(s
1e550 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20  AttrData));.    
1e560 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73  while( !(rc = os
1e570 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
1e580 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43  sExW((LPCWSTR)zC
1e590 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20  onverted,.      
1e5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5b0 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45 78         GetFileEx
1e5c0 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a 20  InfoStandard, . 
1e5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74              &sAt
1e5f0 74 72 44 61 74 61 29 29 20 26 26 20 72 65 74 72  trData)) && retr
1e600 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
1e610 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20  stErrno) ){}.   
1e620 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1e630 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54   /* For an SQLIT
1e640 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
1e650 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a  query, treat a z
1e660 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a  ero-length file.
1e670 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69        ** as if i
1e680 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
1e690 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e6a0 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53   if(    flags==S
1e6b0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
1e6c0 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26 26  STS.          &&
1e6d0 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65   sAttrData.nFile
1e6e0 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20 20  SizeHigh==0 .   
1e6f0 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44         && sAttrD
1e700 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77  ata.nFileSizeLow
1e710 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
1e720 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ttr = INVALID_FI
1e730 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
1e740 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e750 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72      attr = sAttr
1e760 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69  Data.dwFileAttri
1e770 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20  butes;.      }. 
1e780 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e790 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 20  logIoerr(cnt);. 
1e7a0 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
1e7b0 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no!=ERROR_FILE_N
1e7c0 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73 74  OT_FOUND && last
1e7d0 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54  Errno!=ERROR_PAT
1e7e0 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
1e7f0 20 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72         winLogErr
1e800 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1e810 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e  ACCESS, lastErrn
1e820 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c 20  o, "winAccess", 
1e830 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
1e840 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1e850 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
1e860 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e870 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
1e880 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1e890 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e         attr = IN
1e8a0 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
1e8b0 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20  BUTES;.      }. 
1e8c0 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
1e8d0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1e8e0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
1e8f0 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
1e900 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63  leAttributesA((c
1e910 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
1e920 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
1e930 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
1e940 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63  verted);.  switc
1e950 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20  h( flags ){.    
1e960 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
1e970 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73  SS_READ:.    cas
1e980 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
1e990 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63  EXISTS:.      rc
1e9a0 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44   = attr!=INVALID
1e9b0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
1e9c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1e9d0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
1e9e0 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a  CCESS_READWRITE:
1e9f0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72  .      rc = attr
1ea00 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
1ea10 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20 20  TTRIBUTES &&.   
1ea20 20 20 20 20 20 20 20 20 20 20 28 61 74 74 72 20            (attr 
1ea30 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  & FILE_ATTRIBUTE
1ea40 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20  _READONLY)==0;. 
1ea50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ea60 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61  default:.      a
1ea70 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20  ssert(!"Invalid 
1ea80 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29  flags argument")
1ea90 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74  ;.  }.  *pResOut
1eaa0 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e 20   = rc;.  return 
1eab0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
1eac0 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e  *.** Returns non
1ead0 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65  -zero if the spe
1eae0 63 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65  cified path name
1eaf0 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1eb00 76 65 72 62 61 74 69 6d 2e 20 20 49 66 0a 2a 2a  verbatim.  If.**
1eb10 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
1eb20 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69 73 20  urned from this 
1eb30 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20 63 61  function, the ca
1eb40 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d  lling function m
1eb50 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20 75 73  ust simply.** us
1eb60 65 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 70  e the provided p
1eb70 61 74 68 20 6e 61 6d 65 20 76 65 72 62 61 74 69  ath name verbati
1eb80 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65 20 69  m -OR- resolve i
1eb90 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  t into a full pa
1eba0 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e 67  th name.** using
1ebb0 20 74 68 65 20 47 65 74 46 75 6c 6c 50 61 74 68   the GetFullPath
1ebc0 4e 61 6d 65 20 57 69 6e 33 32 20 41 50 49 20 66  Name Win32 API f
1ebd0 75 6e 63 74 69 6f 6e 20 28 69 66 20 61 76 61 69  unction (if avai
1ebe0 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  lable)..*/.stati
1ebf0 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65 72 62  c BOOL winIsVerb
1ec00 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a 20 20  atimPathname(.  
1ec10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
1ec20 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20  hname.){.  /*.  
1ec30 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 6e  ** If the path n
1ec40 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20  ame starts with 
1ec50 61 20 66 6f 72 77 61 72 64 20 73 6c 61 73 68 20  a forward slash 
1ec60 6f 72 20 61 20 62 61 63 6b 73 6c 61 73 68 2c 20  or a backslash, 
1ec70 69 74 20 69 73 20 65 69 74 68 65 72 0a 20 20 2a  it is either.  *
1ec80 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43 20 6e 61  * a legal UNC na
1ec90 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72 65 6c  me, a volume rel
1eca0 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72 20 61  ative path, or a
1ecb0 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20  n absolute path 
1ecc0 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a  name in the.  **
1ecd0 20 22 55 6e 69 78 22 20 66 6f 72 6d 61 74 20 6f   "Unix" format o
1ece0 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68 65 72  n Windows.  Ther
1ecf0 65 20 69 73 20 6e 6f 20 65 61 73 79 20 77 61 79  e is no easy way
1ed00 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61 74   to differentiat
1ed10 65 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74  e between.  ** t
1ed20 68 65 20 66 69 6e 61 6c 20 74 77 6f 20 63 61 73  he final two cas
1ed30 65 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 77  es; therefore, w
1ed40 65 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 66  e return the saf
1ed50 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
1ed60 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20 73 6f 20  of TRUE.  ** so 
1ed70 74 68 61 74 20 63 61 6c 6c 65 72 73 20 6f 66 20  that callers of 
1ed80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
1ed90 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65 20 69 74  ll simply use it
1eda0 20 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a   verbatim..  */.
1edb0 20 20 69 66 20 28 20 7a 50 61 74 68 6e 61 6d 65    if ( zPathname
1edc0 5b 30 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 50 61 74  [0]=='/' || zPat
1edd0 68 6e 61 6d 65 5b 30 5d 3d 3d 27 5c 5c 27 20 29  hname[0]=='\\' )
1ede0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55  {.    return TRU
1edf0 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  E;.  }..  /*.  *
1ee00 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 6e 61  * If the path na
1ee10 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61  me starts with a
1ee20 20 6c 65 74 74 65 72 20 61 6e 64 20 61 20 63 6f   letter and a co
1ee30 6c 6f 6e 20 69 74 20 69 73 20 65 69 74 68 65 72  lon it is either
1ee40 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72   a volume.  ** r
1ee50 65 6c 61 74 69 76 65 20 70 61 74 68 20 6f 72 20  elative path or 
1ee60 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68  an absolute path
1ee70 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66 20 74 68  .  Callers of th
1ee80 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  is function must
1ee90 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70   not.  ** attemp
1eea0 74 20 74 6f 20 74 72 65 61 74 20 69 74 20 61 73  t to treat it as
1eeb0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
1eec0 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74 68 65 79   name (i.e. they
1eed0 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75   should simply u
1eee0 73 65 0a 20 20 2a 2a 20 69 74 20 76 65 72 62 61  se.  ** it verba
1eef0 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20  tim)..  */.  if 
1ef00 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61  ( sqlite3Isalpha
1ef10 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26  (zPathname[0]) &
1ef20 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d  & zPathname[1]==
1ef30 27 3a 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ':' ){.    retur
1ef40 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f  n TRUE;.  }..  /
1ef50 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74  *.  ** If we get
1ef60 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
1ef70 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 68  the path name sh
1ef80 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72 74  ould almost cert
1ef90 61 69 6e 6c 79 20 62 65 20 61 20 70 75 72 65 6c  ainly be a purel
1efa0 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20  y.  ** relative 
1efb0 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20  one (i.e. not a 
1efc0 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62  UNC name, not ab
1efd0 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20  solute, and not 
1efe0 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 29  volume relative)
1eff0 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
1f000 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  FALSE;.}../*.** 
1f010 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
1f020 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
1f030 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20  full pathname.  
1f040 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a  Write the full.*
1f050 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  * pathname into 
1f060 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20  zOut[].  zOut[] 
1f070 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74  will be at least
1f080 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
1f090 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69  e.** bytes in si
1f0a0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
1f0b0 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  t winFullPathnam
1f0c0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
1f0d0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
1f0e0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
1f0f0 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
1f100 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
1f110 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f  lative,        /
1f120 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
1f130 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
1f140 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20  /.  int nFull,  
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f160 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
1f170 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
1f180 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
1f190 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Full            
1f1a0 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
1f1b0 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20   buffer */.){.  
1f1c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
1f1d0 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c  YGWIN__).  Simul
1f1e0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
1f1f0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
1f200 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1f210 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20  METER(nFull);.  
1f220 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78  assert( pVfs->mx
1f230 50 61 74 68 6e 61 6d 65 3e 3d 4d 41 58 5f 50 41  Pathname>=MAX_PA
1f240 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
1f250 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50  nFull>=pVfs->mxP
1f260 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69 66 20  athname );.  if 
1f270 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
1f280 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
1f290 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
1f2a0 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
1f2b0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
1f2c0 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
1f2d0 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
1f2e0 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
1f2f0 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
1f300 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
1f310 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
1f320 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
1f330 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
1f340 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
1f350 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
1f360 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
1f370 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
1f380 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
1f390 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
1f3a0 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
1f3b0 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73 68 2e  ory and a slash.
1f3c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
1f3d0 20 7a 4f 75 74 5b 4d 41 58 5f 50 41 54 48 2b 31   zOut[MAX_PATH+1
1f3e0 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 4f  ];.    memset(zO
1f3f0 75 74 2c 20 30 2c 20 4d 41 58 5f 50 41 54 48 2b  ut, 0, MAX_PATH+
1f400 31 29 3b 0a 20 20 20 20 63 79 67 77 69 6e 5f 63  1);.    cygwin_c
1f410 6f 6e 76 5f 74 6f 5f 77 69 6e 33 32 5f 70 61 74  onv_to_win32_pat
1f420 68 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75  h(zRelative, zOu
1f430 74 29 3b 20 2f 2a 20 50 4f 53 49 58 20 74 6f 20  t); /* POSIX to 
1f440 57 69 6e 33 32 20 2a 2f 0a 20 20 20 20 73 71 6c  Win32 */.    sql
1f450 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
1f460 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
1f470 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
1f480 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20  l, "%s\\%s",.   
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4a0 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
1f4b0 69 72 65 63 74 6f 72 79 2c 20 7a 4f 75 74 29 3b  irectory, zOut);
1f4c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1f4d0 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 54 68  .    ** NOTE: Th
1f4e0 65 20 43 79 67 77 69 6e 20 64 6f 63 73 20 73 74  e Cygwin docs st
1f4f0 61 74 65 20 74 68 61 74 20 74 68 65 20 6d 61 78  ate that the max
1f500 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6e 65 65 64  imum length need
1f510 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ed.    **       
1f520 66 6f 72 20 74 68 65 20 62 75 66 66 65 72 20 70  for the buffer p
1f530 61 73 73 65 64 20 74 6f 20 63 79 67 77 69 6e 5f  assed to cygwin_
1f540 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c 5f 77 69 6e  conv_to_full_win
1f550 33 32 5f 70 61 74 68 0a 20 20 20 20 2a 2a 20 20  32_path.    **  
1f560 20 20 20 20 20 69 73 20 4d 41 58 5f 50 41 54 48       is MAX_PATH
1f570 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 79 67  ..    */.    cyg
1f580 77 69 6e 5f 63 6f 6e 76 5f 74 6f 5f 66 75 6c 6c  win_conv_to_full
1f590 5f 77 69 6e 33 32 5f 70 61 74 68 28 7a 52 65 6c  _win32_path(zRel
1f5a0 61 74 69 76 65 2c 20 7a 46 75 6c 6c 29 3b 0a 20  ative, zFull);. 
1f5b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1f5c0 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23  TE_OK;.#endif..#
1f5d0 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if (SQLITE_OS_WI
1f5e0 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
1f5f0 5f 57 49 4e 52 54 29 20 26 26 20 21 64 65 66 69  _WINRT) && !defi
1f600 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
1f610 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1f620 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
1f630 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57  _ERROR );.  /* W
1f640 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63  inCE has no conc
1f650 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76  ept of a relativ
1f660 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73  e pathname, or s
1f670 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a  o I am told. */.
1f680 20 20 2f 2a 20 57 69 6e 52 54 20 68 61 73 20 6e    /* WinRT has n
1f690 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76 65 72 74  o way to convert
1f6a0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
1f6b0 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   to an absolute 
1f6c0 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73  one. */.  if ( s
1f6d0 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
1f6e0 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56  ctory && !winIsV
1f6f0 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
1f700 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20  zRelative) ){.  
1f710 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
1f720 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67  : We are dealing
1f730 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
1f740 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74   path name and t
1f750 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20  he data.    **  
1f760 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68       directory h
1f770 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68  as been set.  Th
1f780 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
1f790 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20  as the basis.   
1f7a0 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f   **       for co
1f7b0 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c  nverting the rel
1f7c0 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
1f7d0 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20  to an absolute. 
1f7e0 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20     **       one 
1f7f0 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68  by prepending th
1f800 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
1f810 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68   and a backslash
1f820 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
1f830 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
1f840 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
1f850 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
1f860 6c 2c 20 22 25 73 5c 5c 25 73 22 2c 0a 20 20 20  l, "%s\\%s",.   
1f870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f880 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
1f890 69 72 65 63 74 6f 72 79 2c 20 7a 52 65 6c 61 74  irectory, zRelat
1f8a0 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ive);.  }else{. 
1f8b0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1f8c0 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
1f8d0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
1f8e0 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a  , zFull, "%s", z
1f8f0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20  Relative);.  }. 
1f900 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1f910 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  K;.#endif..#if !
1f920 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
1f930 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
1f940 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
1f950 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 44 57  __CYGWIN__).  DW
1f960 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69  ORD nByte;.  voi
1f970 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
1f980 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20   char *zOut;..  
1f990 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74 68 20  /* If this path 
1f9a0 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68  name begins with
1f9b0 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58   "/X:", where "X
1f9c0 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65  " is any alphabe
1f9d0 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74  tic.  ** charact
1f9e0 65 72 2c 20 64 69 73 63 61 72 64 20 74 68 65 20  er, discard the 
1f9f0 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d  initial "/" from
1fa00 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20   the pathname.. 
1fa10 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74   */.  if( zRelat
1fa20 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 73  ive[0]=='/' && s
1fa30 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 52  qlite3Isalpha(zR
1fa40 65 6c 61 74 69 76 65 5b 31 5d 29 20 26 26 20 7a  elative[1]) && z
1fa50 52 65 6c 61 74 69 76 65 5b 32 5d 3d 3d 27 3a 27  Relative[2]==':'
1fa60 20 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69 76   ){.    zRelativ
1fa70 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  e++;.  }..  /* I
1fa80 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
1fa90 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
1faa0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
1fab0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
1fac0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
1fad0 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
1fae0 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
1faf0 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
1fb00 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
1fb10 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69  ion failing. Thi
1fb20 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64  s function could
1fb30 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78   fail if, for ex
1fb40 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20  ample, the.  ** 
1fb50 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20  current working 
1fb60 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
1fb70 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a  en unlinked..  *
1fb80 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
1fb90 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1fba0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  TE_ERROR );.  if
1fbb0 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
1fbc0 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
1fbd0 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
1fbe0 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
1fbf0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
1fc00 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
1fc10 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
1fc20 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
1fc30 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
1fc40 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
1fc50 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
1fc60 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
1fc70 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
1fc80 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
1fc90 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
1fca0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
1fcb0 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
1fcc0 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
1fcd0 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
1fce0 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
1fcf0 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73  tory and a backs
1fd00 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
1fd10 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1fd20 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
1fd30 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
1fd40 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c  zFull, "%s\\%s",
1fd50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fd60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
1fd70 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 7a 52  ta_directory, zR
1fd80 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 72 65  elative);.    re
1fd90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fda0 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64    }.  zConverted
1fdb0 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 46 69   = convertUtf8Fi
1fdc0 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  lename(zRelative
1fdd0 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72  );.  if( zConver
1fde0 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ted==0 ){.    re
1fdf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1fe00 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  R_NOMEM;.  }.  i
1fe10 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
1fe20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20   LPWSTR zTemp;. 
1fe30 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
1fe40 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c  FullPathNameW((L
1fe50 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
1fe60 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  d, 0, 0, 0);.   
1fe70 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
1fe80 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
1fe90 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  or(SQLITE_ERROR,
1fea0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
1feb0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1fec0 20 20 20 20 20 22 47 65 74 46 75 6c 6c 50 61 74       "GetFullPat
1fed0 68 4e 61 6d 65 57 31 22 2c 20 7a 43 6f 6e 76 65  hNameW1", zConve
1fee0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rted);.      sql
1fef0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
1ff00 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
1ff10 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
1ff20 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20  PEN_FULLPATH;.  
1ff30 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d    }.    nByte +=
1ff40 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20   3;.    zTemp = 
1ff50 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
1ff60 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28  o( nByte*sizeof(
1ff70 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20  zTemp[0]) );.   
1ff80 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b   if( zTemp==0 ){
1ff90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1ffa0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
1ffb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ffc0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1ffd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
1ffe0 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
1fff0 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54 52 29  hNameW((LPCWSTR)
20000 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
20010 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
20020 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
20030 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72  {.      winLogEr
20040 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
20050 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
20060 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
20070 20 20 20 20 20 20 22 47 65 74 46 75 6c 6c 50 61        "GetFullPa
20080 74 68 4e 61 6d 65 57 32 22 2c 20 7a 43 6f 6e 76  thNameW2", zConv
20090 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71  erted);.      sq
200a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
200b0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71  erted);.      sq
200c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
200d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
200e0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
200f0 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a  FULLPATH;.    }.
20100 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
20110 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
20120 20 20 7a 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65    zOut = unicode
20130 54 6f 55 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20  ToUtf8(zTemp);. 
20140 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20150 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 69 66 64  zTemp);.  }.#ifd
20160 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
20170 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
20180 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  .    char *zTemp
20190 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73  ;.    nByte = os
201a0 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
201b0 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
201c0 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ed, 0, 0, 0);.  
201d0 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
201e0 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72  {.      winLogEr
201f0 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
20200 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
20210 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
20220 20 20 20 20 20 20 22 47 65 74 46 75 6c 6c 50 61        "GetFullPa
20230 74 68 4e 61 6d 65 41 31 22 2c 20 7a 43 6f 6e 76  thNameA1", zConv
20240 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71  erted);.      sq
20250 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
20260 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
20270 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
20280 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20  OPEN_FULLPATH;. 
20290 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b     }.    nByte +
202a0 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d  = 3;.    zTemp =
202b0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
202c0 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66  ro( nByte*sizeof
202d0 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20  (zTemp[0]) );.  
202e0 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29    if( zTemp==0 )
202f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
20300 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
20310 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
20320 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
20330 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  M;.    }.    nBy
20340 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
20350 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a  thNameA((char*)z
20360 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65  Converted, nByte
20370 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20  , zTemp, 0);.   
20380 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
20390 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
203a0 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c  or(SQLITE_ERROR,
203b0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
203c0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
203d0 20 20 20 20 20 22 47 65 74 46 75 6c 6c 50 61 74       "GetFullPat
203e0 68 4e 61 6d 65 41 32 22 2c 20 7a 43 6f 6e 76 65  hNameA2", zConve
203f0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rted);.      sql
20400 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
20410 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rted);.      sql
20420 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
20430 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
20440 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
20450 55 4c 4c 50 41 54 48 3b 0a 20 20 20 20 7d 0a 20  ULLPATH;.    }. 
20460 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
20470 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
20480 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33 5f   zOut = sqlite3_
20490 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74  win32_mbcs_to_ut
204a0 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73  f8(zTemp);.    s
204b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
204c0 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  p);.  }.#endif. 
204d0 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a 20 20 20   if( zOut ){.   
204e0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
204f0 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
20500 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
20510 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 4f 75  zFull, "%s", zOu
20520 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
20530 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
20540 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20550 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
20560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
20570 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65  RR_NOMEM;.  }.#e
20580 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ndif.}..#ifndef 
20590 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
205a0 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
205b0 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
205c0 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
205d0 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
205e0 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
205f0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
20600 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
20610 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
20620 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
20630 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
20640 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
20650 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
20660 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
20670 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
20680 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
20690 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
206a0 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
206b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
206c0 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73 71 6c 69   *winDlOpen(sqli
206d0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
206e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
206f0 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44 4c 45 20  name){.  HANDLE 
20700 68 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  h;.  void *zConv
20710 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55  erted = convertU
20720 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c  tf8Filename(zFil
20730 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44  ename);.  UNUSED
20740 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
20750 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
20760 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ed==0 ){.    ret
20770 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
20780 20 69 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53   isNT() ){.#if S
20790 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
207a0 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63     h = osLoadPac
207b0 6b 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50  kagedLibrary((LP
207c0 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
207d0 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  , 0);.#else.    
207e0 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  h = osLoadLibrar
207f0 79 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  yW((LPCWSTR)zCon
20800 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a  verted);.#endif.
20810 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
20820 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
20830 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d  .  else{.    h =
20840 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28   osLoadLibraryA(
20850 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
20860 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d);.  }.#endif. 
20870 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
20880 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74  onverted);.  ret
20890 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a  urn (void*)h;.}.
208a0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44  static void winD
208b0 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
208c0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
208d0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
208e0 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
208f0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
20900 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  getLastErrorMsg(
20910 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
20920 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29  , nBuf, zBufOut)
20930 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
20940 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74  (*winDlSym(sqlit
20950 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
20960 69 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e  id *pHandle, con
20970 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c  st char *zSymbol
20980 29 29 28 76 6f 69 64 29 7b 0a 20 20 55 4e 55 53  ))(void){.  UNUS
20990 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
209a0 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  s);.  return (vo
209b0 69 64 28 2a 29 28 76 6f 69 64 29 29 6f 73 47 65  id(*)(void))osGe
209c0 74 50 72 6f 63 41 64 64 72 65 73 73 41 28 28 48  tProcAddressA((H
209d0 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 2c 20 7a  ANDLE)pHandle, z
209e0 53 79 6d 62 6f 6c 29 3b 0a 7d 0a 73 74 61 74 69  Symbol);.}.stati
209f0 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73  c void winDlClos
20a00 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
20a10 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
20a20 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
20a30 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
20a40 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28 28   osFreeLibrary((
20a50 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b  HANDLE)pHandle);
20a60 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
20a70 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
20a80 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
20a90 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
20aa0 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20 30 0a  ne winDlOpen  0.
20ab0 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 45    #define winDlE
20ac0 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65  rror 0.  #define
20ad0 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a 20 20   winDlSym   0.  
20ae0 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43 6c 6f  #define winDlClo
20af0 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  se 0.#endif.../*
20b00 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20  .** Write up to 
20b10 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61  nBuf bytes of ra
20b20 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42  ndomness into zB
20b30 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  uf..*/.static in
20b40 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28  t winRandomness(
20b50 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
20b60 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
20b70 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e 74 20  r *zBuf){.  int 
20b80 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f  n = 0;.  UNUSED_
20b90 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
20ba0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
20bb0 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20 3d 20  ITE_TEST).  n = 
20bc0 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 7a  nBuf;.  memset(z
20bd0 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23  Buf, 0, nBuf);.#
20be0 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f  else.  if( sizeo
20bf0 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c 3d 6e  f(SYSTEMTIME)<=n
20c00 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53 59 53  Buf-n ){.    SYS
20c10 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f  TEMTIME x;.    o
20c20 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
20c30 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  x);.    memcpy(&
20c40 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73 69 7a  zBuf[n], &x, siz
20c50 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e 20 2b  eof(x));.    n +
20c60 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20 20 7d  = sizeof(x);.  }
20c70 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 44 57  .  if( sizeof(DW
20c80 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a  ORD)<=nBuf-n ){.
20c90 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20      DWORD pid = 
20ca0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
20cb0 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d 65 6d  essId();.    mem
20cc0 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 70  cpy(&zBuf[n], &p
20cd0 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
20ce0 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
20cf0 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69 66 20  f(pid);.  }.#if 
20d00 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
20d10 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55 4c 4f    if( sizeof(ULO
20d20 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d 6e 20  NGLONG)<=nBuf-n 
20d30 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47  ){.    ULONGLONG
20d40 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b   cnt = osGetTick
20d50 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20 20 6d  Count64();.    m
20d60 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
20d70 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74  &cnt, sizeof(cnt
20d80 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
20d90 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65  eof(cnt);.  }.#e
20da0 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  lse.  if( sizeof
20db0 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20  (DWORD)<=nBuf-n 
20dc0 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63 6e 74  ){.    DWORD cnt
20dd0 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e   = osGetTickCoun
20de0 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  t();.    memcpy(
20df0 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20  &zBuf[n], &cnt, 
20e00 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20  sizeof(cnt));.  
20e10 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e    n += sizeof(cn
20e20 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  t);.  }.#endif. 
20e30 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41 52 47   if( sizeof(LARG
20e40 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42 75 66  E_INTEGER)<=nBuf
20e50 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47 45 5f  -n ){.    LARGE_
20e60 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 6f  INTEGER i;.    o
20e70 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  sQueryPerformanc
20e80 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20  eCounter(&i);.  
20e90 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
20ea0 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28 69 29  ], &i, sizeof(i)
20eb0 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
20ec0 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  of(i);.  }.#endi
20ed0 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  f.  return n;.}.
20ee0 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
20ef0 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
20f00 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
20f10 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
20f20 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pt..*/.static in
20f30 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74  t winSleep(sqlit
20f40 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
20f50 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73  t microsec){.  s
20f60 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
20f70 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  ep((microsec+999
20f80 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45  )/1000);.  UNUSE
20f90 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
20fa0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69  );.  return ((mi
20fb0 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
20fc0 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )*1000;.}../*.**
20fd0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
20fe0 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
20ff0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
21000 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
21010 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
21020 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
21030 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
21040 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
21050 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
21060 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
21070 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
21080 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
21090 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
210a0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
210b0 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
210c0 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
210d0 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
210e0 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
210f0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
21100 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
21110 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
21120 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
21130 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
21140 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
21150 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
21160 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
21170 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
21180 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
21190 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
211a0 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
211b0 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
211c0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
211d0 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
211e0 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
211f0 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
21200 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
21210 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
21220 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
21230 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
21240 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
21250 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ss, return SQLIT
21260 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51  E_OK.  Return SQ
21270 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68  LITE_ERROR if th
21280 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
21290 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  .** cannot be fo
212a0 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
212b0 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d  nt winCurrentTim
212c0 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76  eInt64(sqlite3_v
212d0 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65  fs *pVfs, sqlite
212e0 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b  3_int64 *piNow){
212f0 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73  .  /* FILETIME s
21300 74 72 75 63 74 75 72 65 20 69 73 20 61 20 36 34  tructure is a 64
21310 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 65  -bit value repre
21320 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62  senting the numb
21330 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30 30 2d  er of .     100-
21340 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72  nanosecond inter
21350 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61  vals since Janua
21360 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44  ry 1, 1601 (= JD
21370 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a 20 20   2305813.5). .  
21380 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74  */.  FILETIME ft
21390 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
213a0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77   sqlite3_int64 w
213b0 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20  inFiletimeEpoch 
213c0 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69  = 23058135*(sqli
213d0 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
213e0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
213f0 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 63  _TEST.  static c
21400 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
21410 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32  64 unixEpoch = 2
21420 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33  4405875*(sqlite3
21430 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
21440 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32  #endif.  /* 2^32
21450 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20   - to avoid use 
21460 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e  of LL and warnin
21470 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73  gs in gcc */.  s
21480 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
21490 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42  te3_int64 max32B
214a0 69 74 56 61 6c 75 65 20 3d 20 0a 20 20 20 20 20  itValue = .     
214b0 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
214c0 32 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71  2000000000 + (sq
214d0 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
214e0 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65  000000 + (sqlite
214f0 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32 39  3_int64)29496729
21500 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  6;..#if SQLITE_O
21510 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d  S_WINCE.  SYSTEM
21520 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47  TIME time;.  osG
21530 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69  etSystemTime(&ti
21540 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73  me);.  /* if Sys
21550 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
21560 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65  e() fails, it re
21570 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  turns zero. */. 
21580 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69   if (!osSystemTi
21590 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69  meToFileTime(&ti
215a0 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65  me,&ft)){.    re
215b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
215c0 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f  R;.  }.#else.  o
215d0 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  sGetSystemTimeAs
215e0 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b  FileTime( &ft );
215f0 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f  .#endif..  *piNo
21600 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45  w = winFiletimeE
21610 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20  poch +.         
21620 20 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69     ((((sqlite3_i
21630 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68 44 61  nt64)ft.dwHighDa
21640 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74  teTime)*max32Bit
21650 56 61 6c 75 65 29 20 2b 20 0a 20 20 20 20 20 20  Value) + .      
21660 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
21670 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77  3_int64)ft.dwLow
21680 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74  DateTime)/(sqlit
21690 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a  e3_int64)10000;.
216a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
216b0 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  EST.  if( sqlite
216c0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29  3_current_time )
216d0 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31  {.    *piNow = 1
216e0 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  000*(sqlite3_int
216f0 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65  64)sqlite3_curre
21700 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70  nt_time + unixEp
21710 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  och;.  }.#endif.
21720 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
21730 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75  ER(pVfs);.  retu
21740 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
21750 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
21760 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
21770 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
21780 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
21790 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72  rite the.** curr
217a0 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
217b0 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
217c0 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70  y number into *p
217d0 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75  rNow and.** retu
217e0 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
217f0 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
21800 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
21810 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
21820 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69  int winCurrentTi
21830 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
21840 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72  pVfs, double *pr
21850 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Now){.  int rc;.
21860 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
21870 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72  i;.  rc = winCur
21880 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56  rentTimeInt64(pV
21890 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21  fs, &i);.  if( !
218a0 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77  rc ){.    *prNow
218b0 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b   = i/86400000.0;
218c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
218d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
218e0 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69 73  dea is that this
218f0 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
21900 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69  like a combinati
21910 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74  on of.** GetLast
21920 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d  Error() and Form
21930 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57  atMessage() on W
21940 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f  indows (or errno
21950 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72   and.** strerror
21960 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41  _r() on Unix). A
21970 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73  fter an error is
21980 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
21990 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20  OS.** function, 
219a0 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69  SQLite calls thi
219b0 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  s function with 
219c0 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f  zBuf pointing to
219d0 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20  .** a buffer of 
219e0 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65 20  nBuf bytes. The 
219f0 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20  OS layer should 
21a00 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20  populate the.** 
21a10 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e 75  buffer with a nu
21a20 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46  l-terminated UTF
21a30 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72  -8 encoded error
21a40 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63   message.** desc
21a50 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20  ribing the last 
21a60 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65  IO error to have
21a70 20 6f 63 63 75 72 72 65 64 20 77 69 74 68 69 6e   occurred within
21a80 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
21a90 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  thread..**.** If
21aa0 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
21ab0 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20  ge is too large 
21ac0 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65 64  for the supplied
21ad0 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73   buffer,.** it s
21ae0 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74  hould be truncat
21af0 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76  ed. The return v
21b00 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74  alue of xGetLast
21b10 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f  Error.** is zero
21b20 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
21b30 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
21b40 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
21b50 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
21b60 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
21b70 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
21b80 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ). If non-zero i
21b90 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74  s returned,.** t
21ba0 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hen it is not ne
21bb0 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75  cessary to inclu
21bc0 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69  de the nul-termi
21bd0 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a  nator character.
21be0 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74  ** in the output
21bf0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e   buffer..**.** N
21c00 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20  ot supplying an 
21c10 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69  error message wi
21c20 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72  ll have no adver
21c30 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20  se effect.** on 
21c40 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69  SQLite. It is fi
21c50 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d  ne to have an im
21c60 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
21c70 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72  t never.** retur
21c80 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ns an error mess
21c90 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74  age:.**.**   int
21ca0 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73   xGetLastError(s
21cb0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
21cc0 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
21cd0 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20   *zBuf){.**     
21ce0 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d  assert(zBuf[0]==
21cf0 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65  '\0');.**     re
21d00 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a  turn 0;.**   }.*
21d10 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20  *.** However if 
21d20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
21d30 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74   is supplied, it
21d40 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f   will be incorpo
21d50 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69  rated.** by sqli
21d60 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f  te into the erro
21d70 72 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61  r message availa
21d80 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 20  ble to the user 
21d90 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
21da0 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69  _errmsg(), possi
21db0 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72  bly making IO er
21dc0 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20 64  rors easier to d
21dd0 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ebug..*/.static 
21de0 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72  int winGetLastEr
21df0 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
21e00 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
21e10 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
21e20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
21e30 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pVfs);.  return
21e40 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
21e50 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28  (osGetLastError(
21e60 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a  ), nBuf, zBuf);.
21e70 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
21e80 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61  ize and deinitia
21e90 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69  lize the operati
21ea0 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66  ng system interf
21eb0 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ace..*/.int sqli
21ec0 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64  te3_os_init(void
21ed0 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
21ee0 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d  te3_vfs winVfs =
21ef0 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20   {.    3,       
21f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
21f10 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73  Version */.    s
21f20 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20  izeof(winFile), 
21f30 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20      /* szOsFile 
21f40 2a 2f 0a 20 20 20 20 4d 41 58 5f 50 41 54 48 2c  */.    MAX_PATH,
21f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6d              /* m
21f60 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  xPathname */.   
21f70 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
21f80 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a        /* pNext *
21f90 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20  /.    "win32",  
21fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e             /* zN
21fb0 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fd0 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20  /* pAppData */. 
21fe0 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20     winOpen,     
21ff0 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
22000 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74   */.    winDelet
22010 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
22020 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77  xDelete */.    w
22030 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20  inAccess,       
22040 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a      /* xAccess *
22050 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74  /.    winFullPat
22060 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46  hname,     /* xF
22070 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ullPathname */. 
22080 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20     winDlOpen,   
22090 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
220a0 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45  en */.    winDlE
220b0 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f  rror,          /
220c0 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20  * xDlError */.  
220d0 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20    winDlSym,     
220e0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
220f0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f   */.    winDlClo
22100 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
22110 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20  xDlClose */.    
22120 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  winRandomness,  
22130 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
22140 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c  ess */.    winSl
22150 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
22160 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20  /* xSleep */.   
22170 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c   winCurrentTime,
22180 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e        /* xCurren
22190 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  tTime */.    win
221a0 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20  GetLastError,   
221b0 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
221c0 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  or */.    winCur
221d0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f  rentTimeInt64, /
221e0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
221f0 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65  t64 */.    winSe
22200 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
22210 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c  /* xSetSystemCal
22220 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53  l */.    winGetS
22230 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
22240 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xGetSystemCall 
22250 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79  */.    winNextSy
22260 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78  stemCall,   /* x
22270 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  NextSystemCall *
22280 2f 0a 20 20 7d 3b 0a 0a 20 20 2f 2a 20 44 6f 75  /.  };..  /* Dou
22290 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74  ble-check that t
222a0 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72  he aSyscall[] ar
222b0 72 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  ray has been con
222c0 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f  structed.  ** co
222d0 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69  rrectly.  See ti
222e0 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 30  cket [bb3a86e890
222f0 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73  c8e96ab] */.  as
22300 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28  sert( ArraySize(
22310 61 53 79 73 63 61 6c 6c 29 3d 3d 37 34 20 29 3b  aSyscall)==74 );
22320 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
22330 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 2f 2a 20 67  _OMIT_WAL.  /* g
22340 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c  et memory map al
22350 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61  location granula
22360 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  rity */.  memset
22370 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c  (&winSysInfo, 0,
22380 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49   sizeof(SYSTEM_I
22390 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54  NFO));.#if SQLIT
223a0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47  E_OS_WINRT.  osG
223b0 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
223c0 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b  fo(&winSysInfo);
223d0 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79  .#else.  osGetSy
223e0 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73  stemInfo(&winSys
223f0 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Info);.#endif.  
22400 61 73 73 65 72 74 28 77 69 6e 53 79 73 49 6e 66  assert(winSysInf
22410 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
22420 61 6e 75 6c 61 72 69 74 79 20 3e 20 30 29 3b 0a  anularity > 0);.
22430 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
22440 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
22450 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72 65  winVfs, 1);.  re
22460 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
22470 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .}..int sqlite3_
22480 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23  os_end(void){ .#
22490 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
224a0 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62  RT.  if( sleepOb
224b0 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f  j!=NULL ){.    o
224c0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65  sCloseHandle(sle
224d0 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65  epObj);.    slee
224e0 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  pObj = NULL;.  }
224f0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
22500 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
22510 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
22520 4f 53 5f 57 49 4e 20 2a 2f 0a                    OS_WIN */.