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

Artifact 4e2bf0760409aef35e298ff725054e94d834e1a3:


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 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1360: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e  MMAP_SIZE>0.  in
1370: 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20 20 20  t nFetchOut;    
1380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1390: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
13a0: 64 69 6e 67 20 78 46 65 74 63 68 20 72 65 66 65  ding xFetch refe
13b0: 72 65 6e 63 65 73 20 2a 2f 0a 20 20 48 41 4e 44  rences */.  HAND
13c0: 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20  LE hMap;        
13d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
13e0: 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e  dle for accessin
13f0: 67 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  g memory mapping
1400: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70   */.  void *pMap
1410: 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
1420: 20 20 20 20 2f 2a 20 41 72 65 61 20 6d 65 6d 6f      /* Area memo
1430: 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20 20 73  ry mapped */.  s
1440: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1450: 70 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20  pSize;       /* 
1460: 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d  Usable size of m
1470: 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a  apped region */.
1480: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1490: 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20  mmapSizeActual; 
14a0: 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65 20 6f  /* Actual size o
14b0: 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  f mapped region 
14c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
14d0: 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20  64 mmapSizeMax; 
14e0: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64     /* Configured
14f0: 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45   FCNTL_MMAP_SIZE
1500: 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
1510: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  .};../*.** Allow
1520: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 77 69  ed values for wi
1530: 6e 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73 0a  nFile.ctrlFlags.
1540: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49  */.#define WINFI
1550: 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 20  LE_RDONLY       
1560: 20 20 20 30 78 30 32 20 20 20 2f 2a 20 43 6f 6e     0x02   /* Con
1570: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
1580: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
1590: 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  WINFILE_PERSIST_
15a0: 57 41 4c 20 20 20 20 20 30 78 30 34 20 20 20 2f  WAL     0x04   /
15b0: 2a 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c  * Persistent WAL
15c0: 20 6d 6f 64 65 20 2a 2f 0a 23 64 65 66 69 6e 65   mode */.#define
15d0: 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 20 20 20   WINFILE_PSOW   
15e0: 20 20 20 20 20 20 20 20 20 30 78 31 30 20 20 20           0x10   
15f0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  /* SQLITE_IOCAP_
1600: 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1610: 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 54 68  ITE */../*. * Th
1620: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
1630: 66 66 65 72 20 75 73 65 64 20 62 79 20 73 71 6c  ffer used by sql
1640: 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74 65  ite3_win32_write
1650: 5f 64 65 62 75 67 28 29 2e 0a 20 2a 2f 0a 23 69  _debug().. */.#i
1660: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
1670: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 0a  32_DBG_BUF_SIZE.
1680: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
1690: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
16a0: 49 5a 45 20 20 20 28 28 69 6e 74 29 28 34 30 39  IZE   ((int)(409
16b0: 36 2d 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29  6-sizeof(DWORD))
16c0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
16d0: 54 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 77  The value used w
16e0: 69 74 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  ith sqlite3_win3
16f0: 32 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28  2_set_directory(
1700: 29 20 74 6f 20 73 70 65 63 69 66 79 20 74 68 61  ) to specify tha
1710: 74 0a 20 2a 20 74 68 65 20 64 61 74 61 20 64 69  t. * the data di
1720: 72 65 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62  rectory should b
1730: 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23  e changed.. */.#
1740: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
1750: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
1760: 52 59 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e  RY_TYPE.#  defin
1770: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  e SQLITE_WIN32_D
1780: 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  ATA_DIRECTORY_TY
1790: 50 45 20 28 31 29 0a 23 65 6e 64 69 66 0a 0a 2f  PE (1).#endif../
17a0: 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75  *. * The value u
17b0: 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  sed with sqlite3
17c0: 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63  _win32_set_direc
17d0: 74 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66  tory() to specif
17e0: 79 20 74 68 61 74 0a 20 2a 20 74 68 65 20 74 65  y that. * the te
17f0: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
1800: 79 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e  y should be chan
1810: 67 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ged.. */.#ifndef
1820: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45   SQLITE_WIN32_TE
1830: 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  MP_DIRECTORY_TYP
1840: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
1850: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
1860: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 28 32 29  RECTORY_TYPE (2)
1870: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 49  .#endif../*. * I
1880: 66 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  f compiled with 
1890: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
18a0: 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f 77 73 2c 20  LOC on Windows, 
18b0: 77 65 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0a  we will use the.
18c0: 20 2a 20 76 61 72 69 6f 75 73 20 57 69 6e 33 32   * various Win32
18d0: 20 41 50 49 20 68 65 61 70 20 66 75 6e 63 74 69   API heap functi
18e0: 6f 6e 73 20 69 6e 73 74 65 61 64 20 6f 66 20 6f  ons instead of o
18f0: 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a 23 69 66 64  ur own.. */.#ifd
1900: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1910: 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20 2a 20 49 66  MALLOC../*. * If
1920: 20 74 68 69 73 20 69 73 20 6e 6f 6e 2d 7a 65 72   this is non-zer
1930: 6f 2c 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68  o, an isolated h
1940: 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61  eap will be crea
1950: 74 65 64 20 62 79 20 74 68 65 20 6e 61 74 69 76  ted by the nativ
1960: 65 20 57 69 6e 33 32 0a 20 2a 20 61 6c 6c 6f 63  e Win32. * alloc
1970: 61 74 6f 72 20 73 75 62 73 79 73 74 65 6d 3b 20  ator subsystem; 
1980: 6f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 64  otherwise, the d
1990: 65 66 61 75 6c 74 20 70 72 6f 63 65 73 73 20 68  efault process h
19a0: 65 61 70 20 77 69 6c 6c 20 62 65 20 75 73 65 64  eap will be used
19b0: 2e 20 20 54 68 69 73 0a 20 2a 20 73 65 74 74 69  .  This. * setti
19c0: 6e 67 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74  ng has no effect
19d0: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67 20   when compiling 
19e0: 66 6f 72 20 57 69 6e 52 54 2e 20 20 42 79 20 64  for WinRT.  By d
19f0: 65 66 61 75 6c 74 2c 20 74 68 69 73 20 69 73 20  efault, this is 
1a00: 65 6e 61 62 6c 65 64 0a 20 2a 20 61 6e 64 20 61  enabled. * and a
1a10: 6e 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20  n isolated heap 
1a20: 77 69 6c 6c 20 62 65 20 63 72 65 61 74 65 64 20  will be created 
1a30: 74 6f 20 73 74 6f 72 65 20 61 6c 6c 20 61 6c 6c  to store all all
1a40: 6f 63 61 74 65 64 20 64 61 74 61 2e 0a 20 2a 0a  ocated data.. *.
1a50: 20 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1aa0: 20 2a 20 57 41 52 4e 49 4e 47 3a 20 49 74 20 69   * WARNING: It i
1ab0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6e  s important to n
1ac0: 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68  ote that when th
1ad0: 69 73 20 73 65 74 74 69 6e 67 20 69 73 20 6e 6f  is setting is no
1ae0: 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 0a 20  n-zero and the. 
1af0: 2a 20 20 20 20 20 20 20 20 20 20 77 69 6e 4d 65  *          winMe
1b00: 6d 53 68 75 74 64 6f 77 6e 20 66 75 6e 63 74 69  mShutdown functi
1b10: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28 65 2e  on is called (e.
1b20: 67 2e 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  g. by the sqlite
1b30: 33 5f 73 68 75 74 64 6f 77 6e 0a 20 2a 20 20 20  3_shutdown. *   
1b40: 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 29         function)
1b50: 2c 20 61 6c 6c 20 64 61 74 61 20 74 68 61 74 20  , all data that 
1b60: 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  was allocated us
1b70: 69 6e 67 20 74 68 65 20 69 73 6f 6c 61 74 65 64  ing the isolated
1b80: 20 68 65 61 70 20 77 69 6c 6c 0a 20 2a 20 20 20   heap will. *   
1b90: 20 20 20 20 20 20 20 62 65 20 66 72 65 65 64 20         be freed 
1ba0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20  immediately and 
1bb0: 61 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 61  any attempt to a
1bc0: 63 63 65 73 73 20 61 6e 79 20 6f 66 20 74 68 61  ccess any of tha
1bd0: 74 20 66 72 65 65 64 0a 20 2a 20 20 20 20 20 20  t freed. *      
1be0: 20 20 20 20 64 61 74 61 20 77 69 6c 6c 20 61 6c      data will al
1bf0: 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 72  most certainly r
1c00: 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6d 6d 65  esult in an imme
1c10: 64 69 61 74 65 20 61 63 63 65 73 73 20 76 69 6f  diate access vio
1c20: 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a 2a 2a 2a 2a  lation.. *******
1c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c70: 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a 23 69 66 6e  *******. */.#ifn
1c80: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
1c90: 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 23 20 20  _HEAP_CREATE.#  
1ca0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
1cb0: 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45 20  N32_HEAP_CREATE 
1cc0: 20 20 20 28 54 52 55 45 29 0a 23 65 6e 64 69 66     (TRUE).#endif
1cd0: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 69 6e 69 74  ../*. * The init
1ce0: 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ial size of the 
1cf0: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68  Win32-specific h
1d00: 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65  eap.  This value
1d10: 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a   may be zero.. *
1d20: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1d30: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
1d40: 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20  _SIZE.#  define 
1d50: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
1d60: 50 5f 49 4e 49 54 5f 53 49 5a 45 20 28 28 53 51  P_INIT_SIZE ((SQ
1d70: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
1d80: 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a 20 20 20  HE_SIZE) * \.   
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db0: 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46 41      (SQLITE_DEFA
1dc0: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 20 2b  ULT_PAGE_SIZE) +
1dd0: 20 34 31 39 34 33 30 34 29 0a 23 65 6e 64 69 66   4194304).#endif
1de0: 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78 69  ../*. * The maxi
1df0: 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65 20  mum size of the 
1e00: 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20 68  Win32-specific h
1e10: 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75 65  eap.  This value
1e20: 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20 2a   may be zero.. *
1e30: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1e40: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
1e50: 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53  SIZE.#  define S
1e60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
1e70: 5f 4d 41 58 5f 53 49 5a 45 20 20 28 30 29 0a 23  _MAX_SIZE  (0).#
1e80: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65  endif../*. * The
1e90: 20 65 78 74 72 61 20 66 6c 61 67 73 20 74 6f 20   extra flags to 
1ea0: 75 73 65 20 69 6e 20 63 61 6c 6c 73 20 74 6f 20  use in calls to 
1eb0: 74 68 65 20 57 69 6e 33 32 20 68 65 61 70 20 41  the Win32 heap A
1ec0: 50 49 73 2e 20 20 54 68 69 73 20 76 61 6c 75 65  PIs.  This value
1ed0: 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65 72 6f 20   may be. * zero 
1ee0: 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20  for the default 
1ef0: 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23 69  behavior.. */.#i
1f00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
1f10: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 0a 23 20  32_HEAP_FLAGS.# 
1f20: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
1f30: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 20  IN32_HEAP_FLAGS 
1f40: 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a      (0).#endif..
1f50: 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d  /*.** The winMem
1f60: 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20 73  Data structure s
1f70: 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f  tores informatio
1f80: 6e 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68  n required by th
1f90: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63  e Win32-specific
1fa0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  .** sqlite3_mem_
1fb0: 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e  methods implemen
1fc0: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64  tation..*/.typed
1fd0: 65 66 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d  ef struct winMem
1fe0: 44 61 74 61 20 77 69 6e 4d 65 6d 44 61 74 61 3b  Data winMemData;
1ff0: 0a 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61  .struct winMemDa
2000: 74 61 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45  ta {.#ifndef NDE
2010: 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69 63 3b  BUG.  u32 magic;
2020: 20 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d      /* Magic num
2030: 62 65 72 20 74 6f 20 64 65 74 65 63 74 20 73 74  ber to detect st
2040: 72 75 63 74 75 72 65 20 63 6f 72 72 75 70 74 69  ructure corrupti
2050: 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  on. */.#endif.  
2060: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 20 2f 2a  HANDLE hHeap; /*
2070: 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f 20 6f   The handle to o
2080: 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20 20 42 4f  ur heap. */.  BO
2090: 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f 2a 20 44  OL bOwned;  /* D
20a0: 6f 20 77 65 20 6f 77 6e 20 74 68 65 20 68 65 61  o we own the hea
20b0: 70 20 28 69 2e 65 2e 20 64 65 73 74 72 6f 79 20  p (i.e. destroy 
20c0: 69 74 20 6f 6e 20 73 68 75 74 64 6f 77 6e 29 3f  it on shutdown)?
20d0: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20   */.};..#ifndef 
20e0: 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 57  NDEBUG.#define W
20f0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 20 20 20 20  INMEM_MAGIC     
2100: 30 78 34 32 62 32 38 33 30 62 0a 23 65 6e 64 69  0x42b2830b.#endi
2110: 66 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  f..static struct
2120: 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 5f   winMemData win_
2130: 6d 65 6d 5f 64 61 74 61 20 3d 20 7b 0a 23 69 66  mem_data = {.#if
2140: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 57 49  ndef NDEBUG.  WI
2150: 4e 4d 45 4d 5f 4d 41 47 49 43 2c 0a 23 65 6e 64  NMEM_MAGIC,.#end
2160: 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c 53 45  if.  NULL, FALSE
2170: 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  .};..#ifndef NDE
2180: 42 55 47 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  BUG.#define winM
2190: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 20  emAssertMagic() 
21a0: 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f  assert( win_mem_
21b0: 64 61 74 61 2e 6d 61 67 69 63 3d 3d 57 49 4e 4d  data.magic==WINM
21c0: 45 4d 5f 4d 41 47 49 43 20 29 0a 23 65 6c 73 65  EM_MAGIC ).#else
21d0: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41  .#define winMemA
21e0: 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23 65 6e  ssertMagic().#en
21f0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77 69 6e  dif..#define win
2200: 4d 65 6d 47 65 74 48 65 61 70 28 29 20 77 69 6e  MemGetHeap() win
2210: 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a  _mem_data.hHeap.
2220: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
2230: 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e  nMemMalloc(int n
2240: 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 76  Bytes);.static v
2250: 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76  oid winMemFree(v
2260: 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74  oid *pPrior);.st
2270: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
2280: 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  mRealloc(void *p
2290: 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65  Prior, int nByte
22a0: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  s);.static int w
22b0: 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a  inMemSize(void *
22c0: 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  p);.static int w
22d0: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74  inMemRoundup(int
22e0: 20 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   n);.static int 
22f0: 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20  winMemInit(void 
2300: 2a 70 41 70 70 44 61 74 61 29 3b 0a 73 74 61 74  *pAppData);.stat
2310: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68  ic void winMemSh
2320: 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70  utdown(void *pAp
2330: 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73  pData);..const s
2340: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
2350: 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65  ds *sqlite3MemGe
2360: 74 57 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65  tWin32(void);.#e
2370: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
2380: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a  IN32_MALLOC */..
2390: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
23a0: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73 20  ing variable is 
23b0: 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f  (normally) set o
23c0: 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63 68  nce and never ch
23d0: 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 66  anges.** thereaf
23e0: 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64 73  ter.  It records
23f0: 20 77 68 65 74 68 65 72 20 74 68 65 20 6f 70 65   whether the ope
2400: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
2410: 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e   Win9x.** or Win
2420: 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f  NT..**.** 0:   O
2430: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
2440: 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20  unknown..** 1:  
2450: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
2460: 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32  m is Win9x..** 2
2470: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
2480: 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a  stem is WinNT..*
2490: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f  *.** In order to
24a0: 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73 74   facilitate test
24b0: 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73  ing on a WinNT s
24c0: 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20  ystem, the test 
24d0: 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d  fixture.** can m
24e0: 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69 73  anually set this
24f0: 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 65   value to 1 to e
2500: 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65 68  mulate Win98 beh
2510: 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66  avior..*/.#ifdef
2520: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
2530: 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65   sqlite3_os_type
2540: 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74   = 0;.#else.stat
2550: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  ic int sqlite3_o
2560: 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e 64  s_type = 0;.#end
2570: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 59 53 43  if..#ifndef SYSC
2580: 41 4c 4c 0a 23 20 20 64 65 66 69 6e 65 20 53 59  ALL.#  define SY
2590: 53 43 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73 79  SCALL sqlite3_sy
25a0: 73 63 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69 66  scall_ptr.#endif
25b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
25c0: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61  ction is not ava
25d0: 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77  ilable on Window
25e0: 73 20 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a 20  s CE or WinRT.. 
25f0: 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  */..#if SQLITE_O
2600: 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
2610: 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65  E_OS_WINRT.#  de
2620: 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70  fine osAreFileAp
2630: 69 73 41 4e 53 49 28 29 20 20 20 20 20 20 20 31  isANSI()       1
2640: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
2650: 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  any system calls
2660: 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68   are accessed th
2670: 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f  rough pointer-to
2680: 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68  -functions so th
2690: 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62  at.** they may b
26a0: 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20  e overridden at 
26b0: 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c  runtime to facil
26c0: 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65  itate fault inje
26d0: 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20  ction during.** 
26e0: 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64  testing and sand
26f0: 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c  boxing.  The fol
2700: 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c  lowing array hol
2710: 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64  ds the names and
2720: 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20   pointers.** to 
2730: 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65  all overrideable
2740: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a   system calls..*
2750: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
2760: 77 69 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20  win_syscall {.  
2770: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2780: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2790: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73   Name of the sys
27a0: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
27b0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
27c0: 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43  r pCurrent; /* C
27d0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
27e0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
27f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
2800: 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c  call_ptr pDefaul
2810: 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61  t; /* Default va
2820: 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c  lue */.} aSyscal
2830: 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c  l[] = {.#if !SQL
2840: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
2850: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
2860: 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69  .  { "AreFileApi
2870: 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20  sANSI",         
2880: 28 53 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65  (SYSCALL)AreFile
2890: 41 70 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20  ApisANSI,       
28a0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
28b0: 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53   "AreFileApisANS
28c0: 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  I",         (SYS
28d0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
28f0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
2900: 65 66 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  ef osAreFileApis
2910: 41 4e 53 49 0a 23 64 65 66 69 6e 65 20 6f 73 41  ANSI.#define osA
2920: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 20 28  reFileApisANSI (
2930: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 56  (BOOL(WINAPI*)(V
2940: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d  OID))aSyscall[0]
2950: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
2960: 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
2970: 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65  _WINCE && define
2980: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
2990: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68  AS_WIDE).  { "Ch
29a0: 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20  arLowerW",      
29b0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
29c0: 29 43 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20  )CharLowerW,    
29d0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
29e0: 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f  else.  { "CharLo
29f0: 77 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  werW",          
2a00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
2a30: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61  f..#define osCha
2a40: 72 4c 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52  rLowerW ((LPWSTR
2a50: 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52  (WINAPI*)(LPWSTR
2a60: 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43  ))aSyscall[1].pC
2a70: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
2a80: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
2a90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2aa0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2ab0: 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22 2c   { "CharUpperW",
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
2ad0: 59 53 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72  YSCALL)CharUpper
2ae0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W,              
2af0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
2b00: 43 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20  CharUpperW",    
2b10: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
2b20: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
2b40: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
2b50: 20 6f 73 43 68 61 72 55 70 70 65 72 57 20 28 28   osCharUpperW ((
2b60: 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28  LPWSTR(WINAPI*)(
2b70: 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPWSTR))aSyscall
2b80: 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [2].pCurrent).. 
2b90: 20 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22   { "CloseHandle"
2ba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
2bb0: 59 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64  YSCALL)CloseHand
2bc0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
2bd0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
2be0: 43 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f  CloseHandle ((BO
2bf0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
2c00: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e  LE))aSyscall[3].
2c10: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
2c20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
2c30: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
2c40: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c  { "CreateFileA",
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
2c60: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
2c70: 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  A,             0
2c80: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
2c90: 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20  reateFileA",    
2ca0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2cb0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
2cc0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
2cd0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2ce0: 6f 73 43 72 65 61 74 65 46 69 6c 65 41 20 28 28  osCreateFileA ((
2cf0: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
2d00: 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  LPCSTR,DWORD,DWO
2d10: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
2d20: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
2d30: 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  TES,DWORD,DWORD,
2d40: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
2d50: 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [4].pCurrent)..#
2d60: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
2d70: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
2d80: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2d90: 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74  WIDE).  { "Creat
2da0: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
2db0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
2dc0: 65 61 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20  eateFileW,      
2dd0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
2de0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
2df0: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
2e00: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
2e30: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
2e40: 46 69 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57  FileW ((HANDLE(W
2e50: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
2e60: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
2e70: 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54         LPSECURIT
2e80: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f  Y_ATTRIBUTES,DWO
2e90: 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29  RD,DWORD,HANDLE)
2ea0: 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75  )aSyscall[5].pCu
2eb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 28 21 53 51  rrent)..#if (!SQ
2ec0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
2ed0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2ee0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20  WIN32_HAS_ANSI) 
2ef0: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65  && \.        !de
2f00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2f10: 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65  T_WAL)).  { "Cre
2f20: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22  ateFileMappingA"
2f30: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
2f40: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
2f50: 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gA,      0 },.#e
2f60: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
2f70: 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20  ileMappingA",   
2f80: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2fb0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
2fc0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 20 28  teFileMappingA (
2fd0: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
2fe0: 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49  (HANDLE,LPSECURI
2ff0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c  TY_ATTRIBUTES, \
3000: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44  .        DWORD,D
3010: 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54  WORD,DWORD,LPCST
3020: 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70  R))aSyscall[6].p
3030: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
3040: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
3050: 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e   (!SQLITE_OS_WIN
3060: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
3070: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3080: 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20  IDE) && \.      
3090: 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54    !defined(SQLIT
30a0: 45 5f 4f 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b  E_OMIT_WAL)).  {
30b0: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
30c0: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
30d0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d  CALL)CreateFileM
30e0: 61 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20  appingW,      0 
30f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
3100: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
3110: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
3120: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3130: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3140: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3150: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
3160: 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ngW ((HANDLE(WIN
3170: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53  API*)(HANDLE,LPS
3180: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
3190: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
31a0: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
31b0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
31c0: 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[7].pCurrent)..
31d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
31e0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
31f0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3200: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61  _WIDE).  { "Crea
3210: 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20  teMutexW",      
3220: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
3230: 72 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20  reateMutexW,    
3240: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3250: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75  se.  { "CreateMu
3260: 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  texW",          
3270: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
32a0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
32b0: 65 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45  eMutexW ((HANDLE
32c0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55  (WINAPI*)(LPSECU
32d0: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
32e0: 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20  BOOL, \.        
32f0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
3300: 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[8].pCurrent)..
3310: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
3320: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
3330: 49 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  I).  { "DeleteFi
3340: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  leA",           
3350: 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74    (SYSCALL)Delet
3360: 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20  eFileA,         
3370: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3380: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22   { "DeleteFileA"
3390: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
33a0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
33d0: 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c  fine osDeleteFil
33e0: 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eA ((BOOL(WINAPI
33f0: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
3400: 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29  all[9].pCurrent)
3410: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
3420: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
3430: 49 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65  IDE).  { "Delete
3440: 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20  FileW",         
3450: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c      (SYSCALL)Del
3460: 65 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20  eteFileW,       
3470: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3480: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
3490: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
34a0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34c0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
34d0: 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46  define osDeleteF
34e0: 69 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  ileW ((BOOL(WINA
34f0: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
3500: 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72  yscall[10].pCurr
3510: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
3520: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46  _OS_WINCE.  { "F
3530: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
3540: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
3550: 4c 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  L)FileTimeToLoca
3560: 6c 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a  lFileTime, 0 },.
3570: 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54  #else.  { "FileT
3580: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
3590: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  me", (SYSCALL)0,
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
35c0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69  if..#define osFi
35d0: 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
35e0: 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e  eTime ((BOOL(WIN
35f0: 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45  API*)(CONST FILE
3600: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
3610: 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79   LPFILETIME))aSy
3620: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
3630: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
3640: 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69  OS_WINCE.  { "Fi
3650: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
3660: 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  me",    (SYSCALL
3670: 29 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  )FileTimeToSyste
3680: 6d 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23  mTime,    0 },.#
3690: 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69  else.  { "FileTi
36a0: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c  meToSystemTime",
36b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
36e0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c  f..#define osFil
36f0: 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d  eTimeToSystemTim
3700: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
3710: 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45  )(CONST FILETIME
3720: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  *, \.        LPS
3730: 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63  YSTEMTIME))aSysc
3740: 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74  all[12].pCurrent
3750: 29 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c  )..  { "FlushFil
3760: 65 42 75 66 66 65 72 73 22 2c 20 20 20 20 20 20  eBuffers",      
3770: 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68    (SYSCALL)Flush
3780: 46 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20  FileBuffers,    
3790: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
37a0: 65 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66  e osFlushFileBuf
37b0: 66 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41  fers ((BOOL(WINA
37c0: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79  PI*)(HANDLE))aSy
37d0: 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65  scall[13].pCurre
37e0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
37f0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3800: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72  S_ANSI).  { "For
3810: 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20  matMessageA",   
3820: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3830: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20  FormatMessageA, 
3840: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3850: 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d  lse.  { "FormatM
3860: 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20 20  essageA",       
3870: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
38a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d  ..#define osForm
38b0: 61 74 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f  atMessageA ((DWO
38c0: 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  RD(WINAPI*)(DWOR
38d0: 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c  D,LPCVOID,DWORD,
38e0: 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20  DWORD,LPSTR, \. 
38f0: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f         DWORD,va_
3900: 6c 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b  list*))aSyscall[
3910: 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  14].pCurrent)..#
3920: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
3930: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
3940: 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  ).  { "FormatMes
3950: 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20  sageW",         
3960: 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74   (SYSCALL)Format
3970: 4d 65 73 73 61 67 65 57 2c 20 20 20 20 20 20 20  MessageW,       
3980: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3990: 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  { "FormatMessage
39a0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  W",          (SY
39b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
39c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
39d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
39e0: 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  ine osFormatMess
39f0: 61 67 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e  ageW ((DWORD(WIN
3a00: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56  API*)(DWORD,LPCV
3a10: 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  OID,DWORD,DWORD,
3a20: 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  LPWSTR, \.      
3a30: 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a    DWORD,va_list*
3a40: 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70  ))aSyscall[15].p
3a50: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64  Current)..#if !d
3a60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
3a70: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
3a80: 4e 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72  N).  { "FreeLibr
3a90: 61 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  ary",           
3aa0: 20 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c    (SYSCALL)FreeL
3ab0: 69 62 72 61 72 79 2c 20 20 20 20 20 20 20 20 20  ibrary,         
3ac0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3ad0: 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79 22   { "FreeLibrary"
3ae0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
3af0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b10: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
3b20: 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72 61  fine osFreeLibra
3b30: 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  ry ((BOOL(WINAPI
3b40: 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79 73  *)(HMODULE))aSys
3b50: 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e  call[16].pCurren
3b60: 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72 72  t)..  { "GetCurr
3b70: 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20 20  entProcessId",  
3b80: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 43     (SYSCALL)GetC
3b90: 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 2c  urrentProcessId,
3ba0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
3bb0: 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50  ne osGetCurrentP
3bc0: 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52 44  rocessId ((DWORD
3bd0: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
3be0: 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75  aSyscall[17].pCu
3bf0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
3c00: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
3c10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3c20: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
3c30: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
3c40: 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28 53  paceA",       (S
3c50: 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72  YSCALL)GetDiskFr
3c60: 65 65 53 70 61 63 65 41 2c 20 20 20 20 20 20 20  eeSpaceA,       
3c70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3c80: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
3c90: 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  A",       (SYSCA
3ca0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3cc0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3cd0: 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70   osGetDiskFreeSp
3ce0: 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41  aceA ((BOOL(WINA
3cf0: 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44 57  PI*)(LPCSTR,LPDW
3d00: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  ORD,LPDWORD,LPDW
3d10: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
3d20: 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  PDWORD))aSyscall
3d30: 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [18].pCurrent)..
3d40: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
3d50: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
3d60: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
3d70: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3d80: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
3d90: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
3da0: 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  W",       (SYSCA
3db0: 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53 70  LL)GetDiskFreeSp
3dc0: 61 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c  aceW,       0 },
3dd0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44  .#else.  { "GetD
3de0: 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20  iskFreeSpaceW", 
3df0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3e00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3e10: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3e20: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
3e30: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57  etDiskFreeSpaceW
3e40: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
3e50: 28 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44  (LPCWSTR,LPDWORD
3e60: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
3e70: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57  , \.        LPDW
3e80: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39  ORD))aSyscall[19
3e90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3ea0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3eb0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
3ec0: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
3ed0: 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28  ibutesA",      (
3ee0: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41  SYSCALL)GetFileA
3ef0: 74 74 72 69 62 75 74 65 73 41 2c 20 20 20 20 20  ttributesA,     
3f00: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3f10: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
3f20: 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  esA",      (SYSC
3f30: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3f50: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3f60: 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  e osGetFileAttri
3f70: 62 75 74 65 73 41 20 28 28 44 57 4f 52 44 28 57  butesA ((DWORD(W
3f80: 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29  INAPI*)(LPCSTR))
3f90: 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75  aSyscall[20].pCu
3fa0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
3fb0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
3fc0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3fd0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
3fe0: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
3ff0: 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53  butesW",      (S
4000: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
4010: 74 72 69 62 75 74 65 73 57 2c 20 20 20 20 20 20  tributesW,      
4020: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4030: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4040: 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  sW",      (SYSCA
4050: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4060: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4070: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4080: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
4090: 75 74 65 73 57 20 28 28 44 57 4f 52 44 28 57 49  utesW ((DWORD(WI
40a0: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29  NAPI*)(LPCWSTR))
40b0: 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75  aSyscall[21].pCu
40c0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
40d0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
40e0: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
40f0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4100: 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41  sExW",    (SYSCA
4110: 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69 62  LL)GetFileAttrib
4120: 75 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c  utesExW,    0 },
4130: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
4140: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
4150: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ",    (SYSCALL)0
4160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4170: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4180: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4190: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
41a0: 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ExW ((BOOL(WINAP
41b0: 49 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f  I*)(LPCWSTR,GET_
41c0: 46 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45  FILEEX_INFO_LEVE
41d0: 4c 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  LS, \.        LP
41e0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
41f0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
4200: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
4210: 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53  RT.  { "GetFileS
4220: 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ize",           
4230: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
4240: 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
4250: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4260: 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22   { "GetFileSize"
4270: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4280: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
42b0: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69  fine osGetFileSi
42c0: 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  ze ((DWORD(WINAP
42d0: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f  I*)(HANDLE,LPDWO
42e0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d  RD))aSyscall[23]
42f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4300: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
4310: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4320: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
4330: 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  I).  { "GetFullP
4340: 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20  athNameA",      
4350: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75    (SYSCALL)GetFu
4360: 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20  llPathNameA,    
4370: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4380: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
4390: 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28 53  ameA",        (S
43a0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43c0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
43d0: 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61  fine osGetFullPa
43e0: 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28  thNameA ((DWORD(
43f0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c  WINAPI*)(LPCSTR,
4400: 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20  DWORD,LPSTR, \. 
4410: 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61         LPSTR*))a
4420: 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72  Syscall[24].pCur
4430: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4440: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
4450: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
4460: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
4470: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
4480: 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  ).  { "GetFullPa
4490: 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20  thNameW",       
44a0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c   (SYSCALL)GetFul
44b0: 6c 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20  lPathNameW,     
44c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
44d0: 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  { "GetFullPathNa
44e0: 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53 59  meW",        (SY
44f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4510: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4520: 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  ine osGetFullPat
4530: 68 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57  hNameW ((DWORD(W
4540: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
4550: 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a  DWORD,LPWSTR, \.
4560: 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29          LPWSTR*)
4570: 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43  )aSyscall[25].pC
4580: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
4590: 74 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20  tLastError",    
45a0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
45b0: 29 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  )GetLastError,  
45c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
45d0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73  #define osGetLas
45e0: 74 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57  tError ((DWORD(W
45f0: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
4600: 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72  yscall[26].pCurr
4610: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
4620: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
4630: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23  OAD_EXTENSION).#
4640: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
4650: 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50  CE.  /* The GetP
4660: 72 6f 63 41 64 64 72 65 73 73 41 28 29 20 72 6f  rocAddressA() ro
4670: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76  utine is only av
4680: 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f  ailable on Windo
4690: 77 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47  ws CE. */.  { "G
46a0: 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c  etProcAddressA",
46b0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
46c0: 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  L)GetProcAddress
46d0: 41 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  A,         0 },.
46e0: 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f  #else.  /* All o
46f0: 74 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61  ther Windows pla
4700: 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65  tforms expect Ge
4710: 74 50 72 6f 63 41 64 64 72 65 73 73 28 29 20 74  tProcAddress() t
4720: 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41  o take.  ** an A
4730: 4e 53 49 20 73 74 72 69 6e 67 20 72 65 67 61 72  NSI string regar
4740: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e  dless of the _UN
4750: 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f  ICODE setting */
4760: 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64  .  { "GetProcAdd
4770: 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20 20  ressA",         
4780: 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63  (SYSCALL)GetProc
4790: 41 64 64 72 65 73 73 2c 20 20 20 20 20 20 20 20  Address,        
47a0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65    0 },.#endif.#e
47b0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f 63  lse.  { "GetProc
47c0: 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20  AddressA",      
47d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
47e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4800: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50  ..#define osGetP
4810: 72 6f 63 41 64 64 72 65 73 73 41 20 28 28 46 41  rocAddressA ((FA
4820: 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48  RPROC(WINAPI*)(H
4830: 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20  MODULE, \.      
4840: 20 20 4c 50 43 53 54 52 29 29 61 53 79 73 63 61    LPCSTR))aSysca
4850: 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[27].pCurrent)
4860: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
4870: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53  _WINRT.  { "GetS
4880: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
4890: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
48a0: 65 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20  etSystemInfo,   
48b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
48c0: 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  se.  { "GetSyste
48d0: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20  mInfo",         
48e0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4900: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4910: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79  .#define osGetSy
4920: 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28  stemInfo ((VOID(
4930: 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45  WINAPI*)(LPSYSTE
4940: 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c  M_INFO))aSyscall
4950: 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [28].pCurrent)..
4960: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69    { "GetSystemTi
4970: 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  me",           (
4980: 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65  SYSCALL)GetSyste
4990: 6d 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20  mTime,          
49a0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
49b0: 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28  sGetSystemTime (
49c0: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c  (VOID(WINAPI*)(L
49d0: 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79  PSYSTEMTIME))aSy
49e0: 73 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65  scall[29].pCurre
49f0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
4a00: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47  _OS_WINCE.  { "G
4a10: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
4a20: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
4a30: 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41  L)GetSystemTimeA
4a40: 73 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a  sFileTime, 0 },.
4a50: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79  #else.  { "GetSy
4a60: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
4a70: 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  me", (SYSCALL)0,
4a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a90: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4aa0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
4ab0: 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
4ac0: 65 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e  eTime ((VOID(WIN
4ad0: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
4ae0: 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79   LPFILETIME))aSy
4af0: 73 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65  scall[30].pCurre
4b00: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
4b10: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
4b20: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
4b30: 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20  TempPathA",     
4b40: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4b50: 47 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20  GetTempPathA,   
4b60: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4b70: 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  lse.  { "GetTemp
4b80: 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20 20  PathA",         
4b90: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4bb0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4bc0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54  ..#define osGetT
4bd0: 65 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52 44  empPathA ((DWORD
4be0: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
4bf0: 4c 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  LPSTR))aSyscall[
4c00: 33 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  31].pCurrent)..#
4c10: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
4c20: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
4c30: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4c40: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65  WIDE).  { "GetTe
4c50: 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20  mpPathW",       
4c60: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
4c70: 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20  tTempPathW,     
4c80: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4c90: 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  e.  { "GetTempPa
4ca0: 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  thW",           
4cb0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cd0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4ce0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d  #define osGetTem
4cf0: 70 50 61 74 68 57 20 28 28 44 57 4f 52 44 28 57  pPathW ((DWORD(W
4d00: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
4d10: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33  WSTR))aSyscall[3
4d20: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
4d30: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
4d40: 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  RT.  { "GetTickC
4d50: 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
4d60: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69    (SYSCALL)GetTi
4d70: 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20  ckCount,        
4d80: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4d90: 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74   { "GetTickCount
4da0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4db0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4de0: 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f  fine osGetTickCo
4df0: 75 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41  unt ((DWORD(WINA
4e00: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
4e10: 61 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74  all[33].pCurrent
4e20: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4e30: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4e40: 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 56 65  ANSI).  { "GetVe
4e50: 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20  rsionExA",      
4e60: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
4e70: 74 56 65 72 73 69 6f 6e 45 78 41 2c 20 20 20 20  tVersionExA,    
4e80: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4e90: 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  e.  { "GetVersio
4ea0: 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20  nExA",          
4eb0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4ee0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72  #define osGetVer
4ef0: 73 69 6f 6e 45 78 41 20 28 28 42 4f 4f 4c 28 57  sionExA ((BOOL(W
4f00: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
4f10: 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e     LPOSVERSIONIN
4f20: 46 4f 41 29 29 61 53 79 73 63 61 6c 6c 5b 33 34  FOA))aSyscall[34
4f30: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
4f40: 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20   "HeapAlloc",   
4f50: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4f60: 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20  CALL)HeapAlloc, 
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4f80: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
4f90: 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44  apAlloc ((LPVOID
4fa0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
4fb0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
4fc0: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
4fd0: 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[35].pCurrent)
4fe0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
4ff0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
5000: 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20  Create",        
5010: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
5020: 65 61 70 43 72 65 61 74 65 2c 20 20 20 20 20 20  eapCreate,      
5030: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5040: 73 65 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61  se.  { "HeapCrea
5050: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
5060: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5080: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5090: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43  .#define osHeapC
50a0: 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28 57  reate ((HANDLE(W
50b0: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53 49  INAPI*)(DWORD,SI
50c0: 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20 20  ZE_T, \.        
50d0: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
50e0: 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [36].pCurrent)..
50f0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5100: 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 44 65  INRT.  { "HeapDe
5110: 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20  stroy",         
5120: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
5130: 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20  pDestroy,       
5140: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5150: 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f  .  { "HeapDestro
5160: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
5170: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
51a0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 44 65 73  define osHeapDes
51b0: 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41  troy ((BOOL(WINA
51c0: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79  PI*)(HANDLE))aSy
51d0: 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65  scall[37].pCurre
51e0: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 46 72  nt)..  { "HeapFr
51f0: 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ee",            
5200: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
5210: 70 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  pFree,          
5220: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
5230: 69 6e 65 20 6f 73 48 65 61 70 46 72 65 65 20 28  ine osHeapFree (
5240: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
5250: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f  ANDLE,DWORD,LPVO
5260: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d  ID))aSyscall[38]
5270: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5280: 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20  "HeapReAlloc",  
5290: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
52a0: 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c  ALL)HeapReAlloc,
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
52c0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
52d0: 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49  pReAlloc ((LPVOI
52e0: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
52f0: 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20  E,DWORD,LPVOID, 
5300: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
5310: 29 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70  ))aSyscall[39].p
5320: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
5330: 65 61 70 53 69 7a 65 22 2c 20 20 20 20 20 20 20  eapSize",       
5340: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5350: 4c 29 48 65 61 70 53 69 7a 65 2c 20 20 20 20 20  L)HeapSize,     
5360: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5370: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 53  .#define osHeapS
5380: 69 7a 65 20 28 28 53 49 5a 45 5f 54 28 57 49 4e  ize ((SIZE_T(WIN
5390: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
53a0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
53b0: 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  CVOID))aSyscall[
53c0: 34 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  40].pCurrent)..#
53d0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
53e0: 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 56 61 6c  NRT.  { "HeapVal
53f0: 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  idate",         
5400: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
5410: 56 61 6c 69 64 61 74 65 2c 20 20 20 20 20 20 20  Validate,       
5420: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5430: 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74    { "HeapValidat
5440: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
5450: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5480: 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69  efine osHeapVali
5490: 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  date ((BOOL(WINA
54a0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
54b0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
54c0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  VOID))aSyscall[4
54d0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
54e0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
54f0: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
5500: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
5510: 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
5520: 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f  TENSION).  { "Lo
5530: 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20  adLibraryA",    
5540: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5550: 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c 20 20  )LoadLibraryA,  
5560: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5570: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69  else.  { "LoadLi
5580: 62 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20  braryA",        
5590: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
55c0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61  f..#define osLoa
55d0: 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d 4f 44  dLibraryA ((HMOD
55e0: 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ULE(WINAPI*)(LPC
55f0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 32  STR))aSyscall[42
5600: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5610: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5620: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
5630: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
5640: 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20  DE) && \.       
5650: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5660: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
5670: 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c  SION).  { "LoadL
5680: 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 20 20  ibraryW",       
5690: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
56a0: 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20 20 20  adLibraryW,     
56b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
56c0: 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  e.  { "LoadLibra
56d0: 72 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryW",           
56e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5710: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69  #define osLoadLi
5720: 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55 4c 45  braryW ((HMODULE
5730: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
5740: 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e  R))aSyscall[43].
5750: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5760: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
5770: 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c    { "LocalFree",
5780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5790: 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65  SYSCALL)LocalFre
57a0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
57b0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
57c0: 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20  "LocalFree",    
57d0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
57e0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
57f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5800: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5810: 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28 28  e osLocalFree ((
5820: 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29 28  HLOCAL(WINAPI*)(
5830: 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c 6c  HLOCAL))aSyscall
5840: 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [44].pCurrent)..
5850: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5860: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
5870: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f  OS_WINRT.  { "Lo
5880: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
5890: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
58a0: 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20  )LockFile,      
58b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
58c0: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69  else.  { "LockFi
58d0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
58e0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
58f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5900: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5910: 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63  f..#ifndef osLoc
5920: 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73  kFile.#define os
5930: 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28  LockFile ((BOOL(
5940: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
5950: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
5960: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  D, \.        DWO
5970: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d  RD))aSyscall[45]
5980: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
5990: 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
59a0: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f 63  S_WINCE.  { "Loc
59b0: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
59c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
59d0: 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20  LockFileEx,     
59e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
59f0: 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  lse.  { "LockFil
5a00: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
5a10: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a30: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5a40: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b  ..#ifndef osLock
5a50: 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65 20 6f  FileEx.#define o
5a60: 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f  sLockFileEx ((BO
5a70: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
5a80: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
5a90: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
5aa0: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50        LPOVERLAPP
5ab0: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d  ED))aSyscall[46]
5ac0: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
5ad0: 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
5ae0: 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49  _WINCE || (!SQLI
5af0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
5b00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
5b10: 4d 49 54 5f 57 41 4c 29 29 0a 20 20 7b 20 22 4d  MIT_WAL)).  { "M
5b20: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
5b30: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5b40: 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  L)MapViewOfFile,
5b50: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5b60: 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69  #else.  { "MapVi
5b70: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
5b80: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ba0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5bb0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61  if..#define osMa
5bc0: 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c 50  pViewOfFile ((LP
5bd0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
5be0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
5bf0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
5c00: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
5c10: 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[47].pCurrent)
5c20: 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74 65  ..  { "MultiByte
5c30: 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20 20  ToWideChar",    
5c40: 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42   (SYSCALL)MultiB
5c50: 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20 20  yteToWideChar,  
5c60: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5c70: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
5c80: 64 65 43 68 61 72 20 28 28 69 6e 74 28 57 49 4e  deChar ((int(WIN
5c90: 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44  API*)(UINT,DWORD
5ca0: 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53  ,LPCSTR,int,LPWS
5cb0: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69 6e  TR, \.        in
5cc0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d 2e  t))aSyscall[48].
5cd0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5ce0: 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
5cf0: 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43 41  Counter", (SYSCA
5d00: 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d 61  LL)QueryPerforma
5d10: 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c  nceCounter, 0 },
5d20: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65 72  ..#define osQuer
5d30: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
5d40: 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ter ((BOOL(WINAP
5d50: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
5d60: 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29 61  ARGE_INTEGER*))a
5d70: 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72  Syscall[49].pCur
5d80: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61 64  rent)..  { "Read
5d90: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
5da0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52        (SYSCALL)R
5db0: 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20  eadFile,        
5dc0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
5dd0: 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65  efine osReadFile
5de0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
5df0: 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44  (HANDLE,LPVOID,D
5e00: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
5e10: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
5e20: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  PPED))aSyscall[5
5e30: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  0].pCurrent)..  
5e40: 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65 22  { "SetEndOfFile"
5e50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5e60: 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69  SCALL)SetEndOfFi
5e70: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  le,            0
5e80: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53   },..#define osS
5e90: 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f  etEndOfFile ((BO
5ea0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
5eb0: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d  LE))aSyscall[51]
5ec0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
5ed0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5ee0: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
5ef0: 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20  nter",          
5f00: 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65  (SYSCALL)SetFile
5f10: 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20 20  Pointer,        
5f20: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5f30: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
5f40: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
5f50: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5f70: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5f80: 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e  ne osSetFilePoin
5f90: 74 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ter ((DWORD(WINA
5fa0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47  PI*)(HANDLE,LONG
5fb0: 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20  ,PLONG, \.      
5fc0: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
5fd0: 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[52].pCurrent).
5fe0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5ff0: 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70  WINRT.  { "Sleep
6000: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6010: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c       (SYSCALL)Sl
6020: 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
6030: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6040: 65 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20  e.  { "Sleep",  
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6060: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6090: 23 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20  #define osSleep 
60a0: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
60b0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
60c0: 35 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  53].pCurrent).. 
60d0: 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f   { "SystemTimeTo
60e0: 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53  FileTime",    (S
60f0: 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d  YSCALL)SystemTim
6100: 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20  eToFileTime,    
6110: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6120: 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
6130: 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Time ((BOOL(WINA
6140: 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45  PI*)(CONST SYSTE
6150: 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20  MTIME*, \.      
6160: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
6170: 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72  yscall[54].pCurr
6180: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6190: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
61a0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
61b0: 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c   { "UnlockFile",
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
61d0: 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c  YSCALL)UnlockFil
61e0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
61f0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6200: 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20  UnlockFile",    
6210: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6220: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6230: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6240: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
6250: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64   osUnlockFile.#d
6260: 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69  efine osUnlockFi
6270: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
6280: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
6290: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
62a0: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
62b0: 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72  yscall[55].pCurr
62c0: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
62d0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
62e0: 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  E.  { "UnlockFil
62f0: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
6300: 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b   (SYSCALL)Unlock
6310: 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20  FileEx,         
6320: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6330: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22  { "UnlockFileEx"
6340: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
6350: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6370: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6380: 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  ine osUnlockFile
6390: 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  Ex ((BOOL(WINAPI
63a0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
63b0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
63c0: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
63d0: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 36  PED))aSyscall[56
63e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
63f0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
6400: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
6410: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20 20  ITE_OMIT_WAL).  
6420: 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69  { "UnmapViewOfFi
6430: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  le",         (SY
6440: 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77 4f  SCALL)UnmapViewO
6450: 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 30  fFile,         0
6460: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
6470: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c  nmapViewOfFile",
6480: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6490: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
64a0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
64b0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
64c0: 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
64d0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
64e0: 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63  )(LPCVOID))aSysc
64f0: 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65 6e 74  all[57].pCurrent
6500: 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 61 72  )..  { "WideChar
6510: 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 20 20  ToMultiByte",   
6520: 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64 65 43    (SYSCALL)WideC
6530: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c 20  harToMultiByte, 
6540: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
6550: 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  e osWideCharToMu
6560: 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28 57 49  ltiByte ((int(WI
6570: 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52  NAPI*)(UINT,DWOR
6580: 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c 50  D,LPCWSTR,int,LP
6590: 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20 20  STR,int, \.     
65a0: 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f 4c     LPCSTR,LPBOOL
65b0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d 2e 70  ))aSyscall[58].p
65c0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57  Current)..  { "W
65d0: 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20 20 20  riteFile",      
65e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
65f0: 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20 20 20  L)WriteFile,    
6600: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6610: 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65  .#define osWrite
6620: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
6630: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43 56  PI*)(HANDLE,LPCV
6640: 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52  OID,DWORD,LPDWOR
6650: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
6660: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
6670: 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65 6e 74  all[59].pCurrent
6680: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
6690: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61  _WINRT.  { "Crea
66a0: 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20  teEventExW",    
66b0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
66c0: 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c 20 20  reateEventExW,  
66d0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
66e0: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76  se.  { "CreateEv
66f0: 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20  entExW",        
6700: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6730: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
6740: 65 45 76 65 6e 74 45 78 57 20 28 28 48 41 4e 44  eEventExW ((HAND
6750: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45  LE(WINAPI*)(LPSE
6760: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
6770: 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20  S,LPCWSTR, \.   
6780: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44       DWORD,DWORD
6790: 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e 70  ))aSyscall[60].p
67a0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
67b0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
67c0: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
67d0: 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53  eObject",     (S
67e0: 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69  YSCALL)WaitForSi
67f0: 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20 20  ngleObject,     
6800: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6810: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
6820: 65 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41  ect",     (SYSCA
6830: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6840: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6850: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6860: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
6870: 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44 28 57  Object ((DWORD(W
6880: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20  INAPI*)(HANDLE, 
6890: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
68a0: 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43  )aSyscall[61].pC
68b0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
68c0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
68d0: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
68e0: 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53  bjectEx",   (SYS
68f0: 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67  CALL)WaitForSing
6900: 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30 20  leObjectEx,   0 
6910: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57 61  },.#else.  { "Wa
6920: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
6930: 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c  tEx",   (SYSCALL
6940: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6950: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6960: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6970: 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  sWaitForSingleOb
6980: 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44 28 57  jectEx ((DWORD(W
6990: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
69a0: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
69b0: 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36  BOOL))aSyscall[6
69c0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
69d0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
69e0: 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  T.  { "SetFilePo
69f0: 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20 20  interEx",       
6a00: 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c   (SYSCALL)SetFil
6a10: 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20 20 20  ePointerEx,     
6a20: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6a30: 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  { "SetFilePointe
6a40: 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59  rEx",        (SY
6a50: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6a70: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6a80: 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69  ine osSetFilePoi
6a90: 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28 57 49  nterEx ((BOOL(WI
6aa0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 41  NAPI*)(HANDLE,LA
6ab0: 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a 20  RGE_INTEGER, \. 
6ac0: 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f 49 4e         PLARGE_IN
6ad0: 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61 53 79  TEGER,DWORD))aSy
6ae0: 73 63 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65  scall[63].pCurre
6af0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
6b00: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65  OS_WINRT.  { "Ge
6b10: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
6b20: 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59  ByHandleEx", (SY
6b30: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e 66  SCALL)GetFileInf
6b40: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
6b50: 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  Ex, 0 },.#else. 
6b60: 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72   { "GetFileInfor
6b70: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
6b80: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
6b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ba0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6bb0: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 49 6e  fine osGetFileIn
6bc0: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
6bd0: 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  eEx ((BOOL(WINAP
6be0: 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20  I*)(HANDLE, \.  
6bf0: 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f 5f        FILE_INFO_
6c00: 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53 2c  BY_HANDLE_CLASS,
6c10: 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29 61 53  LPVOID,DWORD))aS
6c20: 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72  yscall[64].pCurr
6c30: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
6c40: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
6c50: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
6c60: 54 5f 57 41 4c 29 0a 20 20 7b 20 22 4d 61 70 56  T_WAL).  { "MapV
6c70: 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70  iewOfFileFromApp
6c80: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d  ",    (SYSCALL)M
6c90: 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
6ca0: 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  App,    0 },.#el
6cb0: 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  se.  { "MapViewO
6cc0: 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20  fFileFromApp",  
6cd0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6d00: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69  .#define osMapVi
6d10: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20  ewOfFileFromApp 
6d20: 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a  ((LPVOID(WINAPI*
6d30: 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55  )(HANDLE,ULONG,U
6d40: 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20  LONG64, \.      
6d50: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
6d60: 6c 6c 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[65].pCurrent)
6d70: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
6d80: 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74  WINRT.  { "Creat
6d90: 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20  eFile2",        
6da0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
6db0: 65 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20  eateFile2,      
6dc0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
6dd0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
6de0: 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  e2",            
6df0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e10: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6e20: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
6e30: 46 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57  File2 ((HANDLE(W
6e40: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
6e50: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
6e60: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
6e70: 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e  REATEFILE2_EXTEN
6e80: 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29  DED_PARAMETERS))
6e90: 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75  aSyscall[66].pCu
6ea0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
6eb0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
6ec0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6ed0: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
6ee0: 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63  ON).  { "LoadPac
6ef0: 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20  kagedLibrary",  
6f00: 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64     (SYSCALL)Load
6f10: 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 2c  PackagedLibrary,
6f20: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6f30: 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65    { "LoadPackage
6f40: 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28  dLibrary",     (
6f50: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f70: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6f80: 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b  efine osLoadPack
6f90: 61 67 65 64 4c 69 62 72 61 72 79 20 28 28 48 4d  agedLibrary ((HM
6fa0: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
6fb0: 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20  PCWSTR, \.      
6fc0: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
6fd0: 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[67].pCurrent).
6fe0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
6ff0: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63  INRT.  { "GetTic
7000: 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20  kCount64",      
7010: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
7020: 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20  TickCount64,    
7030: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7040: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
7050: 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20  nt64",          
7060: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7090: 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b  define osGetTick
70a0: 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c  Count64 ((ULONGL
70b0: 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  ONG(WINAPI*)(VOI
70c0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e  D))aSyscall[68].
70d0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
70e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
70f0: 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79 73   { "GetNativeSys
7100: 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53  temInfo",     (S
7110: 59 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76 65  YSCALL)GetNative
7120: 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20  SystemInfo,     
7130: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7140: 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
7150: 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41  nfo",     (SYSCA
7160: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7170: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7180: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7190: 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74   osGetNativeSyst
71a0: 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49  emInfo ((VOID(WI
71b0: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
71c0: 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29    LPSYSTEM_INFO)
71d0: 29 61 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43  )aSyscall[69].pC
71e0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
71f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
7200: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
7210: 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  "OutputDebugStri
7220: 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngA",      (SYSC
7230: 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53  ALL)OutputDebugS
7240: 74 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d  tringA,      0 }
7250: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74  ,.#else.  { "Out
7260: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22  putDebugStringA"
7270: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
7280: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7290: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
72a0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
72b0: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
72c0: 67 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  gA ((VOID(WINAPI
72d0: 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63  *)(LPCSTR))aSysc
72e0: 61 6c 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74  all[70].pCurrent
72f0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
7300: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
7310: 57 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70 75  WIDE).  { "Outpu
7320: 74 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20  tDebugStringW", 
7330: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75       (SYSCALL)Ou
7340: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57  tputDebugStringW
7350: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
7360: 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  e.  { "OutputDeb
7370: 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20  ugStringW",     
7380: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
73b0: 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74  #define osOutput
73c0: 44 65 62 75 67 53 74 72 69 6e 67 57 20 28 28 56  DebugStringW ((V
73d0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OID(WINAPI*)(LPC
73e0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37  WSTR))aSyscall[7
73f0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
7400: 7b 20 22 47 65 74 50 72 6f 63 65 73 73 48 65 61  { "GetProcessHea
7410: 70 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  p",          (SY
7420: 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 65 73 73  SCALL)GetProcess
7430: 48 65 61 70 2c 20 20 20 20 20 20 20 20 20 20 30  Heap,          0
7440: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
7450: 65 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 28  etProcessHeap ((
7460: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
7470: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37  VOID))aSyscall[7
7480: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
7490: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
74a0: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
74b0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a 20  LITE_OMIT_WAL). 
74c0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
74d0: 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28  ppingFromApp", (
74e0: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
74f0: 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
7500: 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b  , 0 },.#else.  {
7510: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
7520: 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59  ingFromApp", (SY
7530: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7550: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7560: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d  ne osCreateFileM
7570: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 20 28 28  appingFromApp ((
7580: 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28  HANDLE(WINAPI*)(
7590: 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20  HANDLE, \.      
75a0: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
75b0: 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c  RIBUTES,ULONG,UL
75c0: 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52 29 29 61  ONG64,LPCWSTR))a
75d0: 53 79 73 63 61 6c 6c 5b 37 33 5d 2e 70 43 75 72  Syscall[73].pCur
75e0: 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  rent)..}; /* End
75f0: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
7600: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
7610: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s */../*.** This
7620: 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74   is the xSetSyst
7630: 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20  emCall() method 
7640: 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66  of sqlite3_vfs f
7650: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  or all of the.**
7660: 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20   "win32" VFSes. 
7670: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
7680: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
7690: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
76a0: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
76b0: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
76c0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
76d0: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
76e0: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
76f0: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
7700: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
7710: 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61  t winSetSystemCa
7720: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
7730: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20  s *pNotUsed,    
7740: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70      /* The VFS p
7750: 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65  ointer.  Not use
7760: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
7770: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
7780: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
7790: 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f  system call to o
77a0: 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c  verride */.  sql
77b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
77c0: 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f   pNewFunc  /* Po
77d0: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73  inter to new sys
77e0: 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a  tem call value *
77f0: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
7800: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
7810: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
7820: 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  D;..  UNUSED_PAR
7830: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
7840: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
7850: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   ){.    /* If no
7860: 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c   zName is given,
7870: 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73   restore all sys
7880: 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  tem calls to the
7890: 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  ir default.    *
78a0: 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72  * settings and r
78b0: 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a  eturn NULL.    *
78c0: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
78d0: 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d  E_OK;.    for(i=
78e0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
78f0: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
7900: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
7910: 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63  .      if( aSysc
7920: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
7930: 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  ){.        aSysc
7940: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
7950: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
7960: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a  efault;.      }.
7970: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
7980: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
7990: 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65  s specified, ope
79a0: 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65  rate on only the
79b0: 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   one system call
79c0: 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65  .    ** specifie
79d0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
79e0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
79f0: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
7a00: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
7a10: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
7a20: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
7a30: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
7a40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
7a50: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
7a60: 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  efault==0 ){.   
7a70: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
7a80: 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53  i].pDefault = aS
7a90: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
7aa0: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
7ab0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
7ac0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
7ad0: 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20  ( pNewFunc==0 ) 
7ae0: 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63  pNewFunc = aSysc
7af0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
7b00: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
7b10: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
7b20: 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20  pNewFunc;.      
7b30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
7b40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
7b50: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
7b60: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
7b70: 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61  e of a system ca
7b80: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
7b90: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
7ba0: 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64   a.** recognized
7bb0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
7bc0: 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f  e.  NULL is also
7bd0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
7be0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20   system call.** 
7bf0: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  is currently und
7c00: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
7c10: 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  c sqlite3_syscal
7c20: 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74  l_ptr winGetSyst
7c30: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
7c40: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
7c50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7c60: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
7c70: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
7c80: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
7c90: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
7ca0: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
7cb0: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
7cc0: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
7cd0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
7ce0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
7cf0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
7d00: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
7d10: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
7d20: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
7d30: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7d40: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
7d50: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
7d60: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
7d70: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
7d80: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
7d90: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
7da0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
7db0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
7dc0: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
7dd0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
7de0: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
7df0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
7e00: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
7e10: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
7e20: 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e  const char *winN
7e30: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
7e40: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
7e50: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
7e60: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a  {.  int i = -1;.
7e70: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
7e80: 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e  TER(p);.  if( zN
7e90: 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ame ){.    for(i
7ea0: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
7eb0: 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b  aSyscall)-1; i++
7ec0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
7ed0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
7ee0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
7ef0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
7f00: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
7f10: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
7f20: 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  all); i++){.    
7f30: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
7f40: 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65  pCurrent!=0 ) re
7f50: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
7f60: 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65  .zName;.  }.  re
7f70: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
7f80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f   This function o
7f90: 75 74 70 75 74 73 20 74 68 65 20 73 70 65 63 69  utputs the speci
7fa0: 66 69 65 64 20 28 41 4e 53 49 29 20 73 74 72 69  fied (ANSI) stri
7fb0: 6e 67 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20  ng to the Win32 
7fc0: 64 65 62 75 67 67 65 72 0a 2a 2a 20 28 69 66 20  debugger.** (if 
7fd0: 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a  available)..*/..
7fe0: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e  void sqlite3_win
7ff0: 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28 63  32_write_debug(c
8000: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 75 66 2c  onst char *zBuf,
8010: 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20 63 68   int nBuf){.  ch
8020: 61 72 20 7a 44 62 67 42 75 66 5b 53 51 4c 49 54  ar zDbgBuf[SQLIT
8030: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
8040: 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69  SIZE];.  int nMi
8050: 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 20 28 53  n = MIN(nBuf, (S
8060: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
8070: 42 55 46 5f 53 49 5a 45 20 2d 20 31 29 29 3b 20  BUF_SIZE - 1)); 
8080: 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67 61 74 69  /* may be negati
8090: 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 4d 69  ve. */.  if( nMi
80a0: 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d 20 2d 31  n<-1 ) nMin = -1
80b0: 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61 74 69 76  ; /* all negativ
80c0: 65 20 76 61 6c 75 65 73 20 62 65 63 6f 6d 65 20  e values become 
80d0: 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  -1. */.  assert(
80e0: 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69   nMin==-1 || nMi
80f0: 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c  n==0 || nMin<SQL
8100: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
8110: 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66 20 64 65  F_SIZE );.#if de
8120: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
8130: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 69  32_HAS_ANSI).  i
8140: 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20  f( nMin>0 ){.   
8150: 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c   memset(zDbgBuf,
8160: 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   0, SQLITE_WIN32
8170: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a  _DBG_BUF_SIZE);.
8180: 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42      memcpy(zDbgB
8190: 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b  uf, zBuf, nMin);
81a0: 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62  .    osOutputDeb
81b0: 75 67 53 74 72 69 6e 67 41 28 7a 44 62 67 42 75  ugStringA(zDbgBu
81c0: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
81d0: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
81e0: 72 69 6e 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d  ringA(zBuf);.  }
81f0: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
8200: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
8210: 57 49 44 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a  WIDE).  memset(z
8220: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, SQLIT
8230: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
8240: 53 49 5a 45 29 3b 0a 20 20 69 66 20 28 20 6f 73  SIZE);.  if ( os
8250: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
8260: 68 61 72 28 0a 20 20 20 20 20 20 20 20 20 20 6f  har(.          o
8270: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
8280: 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50  () ? CP_ACP : CP
8290: 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c  _OEMCP, 0, zBuf,
82a0: 0a 20 20 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c  .          nMin,
82b0: 20 28 4c 50 57 53 54 52 29 7a 44 62 67 42 75 66   (LPWSTR)zDbgBuf
82c0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
82d0: 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65  BG_BUF_SIZE/size
82e0: 6f 66 28 57 43 48 41 52 29 29 3c 3d 30 20 29 7b  of(WCHAR))<=0 ){
82f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8300: 0a 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67  .  osOutputDebug
8310: 53 74 72 69 6e 67 57 28 28 4c 50 43 57 53 54 52  StringW((LPCWSTR
8320: 29 7a 44 62 67 42 75 66 29 3b 0a 23 65 6c 73 65  )zDbgBuf);.#else
8330: 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b  .  if( nMin>0 ){
8340: 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67  .    memset(zDbg
8350: 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57  Buf, 0, SQLITE_W
8360: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
8370: 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  E);.    memcpy(z
8380: 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d  DbgBuf, zBuf, nM
8390: 69 6e 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  in);.    fprintf
83a0: 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a  (stderr, "%s", z
83b0: 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65  DbgBuf);.  }else
83c0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
83d0: 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 42 75 66  derr, "%s", zBuf
83e0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
83f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
8400: 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 75 73  wing routine sus
8410: 70 65 6e 64 73 20 74 68 65 20 63 75 72 72 65 6e  pends the curren
8420: 74 20 74 68 72 65 61 64 20 66 6f 72 20 61 74 20  t thread for at 
8430: 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c  least ms.** mill
8440: 69 73 65 63 6f 6e 64 73 2e 20 20 54 68 69 73 20  iseconds.  This 
8450: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
8460: 20 74 68 65 20 57 69 6e 33 32 20 53 6c 65 65 70   the Win32 Sleep
8470: 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  () interface..*/
8480: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
8490: 49 4e 52 54 0a 73 74 61 74 69 63 20 48 41 4e 44  INRT.static HAND
84a0: 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55  LE sleepObj = NU
84b0: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64  LL;.#endif..void
84c0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
84d0: 6c 65 65 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69  leep(DWORD milli
84e0: 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51  seconds){.#if SQ
84f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
8500: 69 66 20 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e  if ( sleepObj==N
8510: 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c 65 65 70  ULL ){.    sleep
8520: 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74 65 45 76  Obj = osCreateEv
8530: 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c  entExW(NULL, NUL
8540: 4c 2c 20 43 52 45 41 54 45 5f 45 56 45 4e 54 5f  L, CREATE_EVENT_
8550: 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20  MANUAL_RESET,.  
8560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 59                SY
8580: 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a  NCHRONIZE);.  }.
8590: 20 20 61 73 73 65 72 74 28 20 73 6c 65 65 70 4f    assert( sleepO
85a0: 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73  bj!=NULL );.  os
85b0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
85c0: 65 63 74 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20  ectEx(sleepObj, 
85d0: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41  milliseconds, FA
85e0: 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73  LSE);.#else.  os
85f0: 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e  Sleep(millisecon
8600: 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  ds);.#endif.}../
8610: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
8620: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77   (non-zero) if w
8630: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e  e are running un
8640: 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b  der WinNT, Win2K
8650: 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57  , WinXP,.** or W
8660: 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66 61  inCE.  Return fa
8670: 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57  lse (zero) for W
8680: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20  in95, Win98, or 
8690: 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72  WinME..**.** Her
86a0: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74  e is an interest
86b0: 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a  ing observation:
86c0: 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20    Win95, Win98, 
86d0: 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a  and WinME lack.*
86e0: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  * the LockFileEx
86f0: 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 20  () API.  But we 
8700: 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63  can still static
8710: 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73  ally link agains
8720: 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73  t that.** API as
8730: 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27   long as we don'
8740: 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20 72  t call it when r
8750: 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f  unning Win95/98/
8760: 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a  ME.  A call to.*
8770: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
8780: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
8790: 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20  ine if the host 
87a0: 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f  is Win95/98/ME o
87b0: 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50  r.** WinNT/2K/XP
87c0: 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c   so that we will
87d0: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
87e0: 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65   not we can safe
87f0: 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c  ly call.** the L
8800: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e  ockFileEx() API.
8810: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
8820: 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
8830: 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 64 65 66  E_OS_WINRT.# def
8840: 69 6e 65 20 69 73 4e 54 28 29 20 20 28 31 29 0a  ine isNT()  (1).
8850: 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28 53  #elif !defined(S
8860: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
8870: 57 49 44 45 29 0a 23 20 64 65 66 69 6e 65 20 69  WIDE).# define i
8880: 73 4e 54 28 29 20 20 28 30 29 0a 23 65 6c 73 65  sNT()  (0).#else
8890: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 73  .  static int is
88a0: 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69 66  NT(void){.    if
88b0: 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  ( sqlite3_os_typ
88c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53  e==0 ){.      OS
88d0: 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e  VERSIONINFOA sIn
88e0: 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e  fo;.      sInfo.
88f0: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53  dwOSVersionInfoS
8900: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e  ize = sizeof(sIn
8910: 66 6f 29 3b 0a 20 20 20 20 20 20 6f 73 47 65 74  fo);.      osGet
8920: 56 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66  VersionExA(&sInf
8930: 6f 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  o);.      sqlite
8940: 33 5f 6f 73 5f 74 79 70 65 20 3d 20 73 49 6e 66  3_os_type = sInf
8950: 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d 3d  o.dwPlatformId==
8960: 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e  VER_PLATFORM_WIN
8970: 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a 20  32_NT ? 2 : 1;. 
8980: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
8990: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d  sqlite3_os_type=
89a0: 3d 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  =2;.  }.#endif..
89b0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
89c0: 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a  N32_MALLOC./*.**
89d0: 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73   Allocate nBytes
89e0: 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73   of memory..*/.s
89f0: 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d  tatic void *winM
8a00: 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79  emMalloc(int nBy
8a10: 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68  tes){.  HANDLE h
8a20: 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b  Heap;.  void *p;
8a30: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
8a40: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
8a50: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
8a60: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
8a70: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
8a80: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
8a90: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
8aa0: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
8ab0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
8ac0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
8ad0: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
8ae0: 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48 65  .  assert ( osHe
8af0: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
8b00: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
8b10: 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29  EAP_FLAGS, NULL)
8b20: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
8b30: 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29  ert( nBytes>=0 )
8b40: 3b 0a 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c  ;.  p = osHeapAl
8b50: 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54  loc(hHeap, SQLIT
8b60: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
8b70: 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74  GS, (SIZE_T)nByt
8b80: 65 73 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  es);.  if( !p ){
8b90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
8ba0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22  (SQLITE_NOMEM, "
8bb0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 41 6c  failed to HeapAl
8bc0: 6c 6f 63 20 25 75 20 62 79 74 65 73 20 28 25 64  loc %u bytes (%d
8bd0: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
8bf0: 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  tes, osGetLastEr
8c00: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48  ror(), (void*)hH
8c10: 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  eap);.  }.  retu
8c20: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn p;.}../*.** F
8c30: 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ree memory..*/.s
8c40: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
8c50: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
8c60: 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  or){.  HANDLE hH
8c70: 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73  eap;..  winMemAs
8c80: 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68  sertMagic();.  h
8c90: 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74  Heap = winMemGet
8ca0: 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74  Heap();.  assert
8cb0: 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ( hHeap!=0 );.  
8cc0: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49  assert( hHeap!=I
8cd0: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
8ce0: 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49  LUE );.#if !SQLI
8cf0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
8d00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
8d10: 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44  N32_MALLOC_VALID
8d20: 41 54 45 29 0a 20 20 61 73 73 65 72 74 20 28 20  ATE).  assert ( 
8d30: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
8d40: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
8d50: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
8d60: 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66  Prior) );.#endif
8d70: 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29  .  if( !pPrior )
8d80: 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73   return; /* Pass
8d90: 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70  ing NULL to Heap
8da0: 46 72 65 65 20 69 73 20 75 6e 64 65 66 69 6e 65  Free is undefine
8db0: 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48  d. */.  if( !osH
8dc0: 65 61 70 46 72 65 65 28 68 48 65 61 70 2c 20 53  eapFree(hHeap, S
8dd0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
8de0: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20  _FLAGS, pPrior) 
8df0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
8e00: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
8e10: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
8e20: 46 72 65 65 20 62 6c 6f 63 6b 20 25 70 20 28 25  Free block %p (%
8e30: 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  d), heap=%p",.  
8e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
8e50: 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45  rior, osGetLastE
8e60: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68  rror(), (void*)h
8e70: 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Heap);.  }.}../*
8e80: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
8e90: 69 7a 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69  ize of an existi
8ea0: 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ng memory alloca
8eb0: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
8ec0: 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c  oid *winMemReall
8ed0: 6f 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c  oc(void *pPrior,
8ee0: 20 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20   int nBytes){.  
8ef0: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20  HANDLE hHeap;.  
8f00: 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d  void *p;..  winM
8f10: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b  emAssertMagic();
8f20: 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65  .  hHeap = winMe
8f30: 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73  mGetHeap();.  as
8f40: 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29  sert( hHeap!=0 )
8f50: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
8f60: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
8f70: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
8f80: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
8f90: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
8fa0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
8fb0: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
8fc0: 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  t ( osHeapValida
8fd0: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
8fe0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
8ff0: 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65  S, pPrior) );.#e
9000: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e  ndif.  assert( n
9010: 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66  Bytes>=0 );.  if
9020: 28 20 21 70 50 72 69 6f 72 20 29 7b 0a 20 20 20  ( !pPrior ){.   
9030: 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63   p = osHeapAlloc
9040: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
9050: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
9060: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
9070: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
9080: 20 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63   = osHeapReAlloc
9090: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
90a0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
90b0: 20 70 50 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54   pPrior, (SIZE_T
90c0: 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20  )nBytes);.  }.  
90d0: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71  if( !p ){.    sq
90e0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
90f0: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
9100: 74 6f 20 25 73 20 25 75 20 62 79 74 65 73 20 28  to %s %u bytes (
9110: 25 64 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  %d), heap=%p",. 
9120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
9130: 50 72 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41  Prior ? "HeapReA
9140: 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c  lloc" : "HeapAll
9150: 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47  oc", nBytes, osG
9160: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
9170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
9180: 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20  void*)hHeap);.  
9190: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
91a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
91b0: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74  e size of an out
91c0: 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74  standing allocat
91d0: 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ion, in bytes..*
91e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
91f0: 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29  MemSize(void *p)
9200: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
9210: 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20  ;.  SIZE_T n;.. 
9220: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
9230: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
9240: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
9250: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
9260: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
9270: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
9280: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
9290: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
92a0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
92b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
92c0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
92d0: 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56  assert ( osHeapV
92e0: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
92f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
9300: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
9310: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70  .#endif.  if( !p
9320: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
9330: 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48   = osHeapSize(hH
9340: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
9350: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29  2_HEAP_FLAGS, p)
9360: 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45  ;.  if( n==(SIZE
9370: 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c  _T)-1 ){.    sql
9380: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
9390: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
93a0: 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b  o HeapSize block
93b0: 20 25 70 20 28 25 64 29 2c 20 68 65 61 70 3d 25   %p (%d), heap=%
93c0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
93d0: 20 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73 74      p, osGetLast
93e0: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
93f0: 68 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74 75  hHeap);.    retu
9400: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
9410: 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a  rn (int)n;.}../*
9420: 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 72  .** Round up a r
9430: 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20 74  equest size to t
9440: 68 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61 6c  he next valid al
9450: 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a  location size..*
9460: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
9470: 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e  MemRoundup(int n
9480: 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  ){.  return n;.}
9490: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
94a0: 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  ze this module..
94b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
94c0: 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70  nMemInit(void *p
94d0: 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d  AppData){.  winM
94e0: 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44  emData *pWinMemD
94f0: 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74  ata = (winMemDat
9500: 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20  a *)pAppData;.. 
9510: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
9520: 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  a ) return SQLIT
9530: 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65 72  E_ERROR;.  asser
9540: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
9550: 6d 61 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  magic==WINMEM_MA
9560: 47 49 43 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c  GIC );..#if !SQL
9570: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
9580: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9590: 50 5f 43 52 45 41 54 45 0a 20 20 69 66 28 20 21  P_CREATE.  if( !
95a0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
95b0: 61 70 20 29 7b 0a 20 20 20 20 70 57 69 6e 4d 65  ap ){.    pWinMe
95c0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f  mData->hHeap = o
95d0: 73 48 65 61 70 43 72 65 61 74 65 28 53 51 4c 49  sHeapCreate(SQLI
95e0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
95f0: 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AGS,.           
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9610: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
9620: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49  E_WIN32_HEAP_INI
9630: 54 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20  T_SIZE,.        
9640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
9660: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
9670: 4d 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20 20 69  MAX_SIZE);.    i
9680: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  f( !pWinMemData-
9690: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 20 20  >hHeap ){.      
96a0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
96b0: 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20  TE_NOMEM,.      
96c0: 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 48      "failed to H
96d0: 65 61 70 43 72 65 61 74 65 20 28 25 64 29 2c 20  eapCreate (%d), 
96e0: 66 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69  flags=%u, initSi
96f0: 7a 65 3d 25 75 2c 20 6d 61 78 53 69 7a 65 3d 25  ze=%u, maxSize=%
9700: 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73  u",.          os
9710: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
9720: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9730: 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20  P_FLAGS,.       
9740: 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f     SQLITE_WIN32_
9750: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c 20  HEAP_INIT_SIZE, 
9760: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9770: 50 5f 4d 41 58 5f 53 49 5a 45 29 3b 0a 20 20 20  P_MAX_SIZE);.   
9780: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9790: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
97a0: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
97b0: 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 20  Owned = TRUE;.  
97c0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
97d0: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b  mData->bOwned );
97e0: 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69  .  }.#else.  pWi
97f0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
9800: 3d 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65  = osGetProcessHe
9810: 61 70 28 29 3b 0a 20 20 69 66 28 20 21 70 57 69  ap();.  if( !pWi
9820: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
9830: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
9840: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
9850: 0a 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64  .        "failed
9860: 20 74 6f 20 47 65 74 50 72 6f 63 65 73 73 48 65   to GetProcessHe
9870: 61 70 20 28 25 64 29 22 2c 20 6f 73 47 65 74 4c  ap (%d)", osGetL
9880: 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20  astError());.   
9890: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
98a0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 57 69 6e  OMEM;.  }.  pWin
98b0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
98c0: 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72  = FALSE;.  asser
98d0: 74 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  t( !pWinMemData-
98e0: 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69  >bOwned );.#endi
98f0: 66 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  f.  assert( pWin
9900: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
9910: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
9920: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
9930: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
9940: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
9950: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
9960: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
9970: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
9980: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
9990: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
99a0: 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  e(pWinMemData->h
99b0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
99c0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
99d0: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
99e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
99f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e  K;.}../*.** Dein
9a00: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
9a10: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
9a20: 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64  void winMemShutd
9a30: 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61  own(void *pAppDa
9a40: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
9a50: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
9a60: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
9a70: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
9a80: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
9a90: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 57 69  eturn;.  if( pWi
9aa0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
9ab0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
9ac0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
9ad0: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
9ae0: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
9af0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
9b00: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
9b10: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
9b20: 41 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73 73  ALIDATE).    ass
9b30: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
9b40: 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d  ate(pWinMemData-
9b50: 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  >hHeap, SQLITE_W
9b60: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
9b70: 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66   NULL) );.#endif
9b80: 0a 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65 6d  .    if( pWinMem
9b90: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a  Data->bOwned ){.
9ba0: 20 20 20 20 20 20 69 66 28 20 21 6f 73 48 65 61        if( !osHea
9bb0: 70 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65 6d  pDestroy(pWinMem
9bc0: 44 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b 0a  Data->hHeap) ){.
9bd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9be0: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
9bf0: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
9c00: 70 44 65 73 74 72 6f 79 20 28 25 64 29 2c 20 68  pDestroy (%d), h
9c10: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
9c30: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28  etLastError(), (
9c40: 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74  void*)pWinMemDat
9c50: 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20 20 20  a->hHeap);.     
9c60: 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d 65 6d   }.      pWinMem
9c70: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46  Data->bOwned = F
9c80: 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
9c90: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
9ca0: 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d  ap = NULL;.  }.}
9cb0: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
9cc0: 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d   the low-level m
9cd0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
9ce0: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
9cf0: 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  rs in.** sqlite3
9d00: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77  GlobalConfig.m w
9d10: 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ith pointers to 
9d20: 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20  the routines in 
9d30: 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a  this file. The.*
9d40: 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63  * arguments spec
9d50: 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66  ify the block of
9d60: 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67   memory to manag
9d70: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
9d80: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
9d90: 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  lled by sqlite3_
9da0: 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 68  config(), and th
9db0: 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f  erefore.** is no
9dc0: 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65  t required to be
9dd0: 20 74 68 72 65 61 64 73 61 66 65 20 28 69 74 20   threadsafe (it 
9de0: 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73  is not)..*/.cons
9df0: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
9e00: 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65  thods *sqlite3Me
9e10: 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 7b  mGetWin32(void){
9e20: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
9e30: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
9e40: 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64  ods winMemMethod
9e50: 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d  s = {.    winMem
9e60: 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d  Malloc,.    winM
9e70: 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d  emFree,.    winM
9e80: 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77  emRealloc,.    w
9e90: 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77  inMemSize,.    w
9ea0: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20  inMemRoundup,.  
9eb0: 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20    winMemInit,.  
9ec0: 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e    winMemShutdown
9ed0: 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64  ,.    &win_mem_d
9ee0: 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72  ata.  };.  retur
9ef0: 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73  n &winMemMethods
9f00: 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  ;.}..void sqlite
9f10: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76  3MemSetDefault(v
9f20: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
9f30: 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
9f40: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c  NFIG_MALLOC, sql
9f50: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
9f60: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ));.}.#endif /* 
9f70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
9f80: 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  LOC */../*.** Co
9f90: 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 73 74  nvert a UTF-8 st
9fa0: 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66  ring to Microsof
9fb0: 74 20 55 6e 69 63 6f 64 65 20 28 55 54 46 2d 31  t Unicode (UTF-1
9fc0: 36 3f 29 2e 20 0a 2a 2a 0a 2a 2a 20 53 70 61 63  6?). .**.** Spac
9fd0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
9fe0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
9ff0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d   obtained from m
a000: 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  alloc..*/.static
a010: 20 4c 50 57 53 54 52 20 75 74 66 38 54 6f 55 6e   LPWSTR utf8ToUn
a020: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
a030: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
a040: 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57  int nChar;.  LPW
a050: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
a060: 65 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73  e;..  nChar = os
a070: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
a080: 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
a090: 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e  zFilename, -1, N
a0a0: 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  ULL, 0);.  if( n
a0b0: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Char==0 ){.    r
a0c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
a0d0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d 20 73  WideFilename = s
a0e0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
a0f0: 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28 7a  ( nChar*sizeof(z
a100: 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29  WideFilename[0])
a110: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46   );.  if( zWideF
a120: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
a130: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
a140: 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74    nChar = osMult
a150: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
a160: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c  CP_UTF8, 0, zFil
a170: 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65  ename, -1, zWide
a180: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72 29            nChar)
a1b0: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
a1c0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
a1d0: 66 72 65 65 28 7a 57 69 64 65 46 69 6c 65 6e 61  free(zWideFilena
a1e0: 6d 65 29 3b 0a 20 20 20 20 7a 57 69 64 65 46 69  me);.    zWideFi
a1f0: 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  lename = 0;.  }.
a200: 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65 46 69    return zWideFi
a210: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
a220: 20 43 6f 6e 76 65 72 74 20 4d 69 63 72 6f 73 6f   Convert Microso
a230: 66 74 20 55 6e 69 63 6f 64 65 20 74 6f 20 55 54  ft Unicode to UT
a240: 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68  F-8.  Space to h
a250: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
a260: 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f 62   string is.** ob
a270: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
a280: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
a290: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e  .static char *un
a2a0: 69 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57  icodeToUtf8(LPCW
a2b0: 53 54 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  STR zWideFilenam
a2c0: 65 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  e){.  int nByte;
a2d0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
a2e0: 6d 65 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f  me;..  nByte = o
a2f0: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
a300: 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c  Byte(CP_UTF8, 0,
a310: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
a320: 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  -1, 0, 0, 0, 0);
a330: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
a340: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
a350: 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  0;.  }.  zFilena
a360: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
a370: 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b  ocZero( nByte );
a380: 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65  .  if( zFilename
a390: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
a3a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
a3b0: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
a3c0: 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38  ultiByte(CP_UTF8
a3d0: 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61  , 0, zWideFilena
a3e0: 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  me, -1, zFilenam
a3f0: 65 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20  e, nByte,.      
a400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a410: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b            0, 0);
a420: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
a430: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
a440: 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65 29  _free(zFilename)
a450: 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20  ;.    zFilename 
a460: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
a470: 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  n zFilename;.}..
a480: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e  /*.** Convert an
a490: 20 41 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20   ANSI string to 
a4a0: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
a4b0: 65 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65 0a  e, based on the.
a4c0: 2a 2a 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70  ** current codep
a4d0: 61 67 65 20 73 65 74 74 69 6e 67 73 20 66 6f 72  age settings for
a4e0: 20 66 69 6c 65 20 61 70 69 73 2e 0a 2a 2a 20 0a   file apis..** .
a4f0: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
a500: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
a510: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
a520: 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  .** from sqlite3
a530: 5f 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73 74 61 74  _malloc..*/.stat
a540: 69 63 20 4c 50 57 53 54 52 20 6d 62 63 73 54 6f  ic LPWSTR mbcsTo
a550: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
a560: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
a570: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c    int nByte;.  L
a580: 50 57 53 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e  PWSTR zMbcsFilen
a590: 61 6d 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70  ame;.  int codep
a5a0: 61 67 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41  age = osAreFileA
a5b0: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
a5c0: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a  CP : CP_OEMCP;..
a5d0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74    nByte = osMult
a5e0: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
a5f0: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69  codepage, 0, zFi
a600: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c  lename, -1, NULL
a610: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a630: 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41    0)*sizeof(WCHA
a640: 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d  R);.  if( nByte=
a650: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
a660: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46   0;.  }.  zMbcsF
a670: 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ilename = sqlite
a680: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
a690: 74 65 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46  te*sizeof(zMbcsF
a6a0: 69 6c 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20  ilename[0]) );. 
a6b0: 20 69 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61   if( zMbcsFilena
a6c0: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
a6d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
a6e0: 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65  te = osMultiByte
a6f0: 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65 70  ToWideChar(codep
a700: 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  age, 0, zFilenam
a710: 65 2c 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65  e, -1, zMbcsFile
a720: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
a730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a740: 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20 20        nByte);.  
a750: 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a  if( nByte==0 ){.
a760: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a770: 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b  (zMbcsFilename);
a780: 0a 20 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61  .    zMbcsFilena
a790: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
a7a0: 74 75 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61  turn zMbcsFilena
a7b0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
a7c0: 76 65 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55  vert Microsoft U
a7d0: 6e 69 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d  nicode to multi-
a7e0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
a7f0: 74 72 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20  tring, based on 
a800: 74 68 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e  the.** user's AN
a810: 53 49 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a  SI codepage..**.
a820: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
a830: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
a840: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
a850: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
a860: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  _malloc()..*/.st
a870: 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69 63 6f  atic char *unico
a880: 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 52  deToMbcs(LPCWSTR
a890: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b   zWideFilename){
a8a0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
a8b0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
a8c0: 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20  .  int codepage 
a8d0: 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  = osAreFileApisA
a8e0: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
a8f0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
a900: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
a910: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
a920: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
a930: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30  lename, -1, 0, 0
a940: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
a950: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
a960: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
a970: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
a980: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
a990: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
a9a0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
a9b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
a9c0: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
a9d0: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
a9e0: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57  (codepage, 0, zW
a9f0: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
aa00: 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74              nByt
aa30: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  e, 0, 0);.  if( 
aa40: 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20  nByte == 0 ){.  
aa50: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
aa60: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
aa70: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
aa80: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  }.  return zFile
aa90: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
aaa0: 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74 65  onvert multibyte
aab0: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
aac0: 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61  g to UTF-8.  Spa
aad0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  ce to hold the.*
aae0: 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  * returned strin
aaf0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
ab00: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
ab10: 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  c()..*/.char *sq
ab20: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
ab30: 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20 63  _to_utf8(const c
ab40: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
ab50: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
ab60: 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52  meUtf8;.  LPWSTR
ab70: 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54   zTmpWide;..  zT
ab80: 6d 70 57 69 64 65 20 3d 20 6d 62 63 73 54 6f 55  mpWide = mbcsToU
ab90: 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
aba0: 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64  );.  if( zTmpWid
abb0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
abc0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c  rn 0;.  }.  zFil
abd0: 65 6e 61 6d 65 55 74 66 38 20 3d 20 75 6e 69 63  enameUtf8 = unic
abe0: 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69  odeToUtf8(zTmpWi
abf0: 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  de);.  sqlite3_f
ac00: 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20  ree(zTmpWide);. 
ac10: 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
ac20: 65 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eUtf8;.}../*.** 
ac30: 43 6f 6e 76 65 72 74 20 55 54 46 2d 38 20 74 6f  Convert UTF-8 to
ac40: 20 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61   multibyte chara
ac50: 63 74 65 72 20 73 74 72 69 6e 67 2e 20 20 53 70  cter string.  Sp
ac60: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
ac70: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72  .** returned str
ac80: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
ac90: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
aca0: 6c 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a  loc()..*/.char *
acb0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
acc0: 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74  f8_to_mbcs(const
acd0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
ace0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  ){.  char *zFile
acf0: 6e 61 6d 65 4d 62 63 73 3b 0a 20 20 4c 50 57 53  nameMbcs;.  LPWS
ad00: 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20  TR zTmpWide;..  
ad10: 7a 54 6d 70 57 69 64 65 20 3d 20 75 74 66 38 54  zTmpWide = utf8T
ad20: 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
ad30: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57  me);.  if( zTmpW
ad40: 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ide==0 ){.    re
ad50: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 46  turn 0;.  }.  zF
ad60: 69 6c 65 6e 61 6d 65 4d 62 63 73 20 3d 20 75 6e  ilenameMbcs = un
ad70: 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d 70  icodeToMbcs(zTmp
ad80: 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Wide);.  sqlite3
ad90: 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b  _free(zTmpWide);
ada0: 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e  .  return zFilen
adb0: 61 6d 65 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  ameMbcs;.}../*.*
adc0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
add0: 73 65 74 73 20 74 68 65 20 64 61 74 61 20 64 69  sets the data di
ade0: 72 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74  rectory or the t
adf0: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
ae00: 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  ry based on.** t
ae10: 68 65 20 70 72 6f 76 69 64 65 64 20 61 72 67 75  he provided argu
ae20: 6d 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65  ments.  The type
ae30: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
ae40: 65 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  e 1 in order to 
ae50: 73 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20  set the.** data 
ae60: 64 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69  directory or 2 i
ae70: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74  n order to set t
ae80: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
ae90: 65 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61  ectory.  The zVa
aea0: 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  lue.** argument 
aeb0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
aec0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  he directory to 
aed0: 75 73 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  use.  The return
aee0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a   value will be.*
aef0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  * SQLITE_OK if s
af00: 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e  uccessful..*/.in
af10: 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
af20: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57  set_directory(DW
af30: 4f 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54  ORD type, LPCWST
af40: 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61  R zValue){.  cha
af50: 72 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20  r **ppDirectory 
af60: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
af70: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
af80: 54 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  T.  int rc = sql
af90: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
afa0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
afb0: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
afc0: 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49    if( type==SQLI
afd0: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49  TE_WIN32_DATA_DI
afe0: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a  RECTORY_TYPE ){.
aff0: 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20      ppDirectory 
b000: 3d 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  = &sqlite3_data_
b010: 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c  directory;.  }el
b020: 73 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c  se if( type==SQL
b030: 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44  ITE_WIN32_TEMP_D
b040: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b  IRECTORY_TYPE ){
b050: 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79  .    ppDirectory
b060: 20 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70   = &sqlite3_temp
b070: 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a  _directory;.  }.
b080: 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72    assert( !ppDir
b090: 65 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d  ectory || type==
b0a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
b0b0: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
b0c0: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79  .          || ty
b0d0: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
b0e0: 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f  _TEMP_DIRECTORY_
b0f0: 54 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65  TYPE.  );.  asse
b100: 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79  rt( !ppDirectory
b110: 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65   || sqlite3Memde
b120: 62 75 67 48 61 73 54 79 70 65 28 2a 70 70 44 69  bugHasType(*ppDi
b130: 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45  rectory, MEMTYPE
b140: 5f 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20  _HEAP) );.  if( 
b150: 70 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  ppDirectory ){. 
b160: 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55     char *zValueU
b170: 74 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  tf8 = 0;.    if(
b180: 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75   zValue && zValu
b190: 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56  e[0] ){.      zV
b1a0: 61 6c 75 65 55 74 66 38 20 3d 20 75 6e 69 63 6f  alueUtf8 = unico
b1b0: 64 65 54 6f 55 74 66 38 28 7a 56 61 6c 75 65 29  deToUtf8(zValue)
b1c0: 3b 0a 20 20 20 20 20 20 69 66 20 28 20 7a 56 61  ;.      if ( zVa
b1d0: 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a 20 20  lueUtf8==0 ){.  
b1e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b1f0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
b200: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
b210: 69 74 65 33 5f 66 72 65 65 28 2a 70 70 44 69 72  ite3_free(*ppDir
b220: 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70  ectory);.    *pp
b230: 44 69 72 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c  Directory = zVal
b240: 75 65 55 74 66 38 3b 0a 20 20 20 20 72 65 74 75  ueUtf8;.    retu
b250: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
b260: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
b270: 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
b280: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
b290: 75 65 20 6f 66 20 67 65 74 4c 61 73 74 45 72 72  ue of getLastErr
b2a0: 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f  orMsg.** is zero
b2b0: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
b2c0: 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
b2d0: 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
b2e0: 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
b2f0: 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
b300: 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
b310: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
b320: 20 67 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67   getLastErrorMsg
b330: 28 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f  (DWORD lastErrno
b340: 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
b350: 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f   *zBuf){.  /* Fo
b360: 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65 74 75  rmatMessage retu
b370: 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65  rns 0 on failure
b380: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a  .  Otherwise it.
b390: 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65    ** returns the
b3a0: 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52   number of TCHAR
b3b0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
b3c0: 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66   output.  ** buf
b3d0: 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74  fer, excluding t
b3e0: 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e  he terminating n
b3f0: 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20  ull char..  */. 
b400: 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30   DWORD dwLen = 0
b410: 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d  ;.  char *zOut =
b420: 20 30 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28   0;..  if( isNT(
b430: 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
b440: 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48  OS_WINRT.    WCH
b450: 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 4d 41 58  AR zTempWide[MAX
b460: 5f 50 41 54 48 2b 31 5d 3b 20 2f 2a 20 4e 4f 54  _PATH+1]; /* NOT
b470: 45 3a 20 53 6f 6d 65 77 68 61 74 20 61 72 62 69  E: Somewhat arbi
b480: 74 72 61 72 79 2e 20 2a 2f 0a 20 20 20 20 64 77  trary. */.    dw
b490: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
b4a0: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
b4b0: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
b4c0: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4e0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
b4f0: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_INSERTS,.
b500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
b520: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b540: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b580: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64          zTempWid
b590: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 4d 41 58 5f 50 41 54 48 2c 0a 20 20 20 20 20 20  MAX_PATH,.      
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5d0: 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6c 73 65         0);.#else
b5e0: 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d  .    LPWSTR zTem
b5f0: 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pWide = NULL;.  
b600: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
b610: 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41  atMessageW(FORMA
b620: 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41  T_MESSAGE_ALLOCA
b630: 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20  TE_BUFFER |.    
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
b660: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
b670: 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEM |.          
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b690: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
b6a0: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
b6b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
b6d0: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6f0: 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20    lastErrno,.   
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b710: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b730: 20 20 20 20 20 20 20 20 20 20 28 4c 50 57 53 54            (LPWST
b740: 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20  R) &zTempWide,. 
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b760: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
b770: 20 20 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 30 29 3b 0a              0);.
b790: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 64  #endif.    if( d
b7a0: 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20  wLen > 0 ){.    
b7b0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20    /* allocate a 
b7c0: 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65  buffer and conve
b7d0: 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20  rt to UTF8 */.  
b7e0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
b7f0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
b800: 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69        zOut = uni
b810: 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
b820: 57 69 64 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Wide);.      sql
b830: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
b840: 6c 6f 63 28 29 3b 0a 23 69 66 20 21 53 51 4c 49  loc();.#if !SQLI
b850: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
b860: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79    /* free the sy
b870: 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f  stem buffer allo
b880: 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d  cated by FormatM
b890: 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  essage */.      
b8a0: 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d  osLocalFree(zTem
b8b0: 70 57 69 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20  pWide);.#endif. 
b8c0: 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20     }.  }.#ifdef 
b8d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
b8e0: 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
b8f0: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20    char *zTemp = 
b900: 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20  NULL;.    dwLen 
b910: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  = osFormatMessag
b920: 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eA(FORMAT_MESSAG
b930: 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45  E_ALLOCATE_BUFFE
b940: 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  R |.            
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b960: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
b970: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
b980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b990: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
b9a0: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
b9b0: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9f0: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72            lastEr
ba00: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
ba10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba20: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba40: 20 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d 70    (LPSTR) &zTemp
ba50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ba70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
ba90: 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e  );.    if( dwLen
baa0: 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a   > 0 ){.      /*
bab0: 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66   allocate a buff
bac0: 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74  er and convert t
bad0: 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20  o UTF8 */.      
bae0: 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
baf0: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
bb00: 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65 33    zOut = sqlite3
bb10: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
bb20: 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  tf8(zTemp);.    
bb30: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
bb40: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
bb50: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73 79    /* free the sy
bb60: 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f  stem buffer allo
bb70: 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74 4d  cated by FormatM
bb80: 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  essage */.      
bb90: 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d  osLocalFree(zTem
bba0: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  p);.    }.  }.#e
bbb0: 6e 64 69 66 0a 20 20 69 66 28 20 30 20 3d 3d 20  ndif.  if( 0 == 
bbc0: 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  dwLen ){.    sql
bbd0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
bbe0: 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72 72  uf, zBuf, "OsErr
bbf0: 6f 72 20 30 78 25 6c 78 20 28 25 6c 75 29 22 2c  or 0x%lx (%lu)",
bc00: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74   lastErrno, last
bc10: 45 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  Errno);.  }else{
bc20: 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d  .    /* copy a m
bc30: 61 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63  aximum of nBuf c
bc40: 68 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20 62  hars to output b
bc50: 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c  uffer */.    sql
bc60: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
bc70: 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  uf, zBuf, "%s", 
bc80: 7a 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72  zOut);.    /* fr
bc90: 65 65 20 74 68 65 20 55 54 46 38 20 62 75 66 66  ee the UTF8 buff
bca0: 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  er */.    sqlite
bcb0: 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
bcc0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
bcd0: 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ./*.**.** This f
bce0: 75 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67  unction - winLog
bcf0: 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20  ErrorAtLine() - 
bd00: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
bd10: 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72  led via the macr
bd20: 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72  o.** winLogError
bd30: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ()..**.** This r
bd40: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
bd50: 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72  d after an error
bd60: 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53   occurs in an OS
bd70: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74   function..** It
bd80: 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20   logs a message 
bd90: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f  using sqlite3_lo
bda0: 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  g() containing t
bdb0: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
bdc0: 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   of.** error cod
bdd0: 65 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69 62  e and, if possib
bde0: 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  le, the human-re
bdf0: 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65 6e  adable equivalen
be00: 74 20 66 72 6f 6d 20 0a 2a 2a 20 46 6f 72 6d 61  t from .** Forma
be10: 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  tMessage..**.** 
be20: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
be30: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  nt passed to the
be40: 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65   macro should be
be50: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
be60: 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  that.** will be 
be70: 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
be80: 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f  te (e.g. SQLITE_
be90: 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51  IOERR_DELETE, SQ
bea0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20  LITE_CANTOPEN). 
beb0: 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73  .** The two subs
bec0: 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73  equent arguments
bed0: 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e   should be the n
bee0: 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75  ame of the OS fu
bef0: 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66  nction that.** f
bf00: 61 69 6c 65 64 20 61 6e 64 20 74 68 65 20 61 73  ailed and the as
bf10: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79  sociated file-sy
bf20: 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e  stem path, if an
bf30: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69  y..*/.#define wi
bf40: 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c  nLogError(a,b,c,
bf50: 64 29 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  d)   winLogError
bf60: 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f  AtLine(a,b,c,d,_
bf70: 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20  _LINE__).static 
bf80: 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  int winLogErrorA
bf90: 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72  tLine(.  int err
bfa0: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
bfb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
bfc0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
bfd0: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
bfe0: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  no,             
bff0: 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74     /* Win32 last
c000: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73   error */.  cons
c010: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20  t char *zFunc,  
c020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c030: 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69  ame of OS functi
c040: 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a  on that failed *
c050: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
c060: 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
c070: 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68      /* File path
c080: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
c090: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
c0a0: 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20  iLine           
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c0c0: 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65  ource line numbe
c0d0: 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63  r where error oc
c0e0: 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63  curred */.){.  c
c0f0: 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20  har zMsg[500];  
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c110: 2a 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  * Human readable
c120: 20 65 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20   error text */. 
c130: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c150: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
c160: 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d   */..  zMsg[0] =
c170: 20 30 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72   0;.  getLastErr
c180: 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c  orMsg(lastErrno,
c190: 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a   sizeof(zMsg), z
c1a0: 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Msg);.  assert( 
c1b0: 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errcode!=SQLITE_
c1c0: 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74  OK );.  if( zPat
c1d0: 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22  h==0 ) zPath = "
c1e0: 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d  ";.  for(i=0; zM
c1f0: 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d  sg[i] && zMsg[i]
c200: 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69  !='\r' && zMsg[i
c210: 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a  ]!='\n'; i++){}.
c220: 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20    zMsg[i] = 0;. 
c230: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72   sqlite3_log(err
c240: 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f  code,.      "os_
c250: 77 69 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20  win.c:%d: (%lu) 
c260: 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20  %s(%s) - %s",.  
c270: 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45      iLine, lastE
c280: 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61  rrno, zFunc, zPa
c290: 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20  th, zMsg.  );.. 
c2a0: 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b   return errcode;
c2b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75  .}../*.** The nu
c2c0: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68  mber of times th
c2d0: 61 74 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c  at a ReadFile(),
c2e0: 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e   WriteFile(), an
c2f0: 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a  d DeleteFile().*
c300: 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65  * will be retrie
c310: 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f  d following a lo
c320: 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72  cking error - pr
c330: 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20 62 79  obably caused by
c340: 20 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20 73   .** antivirus s
c350: 6f 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20 74  oftware.  Also t
c360: 68 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61 79  he initial delay
c370: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
c380: 74 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20  t retry..** The 
c390: 64 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73 20  delay increases 
c3a0: 6c 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65 61  linearly with ea
c3b0: 63 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66  ch retry..*/.#if
c3c0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
c3d0: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23 20  2_IOERR_RETRY.# 
c3e0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
c3f0: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 20  N32_IOERR_RETRY 
c400: 31 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  10.#endif.#ifnde
c410: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
c420: 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59  OERR_RETRY_DELAY
c430: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
c440: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
c450: 52 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e 64  RY_DELAY 25.#end
c460: 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  if.static int wi
c470: 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20 3d 20  n32IoerrRetry = 
c480: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
c490: 52 52 5f 52 45 54 52 59 3b 0a 73 74 61 74 69 63  RR_RETRY;.static
c4a0: 20 69 6e 74 20 77 69 6e 33 32 49 6f 65 72 72 52   int win32IoerrR
c4b0: 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c 49  etryDelay = SQLI
c4c0: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
c4d0: 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a  ETRY_DELAY;../*.
c4e0: 2a 2a 20 49 66 20 61 20 52 65 61 64 46 69 6c 65  ** If a ReadFile
c4f0: 28 29 20 6f 72 20 57 72 69 74 65 46 69 6c 65 28  () or WriteFile(
c500: 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
c510: 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
c520: 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ine.** to see if
c530: 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65   it should be re
c540: 74 72 69 65 64 2e 20 20 52 65 74 75 72 6e 20 54  tried.  Return T
c550: 52 55 45 20 74 6f 20 72 65 74 72 79 2e 20 20 52  RUE to retry.  R
c560: 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74  eturn FALSE.** t
c570: 6f 20 67 69 76 65 20 75 70 20 77 69 74 68 20 61  o give up with a
c580: 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  n error..*/.stat
c590: 69 63 20 69 6e 74 20 72 65 74 72 79 49 6f 65 72  ic int retryIoer
c5a0: 72 28 69 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20  r(int *pnRetry, 
c5b0: 44 57 4f 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a  DWORD *pError){.
c5c0: 20 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47 65    DWORD e = osGe
c5d0: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
c5e0: 69 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69  if( *pnRetry>=wi
c5f0: 6e 33 32 49 6f 65 72 72 52 65 74 72 79 20 29 7b  n32IoerrRetry ){
c600: 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20  .    if( pError 
c610: 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72  ){.      *pError
c620: 20 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = e;.    }.    
c630: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c640: 69 66 28 20 65 3d 3d 45 52 52 4f 52 5f 41 43 43  if( e==ERROR_ACC
c650: 45 53 53 5f 44 45 4e 49 45 44 20 7c 7c 0a 20 20  ESS_DENIED ||.  
c660: 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 4c 4f 43      e==ERROR_LOC
c670: 4b 5f 56 49 4f 4c 41 54 49 4f 4e 20 7c 7c 0a 20  K_VIOLATION ||. 
c680: 20 20 20 20 20 65 3d 3d 45 52 52 4f 52 5f 53 48       e==ERROR_SH
c690: 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 20  ARING_VIOLATION 
c6a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  ){.    sqlite3_w
c6b0: 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 33 32  in32_sleep(win32
c6c0: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
c6d0: 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20  (1+*pnRetry));. 
c6e0: 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20     ++*pnRetry;. 
c6f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
c700: 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b  .  if( pError ){
c710: 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65  .    *pError = e
c720: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
c730: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61  ;.}../*.** Log a
c740: 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72 79   I/O error retry
c750: 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61   episode..*/.sta
c760: 74 69 63 20 76 6f 69 64 20 6c 6f 67 49 6f 65 72  tic void logIoer
c770: 72 28 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a 20  r(int nRetry){. 
c780: 20 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a 20   if( nRetry ){. 
c790: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
c7a0: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 0a 20 20  QLITE_IOERR, .  
c7b0: 20 20 20 20 22 64 65 6c 61 79 65 64 20 25 64 6d      "delayed %dm
c7c0: 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72 69  s for lock/shari
c7d0: 6e 67 20 63 6f 6e 66 6c 69 63 74 22 2c 0a 20 20  ng conflict",.  
c7e0: 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65      win32IoerrRe
c7f0: 74 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a  tryDelay*nRetry*
c800: 28 6e 52 65 74 72 79 2b 31 29 2f 32 0a 20 20 20  (nRetry+1)/2.   
c810: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53   );.  }.}..#if S
c820: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f  QLITE_OS_WINCE./
c830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c840: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c850: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c870: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69  *********.** Thi
c880: 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69  s section contai
c890: 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69 6e 43  ns code for WinC
c8a0: 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 21  E only..*/.#if !
c8b0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d  defined(SQLITE_M
c8c0: 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50  SVC_LOCALTIME_AP
c8d0: 49 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 4d 53  I) || !SQLITE_MS
c8e0: 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49  VC_LOCALTIME_API
c8f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 53 56 43 20  ./*.** The MSVC 
c900: 43 52 54 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43  CRT on Windows C
c910: 45 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61  E may not have a
c920: 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75 6e   localtime() fun
c930: 63 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 63 72  ction.  So.** cr
c940: 65 61 74 65 20 61 20 73 75 62 73 74 69 74 75 74  eate a substitut
c950: 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  e..*/.#include <
c960: 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20 74  time.h>.struct t
c970: 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c  m *__cdecl local
c980: 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f  time(const time_
c990: 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69 63  t *t).{.  static
c9a0: 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20 20   struct tm y;.  
c9b0: 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54  FILETIME uTm, lT
c9c0: 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20  m;.  SYSTEMTIME 
c9d0: 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  pTm;.  sqlite3_i
c9e0: 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20  nt64 t64;.  t64 
c9f0: 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74  = *t;.  t64 = (t
ca00: 36 34 20 2b 20 31 31 36 34 34 34 37 33 36 30 30  64 + 11644473600
ca10: 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54  )*10000000;.  uT
ca20: 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20  m.dwLowDateTime 
ca30: 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 26 20  = (DWORD)(t64 & 
ca40: 30 78 46 46 46 46 46 46 46 46 29 3b 0a 20 20 75  0xFFFFFFFF);.  u
ca50: 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d  Tm.dwHighDateTim
ca60: 65 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 3e  e= (DWORD)(t64 >
ca70: 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54  > 32);.  osFileT
ca80: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
ca90: 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20  me(&uTm,&lTm);. 
caa0: 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73   osFileTimeToSys
cab0: 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54  temTime(&lTm,&pT
cac0: 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20  m);.  y.tm_year 
cad0: 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31 39  = pTm.wYear - 19
cae0: 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d  00;.  y.tm_mon =
caf0: 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b   pTm.wMonth - 1;
cb00: 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70  .  y.tm_wday = p
cb10: 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20  Tm.wDayOfWeek;. 
cb20: 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d   y.tm_mday = pTm
cb30: 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f  .wDay;.  y.tm_ho
cb40: 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a  ur = pTm.wHour;.
cb50: 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d    y.tm_min = pTm
cb60: 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d  .wMinute;.  y.tm
cb70: 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f  _sec = pTm.wSeco
cb80: 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79 3b  nd;.  return &y;
cb90: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  .}.#endif..#defi
cba0: 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e  ne HANDLE_TO_WIN
cbb0: 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69 6c 65  FILE(a) (winFile
cbc0: 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b 2d 28  *)&((char*)a)[-(
cbd0: 69 6e 74 29 6f 66 66 73 65 74 6f 66 28 77 69 6e  int)offsetof(win
cbe0: 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20  File,h)]../*.** 
cbf0: 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b 20 6f  Acquire a lock o
cc00: 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68 0a 2a  n the handle h.*
cc10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
cc20: 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
cc30: 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44 57  HANDLE h){.   DW
cc40: 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20 64 6f  ORD dwErr;.   do
cc50: 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20 3d 20   {.     dwErr = 
cc60: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
cc70: 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e 49 54  bject(h, INFINIT
cc80: 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20 28  E);.   } while (
cc90: 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 4f 42  dwErr != WAIT_OB
cca0: 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72 72 20  JECT_0 && dwErr 
ccb0: 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45  != WAIT_ABANDONE
ccc0: 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  D);.}./*.** Rele
ccd0: 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 75 69  ase a lock acqui
cce0: 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75 74 65  red by winceMute
ccf0: 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64  xAcquire().*/.#d
cd00: 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65 78  efine winceMutex
cd10: 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65 61  Release(h) Relea
cd20: 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a  seMutex(h)../*.*
cd30: 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d 75 74  * Create the mut
cd40: 65 78 20 61 6e 64 20 73 68 61 72 65 64 20 6d 65  ex and shared me
cd50: 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f  mory used for lo
cd60: 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 69 6c  cking in the fil
cd70: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20  e.** descriptor 
cd80: 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20  pFile.*/.static 
cd90: 69 6e 74 20 77 69 6e 63 65 43 72 65 61 74 65 4c  int winceCreateL
cda0: 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ock(const char *
cdb0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69  zFilename, winFi
cdc0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4c 50  le *pFile){.  LP
cdd0: 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c 50 57  WSTR zTok;.  LPW
cde0: 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20 44 57 4f  STR zName;.  DWO
cdf0: 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
ce00: 42 4f 4f 4c 20 62 4c 6f 67 67 65 64 20 3d 20 46  BOOL bLogged = F
ce10: 41 4c 53 45 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e  ALSE;.  BOOL bIn
ce20: 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e  it = TRUE;..  zN
ce30: 61 6d 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63  ame = utf8ToUnic
ce40: 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
ce50: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
ce60: 7b 0a 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20  {.    /* out of 
ce70: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65  memory */.    re
ce80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
ce90: 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20  R_NOMEM;.  }..  
cea0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
ceb0: 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61  e local lockdata
cec0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46   */.  memset(&pF
ced0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73  ile->local, 0, s
cee0: 69 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63  izeof(pFile->loc
cef0: 61 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c  al));..  /* Repl
cf00: 61 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73  ace the backslas
cf10: 68 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  hes from the fil
cf20: 65 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63  ename and lowerc
cf30: 61 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64  ase it.  ** to d
cf40: 65 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61  erive a mutex na
cf50: 6d 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20  me. */.  zTok = 
cf60: 6f 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61  osCharLowerW(zNa
cf70: 6d 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54  me);.  for (;*zT
cf80: 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20  ok;zTok++){.    
cf90: 69 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c  if (*zTok == '\\
cfa0: 27 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a  ') *zTok = '_';.
cfb0: 20 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65    }..  /* Create
cfc0: 2f 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20  /open the named 
cfd0: 6d 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65  mutex */.  pFile
cfe0: 2d 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65  ->hMutex = osCre
cff0: 61 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20  ateMutexW(NULL, 
d000: 46 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20  FALSE, zName);. 
d010: 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75   if (!pFile->hMu
d020: 74 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  tex){.    pFile-
d030: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
d040: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
d050: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
d060: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69  QLITE_IOERR, pFi
d070: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
d080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
d090: 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 31  winceCreateLock1
d0a0: 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
d0b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d0c0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
d0d0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
d0e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
d0f0: 72 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66  re the mutex bef
d100: 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a  ore continuing *
d110: 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63  /.  winceMutexAc
d120: 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
d130: 74 65 78 29 3b 0a 20 20 0a 20 20 2f 2a 20 53 69  tex);.  .  /* Si
d140: 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  nce the names of
d150: 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20   named mutexes, 
d160: 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65  semaphores, file
d170: 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61 72   mappings etc ar
d180: 65 20 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e  e .  ** case-sen
d190: 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76  sitive, take adv
d1a0: 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62  antage of that b
d1b0: 79 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68  y uppercasing th
d1c0: 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a  e mutex name.  *
d1d0: 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74  * and using that
d1e0: 20 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66   as the shared f
d1f0: 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e  ilemapping name.
d200: 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70  .  */.  osCharUp
d210: 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70  perW(zName);.  p
d220: 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20  File->hShared = 
d230: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
d240: 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e  ingW(INVALID_HAN
d250: 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c  DLE_VALUE, NULL,
d260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d280: 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45           PAGE_RE
d290: 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65  ADWRITE, 0, size
d2a0: 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20  of(winceLock),. 
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2d0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 20 20         zName);  
d2e0: 0a 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61  ..  /* Set a fla
d2f0: 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73  g that indicates
d300: 20 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74   we're the first
d310: 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d   to create the m
d320: 65 6d 6f 72 79 20 73 6f 20 69 74 20 0a 20 20 2a  emory so it .  *
d330: 2a 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69  * must be zero-i
d340: 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20  nitialized */.  
d350: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
d360: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
d370: 69 66 20 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d  if (lastErrno ==
d380: 20 45 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45   ERROR_ALREADY_E
d390: 58 49 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69  XISTS){.    bIni
d3a0: 74 20 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a  t = FALSE;.  }..
d3b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
d3c0: 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Name);..  /* If 
d3d0: 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
d3e0: 6d 61 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65  making the share
d3f0: 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c  d memory handle,
d400: 20 6d 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66   map it. */.  if
d410: 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  ( pFile->hShared
d420: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73   ){.    pFile->s
d430: 68 61 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f  hared = (winceLo
d440: 63 6b 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46  ck*)osMapViewOfF
d450: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  ile(pFile->hShar
d460: 65 64 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ed, .           
d470: 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c    FILE_MAP_READ|
d480: 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20  FILE_MAP_WRITE, 
d490: 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  0, 0, sizeof(win
d4a0: 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a  ceLock));.    /*
d4b0: 20 49 66 20 6d 61 70 70 69 6e 67 20 66 61 69 6c   If mapping fail
d4c0: 65 64 2c 20 63 6c 6f 73 65 20 74 68 65 20 73 68  ed, close the sh
d4d0: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
d4e0: 6c 65 20 61 6e 64 20 65 72 61 73 65 20 69 74 20  le and erase it 
d4f0: 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 46 69 6c  */.    if( !pFil
d500: 65 2d 3e 73 68 61 72 65 64 20 29 7b 0a 20 20 20  e->shared ){.   
d510: 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
d520: 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
d530: 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69  rror();.      wi
d540: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
d550: 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
d560: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
d570: 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
d580: 63 65 43 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20  ceCreateLock2", 
d590: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
d5a0: 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45    bLogged = TRUE
d5b0: 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48  ;.      osCloseH
d5c0: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68  andle(pFile->hSh
d5d0: 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 46 69  ared);.      pFi
d5e0: 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 4e 55  le->hShared = NU
d5f0: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  LL;.    }.  }.. 
d600: 20 2f 2a 20 49 66 20 73 68 61 72 65 64 20 6d 65   /* If shared me
d610: 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62  mory could not b
d620: 65 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e 20  e created, then 
d630: 63 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20  close the mutex 
d640: 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66  and fail */.  if
d650: 28 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  ( pFile->hShared
d660: 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  ==NULL ){.    if
d670: 28 20 21 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20  ( !bLogged ){.  
d680: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
d690: 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
d6a0: 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72  ;.      winLogEr
d6b0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
d6c0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
d6d0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
d6e0: 20 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61        "winceCrea
d6f0: 74 65 4c 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e  teLock3", zFilen
d700: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67  ame);.      bLog
d710: 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ged = TRUE;.    
d720: 7d 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  }.    winceMutex
d730: 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
d740: 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c  Mutex);.    osCl
d750: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
d760: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
d770: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
d780: 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  LL;.    return S
d790: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
d7a0: 0a 20 20 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  .  .  /* Initial
d7b0: 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 20 6d  ize the shared m
d7c0: 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20 73  emory if we're s
d7d0: 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20 20  upposed to */.  
d7e0: 69 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20 20  if( bInit ){.   
d7f0: 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e 73   memset(pFile->s
d800: 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  hared, 0, sizeof
d810: 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20  (winceLock));.  
d820: 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52  }..  winceMutexR
d830: 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d  elease(pFile->hM
d840: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
d850: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
d860: 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65 20  .** Destroy the 
d870: 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65 20  part of winFile 
d880: 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68 20  that deals with 
d890: 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a 73  wince locks.*/.s
d8a0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65  tatic void wince
d8b0: 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e 46  DestroyLock(winF
d8c0: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
d8d0: 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  f (pFile->hMutex
d8e0: 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69 72  ){.    /* Acquir
d8f0: 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  e the mutex */. 
d900: 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71     winceMutexAcq
d910: 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
d920: 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ex);..    /* The
d930: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
d940: 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c  s should probabl
d950: 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62 75  y assert in debu
d960: 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65 79  g mode, but they
d970: 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20 63  .       are to c
d980: 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20 61  leanup in case a
d990: 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e 65  ny locks remaine
d9a0: 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 66  d open */.    if
d9b0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
d9c0: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
d9d0: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
d9e0: 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20  Readers --;.    
d9f0: 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
da00: 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64  >local.bReserved
da10: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
da20: 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
da30: 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  d = FALSE;.    }
da40: 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
da50: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b  local.bPending){
da60: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
da70: 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d  ared->bPending =
da80: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
da90: 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
daa0: 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a  al.bExclusive){.
dab0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
dac0: 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
dad0: 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 0a  = FALSE;.    }..
dae0: 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72 65      /* De-refere
daf0: 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f 75  nce and close ou
db00: 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 68  r copy of the sh
db10: 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64  ared memory hand
db20: 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d 61  le */.    osUnma
db30: 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c  pViewOfFile(pFil
db40: 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20 20  e->shared);.    
db50: 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
db60: 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 0a  ile->hShared);..
db70: 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74 68      /* Done with
db80: 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20   the mutex */.  
db90: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
dba0: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
dbb0: 78 29 3b 20 20 20 20 0a 20 20 20 20 6f 73 43 6c  x);    .    osCl
dbc0: 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
dbd0: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
dbe0: 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
dbf0: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a 2a  LL;.  }.}../* .*
dc00: 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  * An implementat
dc10: 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46  ion of the LockF
dc20: 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e  ile() API of Win
dc30: 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73  dows for CE.*/.s
dc40: 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65  tatic BOOL wince
dc50: 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  LockFile(.  LPHA
dc60: 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
dc70: 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
dc80: 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
dc90: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
dca0: 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
dcb0: 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c  fBytesToLockLow,
dcc0: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
dcd0: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67  OfBytesToLockHig
dce0: 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
dcf0: 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
dd00: 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
dd10: 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
dd20: 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
dd30: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
dd40: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
dd50: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
dd60: 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
dd70: 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a  tesToLockHigh);.
dd80: 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
dd90: 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
dda0: 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
ddb0: 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
ddc0: 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61  Mutex);..  /* Wa
ddd0: 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69  nting an exclusi
dde0: 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66  ve lock? */.  if
ddf0: 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
de00: 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
de10: 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20  ED_FIRST.       
de20: 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
de30: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  sToLockLow == (D
de40: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
de50: 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
de60: 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
de70: 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65  rs == 0 && pFile
de80: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
de90: 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20  sive == 0){.    
dea0: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
deb0: 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54  ->bExclusive = T
dec0: 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c  RUE;.       pFil
ded0: 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
dee0: 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ive = TRUE;.    
def0: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
df00: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
df10: 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f  /* Want a read-o
df20: 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65  nly lock? */.  e
df30: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
df40: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
df50: 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26  D)SHARED_FIRST &
df60: 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75  &.           nNu
df70: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
df80: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
df90: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
dfa0: 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d  d->bExclusive ==
dfb0: 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   0){.      pFile
dfc0: 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
dfd0: 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70   ++;.      if (p
dfe0: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61  File->local.nRea
dff0: 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20  ders == 1){.    
e000: 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
e010: 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a  d->nReaders ++;.
e020: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
e030: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
e040: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
e050: 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63  nt a pending loc
e060: 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
e070: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
e080: 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49   == (DWORD)PENDI
e090: 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  NG_BYTE.        
e0a0: 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
e0b0: 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
e0c0: 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e   1){.    /* If n
e0d0: 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68  o pending lock h
e0e0: 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64  as been acquired
e0f0: 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69  , then acquire i
e100: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  t */.    if (pFi
e110: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
e120: 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20  ding == 0) {.   
e130: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
e140: 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  ->bPending = TRU
e150: 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
e160: 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d  local.bPending =
e170: 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
e180: 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
e190: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
e1a0: 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  t a reserved loc
e1b0: 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20  k? */.  else if 
e1c0: 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
e1d0: 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52   == (DWORD)RESER
e1e0: 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20  VED_BYTE.       
e1f0: 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
e200: 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
e210: 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46  = 1){.    if (pF
e220: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
e230: 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20  served == 0) {. 
e240: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
e250: 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20  ed->bReserved = 
e260: 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  TRUE;.      pFil
e270: 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
e280: 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
e290: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
e2a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69  .    }.  }..  wi
e2b0: 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
e2c0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
e2d0: 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e    return bReturn
e2e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d  ;.}../*.** An im
e2f0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
e300: 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41  the UnlockFile A
e310: 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f  PI of Windows fo
e320: 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42  r CE.*/.static B
e330: 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46  OOL winceUnlockF
e340: 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
e350: 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
e360: 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c  dwFileOffsetLow,
e370: 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f  .  DWORD dwFileO
e380: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
e390: 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
e3a0: 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20  sToUnlockLow,.  
e3b0: 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
e3c0: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68  ytesToUnlockHigh
e3d0: 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
e3e0: 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
e3f0: 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
e400: 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
e410: 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55   = FALSE;..  UNU
e420: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
e430: 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b  FileOffsetHigh);
e440: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
e450: 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
e460: 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b  esToUnlockHigh);
e470: 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ..  if (!pFile->
e480: 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54  hMutex) return T
e490: 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65  RUE;.  winceMute
e4a0: 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
e4b0: 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52  hMutex);..  /* R
e4c0: 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64 65  eleasing a reade
e4d0: 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63  r lock or an exc
e4e0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
e4f0: 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
e500: 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  tLow == (DWORD)S
e510: 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20  HARED_FIRST){.  
e520: 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65    /* Did we have
e530: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
e540: 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70  ck? */.    if (p
e550: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
e560: 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61  lusive){.      a
e570: 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42  ssert(nNumberOfB
e580: 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
e590: 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
e5a0: 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46  _SIZE);.      pF
e5b0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
e5c0: 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
e5d0: 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
e5e0: 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
e5f0: 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
e600: 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
e610: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20    }..    /* Did 
e620: 77 65 20 6a 75 73 74 20 68 61 76 65 20 61 20 72  we just have a r
e630: 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  eader lock? */. 
e640: 20 20 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c     else if (pFil
e650: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
e660: 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  s){.      assert
e670: 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
e680: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44  oUnlockLow == (D
e690: 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45  WORD)SHARED_SIZE
e6a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  .             ||
e6b0: 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54   nNumberOfBytesT
e6c0: 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  oUnlockLow == 1)
e6d0: 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
e6e0: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d  ocal.nReaders --
e6f0: 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  ;.      if (pFil
e700: 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
e710: 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a  s == 0).      {.
e720: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73          pFile->s
e730: 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
e740: 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
e750: 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
e760: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
e770: 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65  * Releasing a pe
e780: 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20  nding lock */.  
e790: 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
e7a0: 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
e7b0: 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a  RD)PENDING_BYTE.
e7c0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e             && nN
e7d0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
e7e0: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  lockLow == 1){. 
e7f0: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
e800: 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20  cal.bPending){. 
e810: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
e820: 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c  l.bPending = FAL
e830: 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
e840: 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
e850: 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  g = FALSE;.     
e860: 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
e870: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
e880: 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65  Releasing a rese
e890: 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  rved lock */.  e
e8a0: 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
e8b0: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
e8c0: 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a  D)RESERVED_BYTE.
e8d0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e             && nN
e8e0: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
e8f0: 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20  lockLow == 1){. 
e900: 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
e910: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b  cal.bReserved) {
e920: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
e930: 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20  cal.bReserved = 
e940: 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69  FALSE;.      pFi
e950: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
e960: 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
e970: 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
e980: 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
e990: 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
e9a0: 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
e9b0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65  x);.  return bRe
e9c0: 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e  turn;.}./*.** En
e9d0: 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  d of the special
e9e0: 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a   code for wince.
e9f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ea30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23  *************/.#
ea40: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ea50: 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a  OS_WINCE */../*.
ea60: 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72  ** Lock a file r
ea70: 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  egion..*/.static
ea80: 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c   BOOL winLockFil
ea90: 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68  e(.  LPHANDLE ph
eaa0: 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c  File,.  DWORD fl
eab0: 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  ags,.  DWORD off
eac0: 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
ead0: 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  offsetHigh,.  DW
eae0: 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  ORD numBytesLow,
eaf0: 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
eb00: 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c  sHigh.){.#if SQL
eb10: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
eb20: 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e  *.  ** NOTE: Win
eb30: 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
eb40: 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
eb50: 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
eb60: 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
eb70: 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63  **       API Loc
eb80: 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  kFile..  */.  re
eb90: 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69  turn winceLockFi
eba0: 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65  le(phFile, offse
ebb0: 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68  tLow, offsetHigh
ebc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ebd0: 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65           numByte
ebe0: 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
ebf0: 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28  gh);.#else.  if(
ec00: 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f   isNT() ){.    O
ec10: 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a  VERLAPPED ovlp;.
ec20: 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70      memset(&ovlp
ec30: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
ec40: 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76  LAPPED));.    ov
ec50: 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73  lp.Offset = offs
ec60: 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e  etLow;.    ovlp.
ec70: 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66  OffsetHigh = off
ec80: 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74  setHigh;.    ret
ec90: 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78  urn osLockFileEx
eca0: 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c  (*phFile, flags,
ecb0: 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c   0, numBytesLow,
ecc0: 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26   numBytesHigh, &
ecd0: 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ovlp);.  }else{.
ece0: 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63      return osLoc
ecf0: 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f  kFile(*phFile, o
ed00: 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74  ffsetLow, offset
ed10: 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f  High, numBytesLo
ed20: 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
ed30: 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65           numByte
ed40: 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64  sHigh);.  }.#end
ed50: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  if.}../*.** Unlo
ed60: 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e  ck a file region
ed70: 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  .. */.static BOO
ed80: 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28  L winUnlockFile(
ed90: 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69  .  LPHANDLE phFi
eda0: 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  le,.  DWORD offs
edb0: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f  etLow,.  DWORD o
edc0: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
edd0: 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  RD numBytesLow,.
ede0: 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
edf0: 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49  High.){.#if SQLI
ee00: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
ee10: 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64  .  ** NOTE: Wind
ee20: 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
ee30: 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
ee40: 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
ee50: 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a  of the Win32.  *
ee60: 2a 20 20 20 20 20 20 20 41 50 49 20 55 6e 6c 6f  *       API Unlo
ee70: 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72  ckFile..  */.  r
ee80: 65 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f 63  eturn winceUnloc
ee90: 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66  kFile(phFile, of
eea0: 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48  fsetLow, offsetH
eeb0: 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  igh,.           
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
eed0: 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79  mBytesLow, numBy
eee0: 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a  tesHigh);.#else.
eef0: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
ef00: 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
ef10: 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  vlp;.    memset(
ef20: 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66  &ovlp, 0, sizeof
ef30: 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
ef40: 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d     ovlp.Offset =
ef50: 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20   offsetLow;.    
ef60: 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20  ovlp.OffsetHigh 
ef70: 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20  = offsetHigh;.  
ef80: 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63    return osUnloc
ef90: 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c  kFileEx(*phFile,
efa0: 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c   0, numBytesLow,
efb0: 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26   numBytesHigh, &
efc0: 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ovlp);.  }else{.
efd0: 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c      return osUnl
efe0: 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c  ockFile(*phFile,
eff0: 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
f000: 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73  etHigh, numBytes
f010: 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Low,.           
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
f030: 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a  BytesHigh);.  }.
f040: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  #endif.}../*****
f050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f090: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
f0a0: 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f  next group of ro
f0b0: 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74  utines implement
f0c0: 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73   the I/O methods
f0d0: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
f0e0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
f0f0: 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a  methods object..
f100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
f150: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72  ./*.** Some Micr
f160: 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20  osoft compilers 
f170: 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69  lack this defini
f180: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
f190: 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
f1a0: 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69  E_POINTER.# defi
f1b0: 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ne INVALID_SET_F
f1c0: 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57  ILE_POINTER ((DW
f1d0: 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a  ORD)-1).#endif..
f1e0: 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
f1f0: 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
f200: 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  of the file hand
f210: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
f220: 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d   first .** argum
f230: 65 6e 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f  ent to offset iO
f240: 66 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65  ffset within the
f250: 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
f260: 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 20  sful, return 0. 
f270: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73  .** Otherwise, s
f280: 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  et pFile->lastEr
f290: 72 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e  rno and return n
f2a0: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  on-zero..*/.stat
f2b0: 69 63 20 69 6e 74 20 73 65 65 6b 57 69 6e 46 69  ic int seekWinFi
f2c0: 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  le(winFile *pFil
f2d0: 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  e, sqlite3_int64
f2e0: 20 69 4f 66 66 73 65 74 29 7b 0a 23 69 66 20 21   iOffset){.#if !
f2f0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
f300: 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73    LONG upperBits
f310: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f320: 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33    /* Most sig. 3
f330: 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66  2 bits of new of
f340: 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c  fset */.  LONG l
f350: 6f 77 65 72 42 69 74 73 3b 20 20 20 20 20 20 20  owerBits;       
f360: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61            /* Lea
f370: 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20  st sig. 32 bits 
f380: 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  of new offset */
f390: 0a 20 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20  .  DWORD dwRet; 
f3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3b0: 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
f3c0: 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50  rned by SetFileP
f3d0: 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44 57  ointer() */.  DW
f3e0: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  ORD lastErrno;  
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f400: 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
f410: 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  by GetLastError(
f420: 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41 43 45 28  ) */..  OSTRACE(
f430: 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20  ("SEEK file=%p, 
f440: 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c 20  offset=%lld\n", 
f450: 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66 66 73 65  pFile->h, iOffse
f460: 74 29 29 3b 0a 0a 20 20 75 70 70 65 72 42 69 74  t));..  upperBit
f470: 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66  s = (LONG)((iOff
f480: 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
f490: 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42  fffff);.  lowerB
f4a0: 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66  its = (LONG)(iOf
f4b0: 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
f4c0: 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64  f);..  /* API od
f4d0: 64 69 74 79 3a 20 49 66 20 73 75 63 63 65 73 73  dity: If success
f4e0: 66 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e  ful, SetFilePoin
f4f0: 74 65 72 28 29 20 72 65 74 75 72 6e 73 20 61 20  ter() returns a 
f500: 64 77 6f 72 64 20 0a 20 20 2a 2a 20 63 6f 6e 74  dword .  ** cont
f510: 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72  aining the lower
f520: 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20   32-bits of the 
f530: 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e  new file-offset.
f540: 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73   Or, if it fails
f550: 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e  ,.  ** it return
f560: 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  s INVALID_SET_FI
f570: 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65  LE_POINTER. Howe
f580: 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ver according to
f590: 20 4d 53 44 4e 2c 20 0a 20 20 2a 2a 20 49 4e 56   MSDN, .  ** INV
f5a0: 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
f5b0: 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62  INTER may also b
f5c0: 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66  e a valid new of
f5d0: 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65  fset. So to dete
f5e0: 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74  rmine .  ** whet
f5f0: 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73  her an error has
f600: 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 72   actually occurr
f610: 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e  ed, it is also n
f620: 65 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c  ecessary to call
f630: 20 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72   .  ** GetLastEr
f640: 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77  ror()..  */.  dw
f650: 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50  Ret = osSetFileP
f660: 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c  ointer(pFile->h,
f670: 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70   lowerBits, &upp
f680: 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47  erBits, FILE_BEG
f690: 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52  IN);..  if( (dwR
f6a0: 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f  et==INVALID_SET_
f6b0: 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20  FILE_POINTER.   
f6c0: 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e     && ((lastErrn
f6d0: 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
f6e0: 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29  or())!=NO_ERROR)
f6f0: 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
f700: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
f710: 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
f720: 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
f730: 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d  ERR_SEEK, pFile-
f740: 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
f750: 20 20 20 20 20 20 20 20 20 22 73 65 65 6b 57 69           "seekWi
f760: 6e 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  nFile", pFile->z
f770: 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41  Path);.    OSTRA
f780: 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
f790: 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
f7a0: 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c  RR_SEEK\n", pFil
f7b0: 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
f7c0: 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  rn 1;.  }..  OST
f7d0: 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
f7e0: 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
f7f0: 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
f800: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ;.  return 0;.#e
f810: 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61  lse.  /*.  ** Sa
f820: 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65 78 63  me as above, exc
f830: 65 70 74 20 74 68 61 74 20 74 68 69 73 20 69 6d  ept that this im
f840: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72  plementation wor
f850: 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20  ks for WinRT..  
f860: 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45  */..  LARGE_INTE
f870: 47 45 52 20 78 3b 20 20 20 20 20 20 20 20 20 20  GER x;          
f880: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
f890: 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f   offset */.  BOO
f8a0: 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20 20 20  L bRet;         
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f8c0: 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
f8d0: 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  y SetFilePointer
f8e0: 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61  Ex() */..  x.Qua
f8f0: 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b  dPart = iOffset;
f900: 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46  .  bRet = osSetF
f910: 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69  ilePointerEx(pFi
f920: 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c  le->h, x, 0, FIL
f930: 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28  E_BEGIN);..  if(
f940: 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c  !bRet){.    pFil
f950: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
f960: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
f970: 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
f980: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  (SQLITE_IOERR_SE
f990: 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  EK, pFile->lastE
f9a0: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
f9b0: 20 20 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22     "seekWinFile"
f9c0: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
f9d0: 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53  .    OSTRACE(("S
f9e0: 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EEK file=%p, rc=
f9f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
fa00: 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
fa10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
fa20: 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
fa30: 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72  "SEEK file=%p, r
fa40: 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
fa50: 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65  pFile->h));.  re
fa60: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
fa70: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
fa80: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20  _MMAP_SIZE>0./* 
fa90: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
faa0: 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64  es to VFS method
fab0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
fac0: 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e  winUnmapfile(win
fad0: 46 69 6c 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  File*);.#endif..
fae0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
faf0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  le..**.** It is 
fb00: 72 65 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e  reported that an
fb10: 20 61 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73   attempt to clos
fb20: 65 20 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74  e a handle might
fb30: 20 73 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61   sometimes.** fa
fb40: 69 6c 2e 20 20 54 68 69 73 20 69 73 20 61 20 76  il.  This is a v
fb50: 65 72 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65  ery unreasonable
fb60: 20 72 65 73 75 6c 74 2c 20 62 75 74 20 57 69 6e   result, but Win
fb70: 64 6f 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75  dows is notoriou
fb80: 73 0a 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75  s.** for being u
fb90: 6e 72 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49  nreasonable so I
fba0: 20 64 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68   do not doubt th
fbb0: 61 74 20 69 74 20 6d 69 67 68 74 20 68 61 70 70  at it might happ
fbc0: 65 6e 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63  en.  If.** the c
fbd0: 6c 6f 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70  lose fails, we p
fbe0: 61 75 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c  ause for 100 mil
fbf0: 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72  liseconds and tr
fc00: 79 20 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20  y again.  As.** 
fc10: 6d 61 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45  many as MX_CLOSE
fc20: 5f 41 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74  _ATTEMPT attempt
fc30: 73 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68  s to close the h
fc40: 61 6e 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62  andle are made b
fc50: 65 66 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20  efore.** giving 
fc60: 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  up and returning
fc70: 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64   an error..*/.#d
fc80: 65 66 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41  efine MX_CLOSE_A
fc90: 54 54 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20  TTEMPT 3.static 
fca0: 69 6e 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c  int winClose(sql
fcb0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
fcc0: 20 20 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20    int rc, cnt = 
fcd0: 30 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  0;.  winFile *pF
fce0: 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
fcf0: 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  id;..  assert( i
fd00: 64 21 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  d!=0 );.#ifndef 
fd10: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
fd20: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
fd30: 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64  >pShm==0 );.#end
fd40: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  if.  assert( pFi
fd50: 6c 65 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70  le->h!=NULL && p
fd60: 46 69 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44  File->h!=INVALID
fd70: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
fd80: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
fd90: 53 45 20 66 69 6c 65 3d 25 70 5c 6e 22 2c 20 70  SE file=%p\n", p
fda0: 46 69 6c 65 2d 3e 68 29 29 3b 0a 0a 23 69 66 20  File->h));..#if 
fdb0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
fdc0: 53 49 5a 45 3e 30 0a 20 20 72 63 20 3d 20 77 69  SIZE>0.  rc = wi
fdd0: 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65  nUnmapfile(pFile
fde0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
fdf0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
fe00: 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f  rc;.#endif..  do
fe10: 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f  {.    rc = osClo
fe20: 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
fe30: 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c  h);.    /* Simul
fe40: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 30  ateIOError( rc=0
fe50: 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41  ; cnt=MX_CLOSE_A
fe60: 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20  TTEMPT; ); */.  
fe70: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26  }while( rc==0 &&
fe80: 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53   ++cnt < MX_CLOS
fe90: 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73 71  E_ATTEMPT && (sq
fea0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
feb0: 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69  p(100), 1) );.#i
fec0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
fed0: 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45 5f  E.#define WINCE_
fee0: 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
fef0: 53 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74 72  S 3.  winceDestr
ff00: 6f 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  oyLock(pFile);. 
ff10: 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c   if( pFile->zDel
ff20: 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20  eteOnClose ){.  
ff30: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
ff40: 20 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20 20     while(.      
ff50: 20 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69 6c       osDeleteFil
ff60: 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  eW(pFile->zDelet
ff70: 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20  eOnClose)==0.   
ff80: 20 20 20 20 20 26 26 20 6f 73 47 65 74 46 69 6c       && osGetFil
ff90: 65 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69  eAttributesW(pFi
ffa0: 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
ffb0: 73 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 20  se)!=0xffffffff 
ffc0: 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b  .        && cnt+
ffd0: 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49  + < WINCE_DELETI
ffe0: 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20  ON_ATTEMPTS.    
fff0: 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  ){.       sqlite
10000 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30  3_win32_sleep(10
10010 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 6c  0);  /* Wait a l
10020 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74 72 79  ittle before try
10030 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20  ing again */.   
10040 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
10050 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  ree(pFile->zDele
10060 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a  teOnClose);.  }.
10070 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20  #endif.  if( rc 
10080 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20  ){.    pFile->h 
10090 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70  = NULL;.  }.  Op
100a0 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
100b0 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
100c0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
100d0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
100e0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
100f0 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
10100 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  c ? SQLITE_OK.  
10110 20 20 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c            : winL
10120 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
10130 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65  OERR_CLOSE, osGe
10140 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 20 20 20 20 20 20 20 20 22 77 69 6e 43 6c 6f 73          "winClos
10170 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
10180 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
10190 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
101a0 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
101b0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
101c0 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
101d0 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
101e0 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
101f0 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
10200 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
10210 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
10220 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73  int winRead(.  s
10230 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
10240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
10250 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  e to read from *
10260 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10280 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20  * Write content 
10290 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
102a0 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20   */.  int amt,  
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
102d0 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  tes to read */. 
102e0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
102f0 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42  ffset       /* B
10300 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20  egin reading at 
10310 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29  this offset */.)
10320 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
10330 5f 57 49 4e 43 45 0a 20 20 4f 56 45 52 4c 41 50  _WINCE.  OVERLAP
10340 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20  PED overlapped; 
10350 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
10360 6f 66 66 73 65 74 20 66 6f 72 20 52 65 61 64 46  offset for ReadF
10370 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ile. */.#endif. 
10380 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
10390 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20  = (winFile*)id; 
103a0 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   /* file handle 
103b0 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64  */.  DWORD nRead
103c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
103d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
103e0 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
103f0 20 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20   read from file 
10400 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20  */.  int nRetry 
10410 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10420 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10430 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61  f retrys */..  a
10440 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
10450 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
10460 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  );.  assert( off
10470 73 65 74 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75  set>=0 );.  Simu
10480 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
10490 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
104a0 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45  READ);.  OSTRACE
104b0 28 28 22 52 45 41 44 20 66 69 6c 65 3d 25 70 2c  (("READ file=%p,
104c0 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75   buffer=%p, amou
104d0 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 6c  nt=%d, offset=%l
104e0 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a  ld, lock=%d\n",.
104f0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
10500 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
10510 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c  offset, pFile->l
10520 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20  ocktype));..#if 
10530 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
10540 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c  SIZE>0.  /* Deal
10550 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66   with as much of
10560 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75 65   this read reque
10570 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62  st as possible b
10580 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20  y transfering.  
10590 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
105a0 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
105b0 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20  using memcpy(). 
105c0 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
105d0 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
105e0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73   ){.    if( offs
105f0 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d  et+amt <= pFile-
10600 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
10610 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
10620 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
10630 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
10640 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20  set], amt);.    
10650 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
10660 2d 4d 4d 41 50 20 66 69 6c 65 3d 25 70 2c 20 72  -MMAP file=%p, r
10670 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
10680 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
10690 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
106a0 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
106b0 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
106c0 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d   (int)(pFile->mm
106d0 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29  apSize - offset)
106e0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
106f0 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
10700 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
10710 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79  )[offset], nCopy
10720 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
10730 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
10740 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
10750 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
10760 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
10770 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
10780 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
10790 5f 57 49 4e 43 45 0a 20 20 69 66 28 20 73 65 65  _WINCE.  if( see
107a0 6b 57 69 6e 46 69 6c 65 28 70 46 69 6c 65 2c 20  kWinFile(pFile, 
107b0 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20 20 4f  offset) ){.    O
107c0 53 54 52 41 43 45 28 28 22 52 45 41 44 20 66 69  STRACE(("READ fi
107d0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
107e0 5f 46 55 4c 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d  _FULL\n", pFile-
107f0 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
10800 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
10810 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65  }.  while( !osRe
10820 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  adFile(pFile->h,
10830 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65   pBuf, amt, &nRe
10840 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a  ad, 0) ){.#else.
10850 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61    memset(&overla
10860 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pped, 0, sizeof(
10870 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
10880 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
10890 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
108a0 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
108b0 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66  .  overlapped.Of
108c0 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47  fsetHigh = (LONG
108d0 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26  )((offset>>32) &
108e0 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20   0x7fffffff);.  
108f0 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69  while( !osReadFi
10900 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75  le(pFile->h, pBu
10910 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20  f, amt, &nRead, 
10920 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26 26 0a  &overlapped) &&.
10930 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
10940 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52 4f 52  stError()!=ERROR
10950 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23  _HANDLE_EOF ){.#
10960 65 6e 64 69 66 0a 20 20 20 20 44 57 4f 52 44 20  endif.    DWORD 
10970 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69  lastErrno;.    i
10980 66 28 20 72 65 74 72 79 49 6f 65 72 72 28 26 6e  f( retryIoerr(&n
10990 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e  Retry, &lastErrn
109a0 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  o) ) continue;. 
109b0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
109c0 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
109d0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52  .    OSTRACE(("R
109e0 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EAD file=%p, rc=
109f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
10a00 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  D\n", pFile->h))
10a10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
10a20 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
10a30 49 4f 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c  IOERR_READ, pFil
10a40 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
10a50 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 52             "winR
10a60 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ead", pFile->zPa
10a70 74 68 29 3b 0a 20 20 7d 0a 20 20 6c 6f 67 49 6f  th);.  }.  logIo
10a80 65 72 72 28 6e 52 65 74 72 79 29 3b 0a 20 20 69  err(nRetry);.  i
10a90 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29  f( nRead<(DWORD)
10aa0 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e  amt ){.    /* Un
10ab0 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68  read parts of th
10ac0 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
10ad0 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a   zero-filled */.
10ae0 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
10af0 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d  ar*)pBuf)[nRead]
10b00 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b  , 0, amt-nRead);
10b10 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52  .    OSTRACE(("R
10b20 45 41 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EAD file=%p, rc=
10b30 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
10b40 52 54 5f 52 45 41 44 5c 6e 22 2c 20 70 46 69 6c  RT_READ\n", pFil
10b50 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
10b60 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
10b70 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
10b80 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
10b90 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  D file=%p, rc=SQ
10ba0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
10bb0 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
10bc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
10bd0 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
10be0 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
10bf0 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
10c00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
10c10 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
10c20 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
10c30 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
10c40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
10c50 6e 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  nWrite(.  sqlite
10c60 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
10c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
10c80 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  e to write into 
10c90 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
10ca0 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
10cb0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
10cc0 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
10cd0 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10d00 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65  f bytes to write
10d10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
10d20 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20  t64 offset      
10d30 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
10d40 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f  into the file to
10d50 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61   begin writing a
10d60 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
10d70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
10d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
10d90 65 20 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f  e if error has o
10da0 63 63 75 72 72 65 64 2c 20 65 6c 73 65 20 66 61  ccurred, else fa
10db0 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  lse */.  winFile
10dc0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
10dd0 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
10de0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
10df0 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20   nRetry = 0;    
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10e10 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65  Number of retrie
10e20 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
10e30 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  amt>0 );.  asser
10e40 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
10e50 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
10e60 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
10e70 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75  R_WRITE);.  Simu
10e80 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
10e90 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
10ea0 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43  FULL);..  OSTRAC
10eb0 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25  E(("WRITE file=%
10ec0 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d  p, buffer=%p, am
10ed0 6f 75 6e 74 3d 25 64 2c 20 6f 66 66 73 65 74 3d  ount=%d, offset=
10ee0 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  %lld, lock=%d\n"
10ef0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
10f00 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
10f10 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d  , offset, pFile-
10f20 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
10f30 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
10f40 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65  P_SIZE>0.  /* De
10f50 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20  al with as much 
10f60 6f 66 20 74 68 69 73 20 77 72 69 74 65 20 72 65  of this write re
10f70 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c  quest as possibl
10f80 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67  e by transfering
10f90 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  .  ** data from 
10fa0 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
10fb0 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28  ng using memcpy(
10fc0 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  ).  */.  if( off
10fd0 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  set<pFile->mmapS
10fe0 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ize ){.    if( o
10ff0 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69  ffset+amt <= pFi
11000 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
11010 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28        memcpy(&((
11020 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
11030 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
11040 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  ], pBuf, amt);. 
11050 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57       OSTRACE(("W
11060 52 49 54 45 2d 4d 4d 41 50 20 66 69 6c 65 3d 25  RITE-MMAP file=%
11070 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
11080 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
11090 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
110a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
110b0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
110c0 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65  py = (int)(pFile
110d0 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
110e0 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  set);.      memc
110f0 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
11100 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
11110 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e  offset], pBuf, n
11120 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
11130 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
11140 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
11150 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
11160 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
11170 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
11180 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
11190 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 72 63 20  E_OS_WINCE.  rc 
111a0 3d 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46  = seekWinFile(pF
111b0 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ile, offset);.  
111c0 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65 6c  if( rc==0 ){.#el
111d0 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23 69  se.  {.#endif.#i
111e0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
111f0 43 45 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  CE.    OVERLAPPE
11200 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20  D overlapped;   
11210 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73       /* The offs
11220 65 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65  et for WriteFile
11230 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  . */.#endif.    
11240 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a  u8 *aRem = (u8 *
11250 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a  )pBuf;        /*
11260 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20   Data yet to be 
11270 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
11280 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20  nt nRem = amt;  
11290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
112a0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
112b0 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
112c0 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e  n */.    DWORD n
112d0 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
112e0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
112f0 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20  written by each 
11300 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c  WriteFile() call
11310 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61   */.    DWORD la
11320 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
11330 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72  OR;   /* Value r
11340 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
11350 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69  stError() */..#i
11360 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
11370 43 45 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  CE.    memset(&o
11380 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69  verlapped, 0, si
11390 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
113a0 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65  );.    overlappe
113b0 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47  d.Offset = (LONG
113c0 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  )(offset & 0xfff
113d0 66 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65 72  fffff);.    over
113e0 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67  lapped.OffsetHig
113f0 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  h = (LONG)((offs
11400 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
11410 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ffff);.#endif.. 
11420 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30     while( nRem>0
11430 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
11440 53 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 69 66  S_WINCE.      if
11450 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70  ( !osWriteFile(p
11460 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e  File->h, aRem, n
11470 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29  Rem, &nWrite, 0)
11480 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   ){.#else.      
11490 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65  if( !osWriteFile
114a0 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c  (pFile->h, aRem,
114b0 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20   nRem, &nWrite, 
114c0 26 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a  &overlapped) ){.
114d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
114e0 66 28 20 72 65 74 72 79 49 6f 65 72 72 28 26 6e  f( retryIoerr(&n
114f0 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e  Retry, &lastErrn
11500 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  o) ) continue;. 
11510 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11520 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
11530 72 74 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c  rt( nWrite==0 ||
11540 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52 44 29   nWrite<=(DWORD)
11550 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20 20 69 66  nRem );.      if
11560 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e  ( nWrite==0 || n
11570 57 72 69 74 65 3e 28 44 57 4f 52 44 29 6e 52 65  Write>(DWORD)nRe
11580 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  m ){.        las
11590 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
115a0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
115b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
115c0 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  }.#if !SQLITE_OS
115d0 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 6f 66 66  _WINCE.      off
115e0 73 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20  set += nWrite;. 
115f0 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e       overlapped.
11600 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28  Offset = (LONG)(
11610 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66  offset & 0xfffff
11620 66 66 66 29 3b 0a 20 20 20 20 20 20 6f 76 65 72  fff);.      over
11630 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67  lapped.OffsetHig
11640 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  h = (LONG)((offs
11650 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
11660 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ffff);.#endif.  
11670 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69      aRem += nWri
11680 74 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d  te;.      nRem -
11690 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a  = nWrite;.    }.
116a0 20 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29      if( nRem>0 )
116b0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
116c0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
116d0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
116e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
116f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
11700 66 28 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61  f(   ( pFile->la
11710 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48  stErrno==ERROR_H
11720 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20  ANDLE_DISK_FULL 
11730 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46  ).       || ( pF
11740 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d  ile->lastErrno==
11750 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20  ERROR_DISK_FULL 
11760 29 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  )){.      OSTRAC
11770 45 28 28 22 57 52 49 54 45 20 66 69 6c 65 3d 25  E(("WRITE file=%
11780 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c  p, rc=SQLITE_FUL
11790 4c 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  L\n", pFile->h))
117a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
117b0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
117c0 7d 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  }.    OSTRACE(("
117d0 57 52 49 54 45 20 66 69 6c 65 3d 25 70 2c 20 72  WRITE file=%p, r
117e0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  c=SQLITE_IOERR_W
117f0 52 49 54 45 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  RITE\n", pFile->
11800 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
11810 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
11820 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20  TE_IOERR_WRITE, 
11830 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11840 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
11850 77 69 6e 57 72 69 74 65 22 2c 20 70 46 69 6c 65  winWrite", pFile
11860 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
11870 65 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28  e{.    logIoerr(
11880 6e 52 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20 4f  nRetry);.  }.  O
11890 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 66  STRACE(("WRITE f
118a0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
118b0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
118c0 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  h));.  return SQ
118d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
118e0 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
118f0 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
11900 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
11910 74 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75  tatic int winTru
11920 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69  ncate(sqlite3_fi
11930 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
11940 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20  int64 nByte){.  
11950 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
11960 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20   (winFile*)id;  
11970 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f  /* File handle o
11980 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72  bject */.  int r
11990 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
119a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
119b0 74 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68  turn code for th
119c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
119d0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
119e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
119f0 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
11a00 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
11a10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
11a20 43 41 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45  CATE);.  OSTRACE
11a30 28 28 22 54 52 55 4e 43 41 54 45 20 66 69 6c 65  (("TRUNCATE file
11a40 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c 20  =%p, size=%lld, 
11a50 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  lock=%d\n",.    
11a60 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
11a70 20 6e 42 79 74 65 2c 20 70 46 69 6c 65 2d 3e 6c   nByte, pFile->l
11a80 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a  ocktype));..  /*
11a90 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73   If the user has
11aa0 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68   configured a ch
11ab0 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69  unk-size for thi
11ac0 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65  s file, truncate
11ad0 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73   the.  ** file s
11ae0 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73  o that it consis
11af0 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72  ts of an integer
11b00 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b   number of chunk
11b10 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a  s (i.e. the.  **
11b20 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a   actual file siz
11b30 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72  e after the oper
11b40 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72  ation may be lar
11b50 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ger than the req
11b60 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65  uested.  ** size
11b70 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  )..  */.  if( pF
11b80 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29  ile->szChunk>0 )
11b90 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28  {.    nByte = ((
11ba0 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73  nByte + pFile->s
11bb0 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c  zChunk - 1)/pFil
11bc0 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
11bd0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
11be0 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66  }..  /* SetEndOf
11bf0 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e  File() returns n
11c00 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63  on-zero when suc
11c10 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f  cessful, or zero
11c20 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20   when it fails. 
11c30 2a 2f 0a 20 20 69 66 28 20 73 65 65 6b 57 69 6e  */.  if( seekWin
11c40 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74  File(pFile, nByt
11c50 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  e) ){.    rc = w
11c60 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
11c70 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
11c80 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
11c90 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
11ca0 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75           "winTru
11cb0 6e 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e  ncate1", pFile->
11cc0 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20  zPath);.  }else 
11cd0 69 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f  if( 0==osSetEndO
11ce0 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20  fFile(pFile->h) 
11cf0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  &&.            (
11d00 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  (lastErrno = osG
11d10 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d  etLastError())!=
11d20 45 52 52 4f 52 5f 55 53 45 52 5f 4d 41 50 50 45  ERROR_USER_MAPPE
11d30 44 5f 46 49 4c 45 29 20 29 7b 0a 20 20 20 20 70  D_FILE) ){.    p
11d40 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
11d50 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
11d60 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
11d70 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
11d80 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e  RUNCATE, pFile->
11d90 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
11da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11db0 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c 20  "winTruncate2", 
11dc0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
11dd0 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d   }..#if SQLITE_M
11de0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
11df0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
11e00 77 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f  was truncated to
11e10 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20   a size smaller 
11e20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
11e30 6c 79 0a 20 20 2a 2a 20 6d 61 70 70 65 64 20 72  ly.  ** mapped r
11e40 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68  egion, reduce th
11e50 65 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70  e effective mapp
11e60 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c  ing size as well
11e70 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20  . SQLite will.  
11e80 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e  ** use read() an
11e90 64 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63  d write() to acc
11ea0 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20  ess data beyond 
11eb0 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20  this point from 
11ec0 6e 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69  now on..  */.  i
11ed0 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  f( pFile->pMapRe
11ee0 67 69 6f 6e 20 26 26 20 6e 42 79 74 65 3c 70 46  gion && nByte<pF
11ef0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
11f00 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  .    pFile->mmap
11f10 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Size = nByte;.  
11f20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  }.#endif..  OSTR
11f30 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 66  ACE(("TRUNCATE f
11f40 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
11f50 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
11f60 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
11f70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
11f80 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11f90 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
11fa0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
11fb0 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
11fc0 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
11fd0 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
11fe0 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
11ff0 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
12000 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65   occuring at the
12010 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
12020 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
12030 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
12040 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
12050 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
12060 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  dif../*.** Make 
12070 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
12080 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
12090 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
120a0 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73  ed to disk..*/.s
120b0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e  tatic int winSyn
120c0 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
120d0 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
120e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
120f0 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a  O_SYNC.  /*.  **
12100 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20   Used only when 
12110 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
12120 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20  s not defined.. 
12130 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a    */.  BOOL rc;.
12140 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
12150 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21  ned(NDEBUG) || !
12160 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
12170 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20  O_SYNC) || \.   
12180 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   (defined(SQLITE
12190 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e 65  _TEST) && define
121a0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 29  d(SQLITE_DEBUG))
121b0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  /*.  ** Used 
121c0 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
121d0 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
121e0 65 64 20 61 6e 64 20 62 79 20 74 68 65 20 61 73  ed and by the as
121f0 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20  sert() and/or.  
12200 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63  ** OSTRACE() mac
12210 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e  ros..   */.  win
12220 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
12230 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73  inFile*)id;.#els
12240 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
12250 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66  ETER(id);.#endif
12260 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
12270 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20  e );.  /* Check 
12280 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
12290 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
122a0 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
122b0 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
122c0 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
122d0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
122e0 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
122f0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
12300 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f  C_FULL.  );..  /
12310 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
12320 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
12330 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
12340 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
12350 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
12360 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
12370 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
12380 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
12390 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
123a0 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
123b0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
123c0 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53  TE_FULL );..  OS
123d0 54 52 41 43 45 28 28 22 53 59 4e 43 20 66 69 6c  TRACE(("SYNC fil
123e0 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20  e=%p, flags=%x, 
123f0 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  lock=%d\n",.    
12400 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
12410 20 66 6c 61 67 73 2c 20 70 46 69 6c 65 2d 3e 6c   flags, pFile->l
12420 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e  ocktype));..#ifn
12430 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
12440 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
12450 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65  ER(flags);.#else
12460 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26 30 78  .  if( (flags&0x
12470 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
12480 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c  _FULL ){.    sql
12490 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
124a0 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c  unt++;.  }.  sql
124b0 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
124c0 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
124d0 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
124e0 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
124f0 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
12500 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
12510 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
12520 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
12530 53 59 4e 43 0a 20 20 72 65 74 75 72 6e 20 53 51  SYNC.  return SQ
12540 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
12550 20 72 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c   rc = osFlushFil
12560 65 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e  eBuffers(pFile->
12570 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  h);.  SimulateIO
12580 45 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20  Error( rc=FALSE 
12590 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
125a0 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e     OSTRACE(("SYN
125b0 43 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  C file=%p, rc=SQ
125c0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
125d0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
125e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
125f0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
12600 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
12610 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
12620 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59      OSTRACE(("SY
12630 4e 43 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  NC file=%p, rc=S
12640 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e  QLITE_IOERR_FSYN
12650 43 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  C\n", pFile->h))
12660 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
12670 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
12680 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69  IOERR_FSYNC, pFi
12690 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
126a0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
126b0 53 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Sync", pFile->zP
126c0 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ath);.  }.#endif
126d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
126e0 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
126f0 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
12700 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
12710 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a  c int winFileSiz
12720 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
12730 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
12740 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e  4 *pSize){.  win
12750 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
12760 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  inFile*)id;.  in
12770 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12780 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
12790 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
127a0 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 53 69  pSize!=0 );.  Si
127b0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
127c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
127d0 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f 53 54 52  R_FSTAT);.  OSTR
127e0 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d  ACE(("SIZE file=
127f0 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c 6e 22 2c  %p, pSize=%p\n",
12800 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65   pFile->h, pSize
12810 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
12820 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20  OS_WINRT.  {.   
12830 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49   FILE_STANDARD_I
12840 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66  NFO info;.    if
12850 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72  ( osGetFileInfor
12860 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
12870 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53  (pFile->h, FileS
12880 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20  tandardInfo,.   
12890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
128b0 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28    &info, sizeof(
128c0 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20 20 20  info)) ){.      
128d0 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e  *pSize = info.En
128e0 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61 72 74  dOfFile.QuadPart
128f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12900 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
12910 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
12920 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63  rror();.      rc
12930 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
12940 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
12950 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  T, pFile->lastEr
12960 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
12970 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
12980 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65  FileSize", pFile
12990 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
129a0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20    }.#else.  {.  
129b0 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74    DWORD upperBit
129c0 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f 77  s;.    DWORD low
129d0 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52  erBits;.    DWOR
129e0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
129f0 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73    lowerBits = os
12a00 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c  GetFileSize(pFil
12a10 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73  e->h, &upperBits
12a20 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  );.    *pSize = 
12a30 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
12a40 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29  )upperBits)<<32)
12a50 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20   + lowerBits;.  
12a60 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69    if(   (lowerBi
12a70 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ts == INVALID_FI
12a80 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20  LE_SIZE).       
12a90 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
12aa0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
12ab0 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b  ))!=NO_ERROR) ){
12ac0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
12ad0 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
12ae0 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
12af0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
12b00 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20  TE_IOERR_FSTAT, 
12b10 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12b20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
12b30 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46  winFileSize", pF
12b40 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
12b50 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
12b60 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66  OSTRACE(("SIZE f
12b70 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70  ile=%p, pSize=%p
12b80 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72  , *pSize=%lld, r
12b90 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
12ba0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53      pFile->h, pS
12bb0 69 7a 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c  ize, *pSize, sql
12bc0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
12bd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
12be0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c  }../*.** LOCKFIL
12bf0 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
12c00 4c 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  LY is undefined 
12c10 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20  on some Windows 
12c20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
12c30 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  def LOCKFILE_FAI
12c40 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20  L_IMMEDIATELY.# 
12c50 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f  define LOCKFILE_
12c60 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
12c70 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64   1.#endif..#ifnd
12c80 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  ef LOCKFILE_EXCL
12c90 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66  USIVE_LOCK.# def
12ca0 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43  ine LOCKFILE_EXC
12cb0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65  LUSIVE_LOCK 2.#e
12cc0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74  ndif../*.** Hist
12cd0 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65  orically, SQLite
12ce0 20 68 61 73 20 75 73 65 64 20 62 6f 74 68 20 74   has used both t
12cf0 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20  he LockFile and 
12d00 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74  LockFileEx funct
12d10 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68  ions..** When th
12d20 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74  e LockFile funct
12d30 69 6f 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74  ion was used, it
12d40 20 77 61 73 20 61 6c 77 61 79 73 20 65 78 70 65   was always expe
12d50 63 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20  cted to fail.** 
12d60 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74  immediately if t
12d70 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  he lock could no
12d80 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20  t be obtained.  
12d90 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20  Also, it always 
12da0 65 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f  expected to.** o
12db0 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69  btain an exclusi
12dc0 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20  ve lock.  These 
12dd0 66 6c 61 67 73 20 61 72 65 20 75 73 65 64 20 77  flags are used w
12de0 69 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  ith the LockFile
12df0 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  Ex function.** a
12e00 6e 64 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65  nd reflect those
12e10 20 65 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74   expectations; t
12e20 68 65 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73  herefore, they s
12e30 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61  hould not be cha
12e40 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  nged..*/.#ifndef
12e50 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
12e60 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20  _FLAGS.# define 
12e70 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
12e80 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c  FLAGS   (LOCKFIL
12e90 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
12ea0 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20  LY | \.         
12eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ec0 20 20 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c           LOCKFIL
12ed0 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
12ee0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
12ef0 43 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74  Currently, SQLit
12f00 65 20 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68  e never calls th
12f10 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  e LockFileEx fun
12f20 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61  ction without wa
12f30 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c  nting the.** cal
12f40 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69  l to fail immedi
12f50 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63  ately if the loc
12f60 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
12f70 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
12f80 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
12f90 45 58 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e  EX_FLAGS.# defin
12fa0 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  e SQLITE_LOCKFIL
12fb0 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46  EEX_FLAGS (LOCKF
12fc0 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
12fd0 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TELY).#endif../*
12fe0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
12ff0 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69  ader lock..** Di
13000 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74  fferent API rout
13010 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20  ines are called 
13020 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
13030 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73  ther or not this
13040 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20  .** is Win9x or 
13050 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63  WinNT..*/.static
13060 20 69 6e 74 20 67 65 74 52 65 61 64 4c 6f 63 6b   int getReadLock
13070 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
13080 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f  {.  int res;.  O
13090 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f  STRACE(("READ-LO
130a0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b  CK file=%p, lock
130b0 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
130c0 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
130d0 65 29 29 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  e));.  if( isNT(
130e0 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
130f0 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a 0a  OS_WINCE.    /*.
13100 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e      ** NOTE: Win
13110 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
13120 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
13130 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
13140 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
13150 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c    **       API L
13160 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20 2a  ockFileEx..    *
13170 2f 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 63  /.    res = winc
13180 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  eLockFile(&pFile
13190 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
131a0 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6c  T, 0, 1, 0);.#el
131b0 73 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  se.    res = win
131c0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
131d0 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
131e0 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48 41  ILEEX_FLAGS, SHA
131f0 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20  RED_FIRST, 0,.  
13200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13210 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
13220 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   0);.#endif.  }.
13230 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
13240 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
13250 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b  lse{.    int lk;
13260 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
13270 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c  domness(sizeof(l
13280 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46  k), &lk);.    pF
13290 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
132a0 79 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c  yte = (short)((l
132b0 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25  k & 0x7fffffff)%
132c0 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
132d0 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  ));.    res = wi
132e0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
132f0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
13300 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20  FILE_FLAGS,.    
13310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13320 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70    SHARED_FIRST+p
13330 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
13340 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  Byte, 0, 1, 0);.
13350 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
13360 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20   res == 0 ){.   
13370 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
13380 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
13390 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20  or();.    /* No 
133a0 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61  need to log a fa
133b0 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f  ilure to lock */
133c0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
133d0 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d  "READ-LOCK file=
133e0 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46  %p, rc=%s\n", pF
133f0 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45  ile->h, sqlite3E
13400 72 72 4e 61 6d 65 28 72 65 73 29 29 29 3b 0a 20  rrName(res)));. 
13410 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
13420 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61  /*.** Undo a rea
13430 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  dlock.*/.static 
13440 69 6e 74 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f  int unlockReadLo
13450 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  ck(winFile *pFil
13460 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  e){.  int res;. 
13470 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
13480 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
13490 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25  AD-UNLOCK file=%
134a0 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  p, lock=%d\n", p
134b0 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
134c0 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66  locktype));.  if
134d0 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
134e0 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46  res = winUnlockF
134f0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
13500 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
13510 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
13520 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
13530 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
13540 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65  I.  else{.    re
13550 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  s = winUnlockFil
13560 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
13570 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d  RED_FIRST+pFile-
13580 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
13590 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23   0, 1, 0);.  }.#
135a0 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d  endif.  if( res=
135b0 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e  =0 && ((lastErrn
135c0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
135d0 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54  or())!=ERROR_NOT
135e0 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20  _LOCKED) ){.    
135f0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
13600 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
13610 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
13620 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
13630 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  K, pFile->lastEr
13640 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
13650 20 20 22 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63    "unlockReadLoc
13660 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  k", pFile->zPath
13670 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  );.  }.  OSTRACE
13680 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66  (("READ-UNLOCK f
13690 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
136a0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
136b0 74 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29  te3ErrName(res))
136c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  );.  return res;
136d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
136e0 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
136f0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
13700 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
13710 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
13720 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
13730 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
13740 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
13750 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
13760 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
13770 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
13780 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
13790 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
137a0 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
137b0 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
137c0 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
137d0 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
137e0 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
137f0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
13800 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
13810 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
13820 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
13830 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
13840 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
13850 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
13860 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
13870 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
13880 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
13890 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
138a0 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
138b0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
138c0 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
138d0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
138e0 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
138f0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
13900 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
13910 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
13920 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
13930 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
13940 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
13950 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
13960 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
13970 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
13980 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
13990 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
139a0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
139b0 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f  ck.  The winUnlo
139c0 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ck() routine.** 
139d0 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73  erases all locks
139e0 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74   at once and ret
139f0 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74  urns us immediat
13a00 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c  ely to locking l
13a10 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73  evel 0..** It is
13a20 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
13a30 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   lower the locki
13a40 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65  ng level one ste
13a50 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f  p at a time.  Yo
13a60 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72  u.** must go str
13a70 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67  aight to locking
13a80 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61   level 0..*/.sta
13a90 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28  tic int winLock(
13aa0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13ab0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
13ac0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13ad0 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74  TE_OK;    /* Ret
13ae0 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
13af0 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69  broutines */.  i
13b00 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
13b10 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
13b20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63  of a Windows loc
13b30 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  k call */.  int 
13b40 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20  newLocktype;    
13b50 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d     /* Set pFile-
13b60 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69  >locktype to thi
13b70 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65  s value before e
13b80 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  xiting */.  int 
13b90 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
13ba0 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65   0;/* True if we
13bb0 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44   acquired a PEND
13bc0 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69  ING lock this ti
13bd0 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20  me */.  winFile 
13be0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
13bf0 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c  e*)id;.  DWORD l
13c00 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52  astErrno = NO_ER
13c10 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ROR;..  assert( 
13c20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41  id!=0 );.  OSTRA
13c30 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25  CE(("LOCK file=%
13c40 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64  p, oldLock=%d(%d
13c50 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22  ), newLock=%d\n"
13c60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
13c70 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
13c80 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73  cktype, pFile->s
13c90 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c  haredLockByte, l
13ca0 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a  ocktype));..  /*
13cb0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
13cc0 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
13cd0 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
13ce0 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
13cf0 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c  the.  ** OsFile,
13d00 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
13d10 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
13d20 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
13d30 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f  as.  ** sqlite3O
13d40 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  sEnterMutex() ha
13d50 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
13d60 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
13d70 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
13d80 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
13d90 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
13da0 2d 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c 20 72  -HELD file=%p, r
13db0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
13dc0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
13dd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13de0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
13df0 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
13e00 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
13e10 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73  rrect.  */.  ass
13e20 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
13e30 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  type!=NO_LOCK ||
13e40 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
13e50 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
13e60 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45  rt( locktype!=PE
13e70 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
13e80 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
13e90 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
13ea0 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  || pFile->lockty
13eb0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
13ec0 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68  );..  /* Lock th
13ed0 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
13ee0 79 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  yte if we need t
13ef0 6f 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44  o acquire a PEND
13f00 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a  ING lock or.  **
13f10 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20   a SHARED lock. 
13f20 20 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69   If we are acqui
13f30 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
13f40 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74  ck, the acquisit
13f50 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ion of.  ** the 
13f60 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74  PENDING_LOCK byt
13f70 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a  e is temporary..
13f80 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79    */.  newLockty
13f90 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  pe = pFile->lock
13fa0 74 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70  type;.  if(   (p
13fb0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
13fc0 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c  NO_LOCK).     ||
13fd0 20 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d   (   (locktype==
13fe0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
13ff0 20 20 20 20 20 20 20 20 20 26 26 20 28 70 46 69           && (pFi
14000 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  le->locktype==RE
14010 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20  SERVED_LOCK)).  
14020 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
14030 20 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63   3;.    while( c
14040 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d  nt-->0 && (res =
14050 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
14060 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
14070 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20  OCKFILE_FLAGS,. 
14080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140a0 20 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f          PENDING_
140b0 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d  BYTE, 0, 1, 0))=
140c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
140d0 72 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65  ry 3 times to ge
140e0 74 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f  t the pending lo
140f0 63 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65  ck.  This is nee
14100 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20  ded to work.    
14110 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62    ** around prob
14120 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 69  lems caused by i
14130 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61  ndexing and/or a
14140 6e 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61  nti-virus softwa
14150 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57  re on.      ** W
14160 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
14170 20 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20        ** If you 
14180 61 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 63  are using this c
14190 6f 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66  ode as a model f
141a0 6f 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56  or alternative V
141b0 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20  FSes, do not.   
141c0 20 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20     ** copy this 
141d0 72 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74  retry logic.  It
141e0 20 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e   is a hack inten
141f0 64 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20  ded for Windows 
14200 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  only..      */. 
14210 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c       OSTRACE(("L
14220 4f 43 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c  OCK-PENDING-FAIL
14230 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d   file=%p, count=
14240 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
14250 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
14260 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69  le->h, cnt, sqli
14270 74 65 33 45 72 72 4e 61 6d 65 28 72 65 73 29 29  te3ErrName(res))
14280 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74  );.      if( cnt
14290 20 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   ) sqlite3_win32
142a0 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d  _sleep(1);.    }
142b0 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c  .    gotPendingL
142c0 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69  ock = res;.    i
142d0 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20  f( !res ){.     
142e0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
142f0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
14300 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
14310 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20  cquire a shared 
14320 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
14330 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
14340 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
14350 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
14360 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  e->locktype==NO_
14370 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
14380 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  = getReadLock(pF
14390 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65  ile);.    if( re
143a0 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f  s ){.      newLo
143b0 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f  cktype = SHARED_
143c0 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
143d0 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
143e0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
143f0 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
14400 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
14410 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a  ESERVED lock.  *
14420 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
14430 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
14440 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
14450 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
14460 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
14470 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20  CK );.    res = 
14480 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
14490 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
144a0 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45  CKFILE_FLAGS, RE
144b0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
144c0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
144d0 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  es ){.      newL
144e0 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56  ocktype = RESERV
144f0 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
14500 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72  se{.      lastEr
14510 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
14520 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
14530 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
14540 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20  a PENDING lock. 
14550 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
14560 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe==EXCLUSIVE_LO
14570 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
14580 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50   newLocktype = P
14590 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
145a0 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
145b0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  = 0;.  }..  /* A
145c0 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53  cquire an EXCLUS
145d0 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  IVE lock.  */.  
145e0 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58  if( locktype==EX
145f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
14600 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
14610 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
14620 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe>=SHARED_LOCK 
14630 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c  );.    res = unl
14640 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  ockReadLock(pFil
14650 65 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  e);.    res = wi
14660 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
14670 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
14680 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52  FILE_FLAGS, SHAR
14690 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20  ED_FIRST, 0,.   
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146b0 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
146c0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
146d0 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
146e0 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45  type = EXCLUSIVE
146f0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
14700 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
14710 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
14720 6f 72 28 29 3b 0a 20 20 20 20 20 20 67 65 74 52  or();.      getR
14730 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
14740 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14750 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e  If we are holdin
14760 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  g a PENDING lock
14770 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62   that ought to b
14780 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e  e released, then
14790 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74  .  ** release it
147a0 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
147b0 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
147c0 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  && locktype==SHA
147d0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
147e0 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
147f0 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47  File->h, PENDING
14800 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
14810 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74  .  }..  /* Updat
14820 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74  e the state of t
14830 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64  he lock has held
14840 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73   in the file des
14850 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a  criptor then.  *
14860 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70  * return the app
14870 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20  ropriate result 
14880 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  code..  */.  if(
14890 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d   res ){.    rc =
148a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
148b0 6c 73 65 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  lse{.    OSTRACE
148c0 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c  (("LOCK-FAIL fil
148d0 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c  e=%p, wanted=%d,
148e0 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   got=%d\n",.    
148f0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
14900 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77  h, locktype, new
14910 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 20 20  Locktype));.    
14920 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
14930 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
14940 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
14950 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  SY;.  }.  pFile-
14960 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
14970 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f  newLocktype;.  O
14980 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69  STRACE(("LOCK fi
14990 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20  le=%p, lock=%d, 
149a0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
149b0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
149c0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
149d0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
149e0 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
149f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
14a00 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
14a10 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
14a20 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
14a30 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
14a40 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
14a50 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
14a60 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
14a70 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
14a80 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
14a90 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65  ro, otherwise ze
14aa0 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
14ab0 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76  t winCheckReserv
14ac0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
14ad0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
14ae0 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
14af0 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  ;.  winFile *pFi
14b00 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
14b10 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
14b20 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
14b30 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
14b40 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
14b50 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53  .  OSTRACE(("TES
14b60 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  T-WR-LOCK file=%
14b70 70 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22  p, pResOut=%p\n"
14b80 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73  , pFile->h, pRes
14b90 4f 75 74 29 29 3b 0a 0a 20 20 61 73 73 65 72 74  Out));..  assert
14ba0 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  ( id!=0 );.  if(
14bb0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14bc0 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
14bd0 29 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  ){.    rc = 1;. 
14be0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53     OSTRACE(("TES
14bf0 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  T-WR-LOCK file=%
14c00 70 2c 20 72 63 3d 25 64 20 28 6c 6f 63 61 6c 29  p, rc=%d (local)
14c10 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
14c20 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  c));.  }else{.  
14c30 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69    rc = winLockFi
14c40 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
14c50 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f  LITE_LOCKFILEEX_
14c60 46 4c 41 47 53 2c 52 45 53 45 52 56 45 44 5f 42  FLAGS,RESERVED_B
14c70 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
14c80 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
14c90 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
14ca0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  (&pFile->h, RESE
14cb0 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
14cc0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
14cd0 63 20 3d 20 21 72 63 3b 0a 20 20 20 20 4f 53 54  c = !rc;.    OST
14ce0 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
14cf0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  OCK file=%p, rc=
14d00 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20  %d (remote)\n", 
14d10 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 29 3b 0a  pFile->h, rc));.
14d20 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
14d30 20 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28 28   rc;.  OSTRACE((
14d40 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69  "TEST-WR-LOCK fi
14d50 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25  le=%p, pResOut=%
14d60 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20  p, *pResOut=%d, 
14d70 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
14d80 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
14d90 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c 20 2a  e->h, pResOut, *
14da0 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74  pResOut));.  ret
14db0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14dc0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
14dd0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
14de0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
14df0 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70  or id to locktyp
14e00 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
14e10 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
14e20 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
14e30 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
14e40 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
14e50 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
14e60 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
14e70 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
14e80 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
14e90 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
14ea0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
14eb0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
14ec0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
14ed0 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
14ee0 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68  ne to fail if th
14ef0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
14f00 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e  t.** is NO_LOCK.
14f10 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
14f20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52  argument is SHAR
14f30 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69  ED_LOCK then thi
14f40 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67  s routine.** mig
14f50 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
14f60 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69  _IOERR;.*/.stati
14f70 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28  c int winUnlock(
14f80 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14f90 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
14fa0 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77  .  int type;.  w
14fb0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
14fc0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
14fd0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14fe0 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46  OK;.  assert( pF
14ff0 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ile!=0 );.  asse
15000 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
15010 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f  ARED_LOCK );.  O
15020 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
15030 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b  file=%p, oldLock
15040 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b  =%d(%d), newLock
15050 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
15060 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
15070 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
15080 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
15090 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b  yte, locktype));
150a0 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d  .  type = pFile-
150b0 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
150c0 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45   type>=EXCLUSIVE
150d0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
150e0 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
150f0 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
15100 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49  ST, 0, SHARED_SI
15110 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ZE, 0);.    if( 
15120 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
15130 5f 4c 4f 43 4b 20 26 26 20 21 67 65 74 52 65 61  _LOCK && !getRea
15140 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a  dLock(pFile) ){.
15150 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73 68        /* This sh
15160 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70 65  ould never happe
15170 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 61 6c  n.  We should al
15180 77 61 79 73 20 62 65 20 61 62 6c 65 20 74 6f 0a  ways be able to.
15190 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71 75 69        ** reacqui
151a0 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
151b0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 77   */.      rc = w
151c0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
151d0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20  E_IOERR_UNLOCK, 
151e0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
151f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15200 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46   "winUnlock", pF
15210 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
15220 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79 70   }.  }.  if( typ
15230 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
15240 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63   ){.    winUnloc
15250 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
15260 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
15270 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
15280 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
15290 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53  _LOCK && type>=S
152a0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
152b0 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b    unlockReadLock
152c0 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  (pFile);.  }.  i
152d0 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47  f( type>=PENDING
152e0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
152f0 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
15300 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59  e->h, PENDING_BY
15310 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
15320 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
15330 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79  ype = (u8)lockty
15340 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  pe;.  OSTRACE(("
15350 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  UNLOCK file=%p, 
15360 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  lock=%d, rc=%s\n
15370 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
15380 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
15390 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33  ocktype, sqlite3
153a0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
153b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
153c0 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
153d0 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e 65 67   inititially neg
153e0 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20  ative then this 
153f0 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74  is a query.  Set
15400 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f   *pArg to.** 1 o
15410 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 0 depending on
15420 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
15430 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c  bit mask of pFil
15440 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20  e->ctrlFlags is 
15450 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70  set..**.** If *p
15460 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74  Arg is 0 or 1, t
15470 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74  hen clear or set
15480 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66   the mask bit of
15490 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
154a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
154b0 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e  d winModeBit(win
154c0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73  File *pFile, uns
154d0 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c  igned char mask,
154e0 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69   int *pArg){.  i
154f0 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20  f( *pArg<0 ){.  
15500 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65    *pArg = (pFile
15510 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61  ->ctrlFlags & ma
15520 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20  sk)!=0;.  }else 
15530 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29  if( (*pArg)==0 )
15540 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
15550 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  lFlags &= ~mask;
15560 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
15570 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
15580 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = mask;.  }.}../
15590 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
155a0 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
155b0 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28  int getTempname(
155c0 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
155d0 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f  zBuf);../*.** Co
155e0 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20  ntrol and query 
155f0 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
15600 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
15610 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f  ic int winFileCo
15620 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
15630 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
15640 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77  void *pArg){.  w
15650 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
15660 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
15670 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
15680 66 69 6c 65 3d 25 70 2c 20 6f 70 3d 25 64 2c 20  file=%p, op=%d, 
15690 70 41 72 67 3d 25 70 5c 6e 22 2c 20 70 46 69 6c  pArg=%p\n", pFil
156a0 65 2d 3e 68 2c 20 6f 70 2c 20 70 41 72 67 29 29  e->h, op, pArg))
156b0 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
156c0 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
156d0 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
156e0 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
156f0 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
15700 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
15710 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
15720 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
15730 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
15740 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
15750 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15760 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
15770 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20  ITE_LAST_ERRNO: 
15780 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
15790 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65  Arg = (int)pFile
157a0 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
157b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
157c0 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
157d0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
157e0 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
157f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15800 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15810 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
15820 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  NK_SIZE: {.     
15830 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
15840 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
15850 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
15860 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
15870 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
15880 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
15890 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
158a0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
158b0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
158c0 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
158d0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a     if( pFile->sz
158e0 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20  Chunk>0 ){.     
158f0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
15900 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20   oldSz;.        
15910 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65  int rc = winFile
15920 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29  Size(id, &oldSz)
15930 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
15940 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15950 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15960 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a  _int64 newSz = *
15970 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29  (sqlite3_int64*)
15980 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20  pArg;.          
15990 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20  if( newSz>oldSz 
159a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
159b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
159c0 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
159d0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
159e0 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29  ncate(id, newSz)
159f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69  ;.            Si
15a00 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
15a10 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20  ign(0);.        
15a20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
15a30 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
15a40 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
15a50 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
15a60 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  h, sqlite3ErrNam
15a70 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20  e(rc)));.       
15a80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15a90 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43    }.      OSTRAC
15aa0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
15ab0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
15ac0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
15ad0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15ae0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
15af0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
15b00 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a  NTL_PERSIST_WAL:
15b10 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65   {.      winMode
15b20 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49  Bit(pFile, WINFI
15b30 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20  LE_PERSIST_WAL, 
15b40 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20  (int*)pArg);.   
15b50 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
15b60 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
15b70 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
15b80 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
15b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15ba0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15bb0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57  SQLITE_FCNTL_POW
15bc0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
15bd0 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64  : {.      winMod
15be0 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46  eBit(pFile, WINF
15bf0 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29  ILE_PSOW, (int*)
15c00 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54  pArg);.      OST
15c10 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
15c20 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
15c30 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
15c40 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
15c50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
15c60 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
15c70 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20  _FCNTL_VFSNAME: 
15c80 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a  {.      *(char**
15c90 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  )pArg = sqlite3_
15ca0 6d 70 72 69 6e 74 66 28 22 77 69 6e 33 32 22 29  mprintf("win32")
15cb0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
15cc0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
15cd0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
15ce0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
15cf0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15d00 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
15d10 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
15d20 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
15d30 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  : {.      int *a
15d40 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20   = (int*)pArg;. 
15d50 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20       if( a[0]>0 
15d60 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33 32  ){.        win32
15d70 49 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30  IoerrRetry = a[0
15d80 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
15d90 20 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77          a[0] = w
15da0 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79 3b 0a  in32IoerrRetry;.
15db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15dc0 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20  ( a[1]>0 ){.    
15dd0 20 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65      win32IoerrRe
15de0 74 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b  tryDelay = a[1];
15df0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15e00 20 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e        a[1] = win
15e10 33 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  32IoerrRetryDela
15e20 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
15e30 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
15e40 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
15e50 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
15e60 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
15e70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
15e80 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
15e90 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46  LITE_FCNTL_TEMPF
15ea0 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20  ILENAME: {.     
15eb0 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20   char *zTFile = 
15ec0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
15ed0 6f 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  o( pFile->pVfs->
15ee0 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20  mxPathname );.  
15ef0 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29      if( zTFile )
15f00 7b 0a 20 20 20 20 20 20 20 20 67 65 74 54 65 6d  {.        getTem
15f10 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66  pname(pFile->pVf
15f20 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a  s->mxPathname, z
15f30 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  TFile);.        
15f40 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
15f50 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  zTFile;.      }.
15f60 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
15f70 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
15f80 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
15f90 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
15fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15fb0 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51  OK;.    }.#if SQ
15fc0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
15fd0 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51  ZE>0.    case SQ
15fe0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
15ff0 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36  SIZE: {.      i6
16000 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69  4 newLimit = *(i
16010 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
16020 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c  if( newLimit>sql
16030 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
16040 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20  .mxMmap ){.     
16050 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71     newLimit = sq
16060 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16070 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20  g.mxMmap;.      
16080 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70  }.      *(i64*)p
16090 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  Arg = pFile->mma
160a0 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20  pSizeMax;.      
160b0 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20  if( newLimit>=0 
160c0 29 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  ) pFile->mmapSiz
160d0 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  eMax = newLimit;
160e0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
160f0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
16100 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
16110 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
16120 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16130 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  _OK;.    }.#endi
16140 66 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  f.  }.  OSTRACE(
16150 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
16160 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   rc=SQLITE_NOTFO
16170 55 4e 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  UND\n", pFile->h
16180 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
16190 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a  ITE_NOTFOUND;.}.
161a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
161b0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e  e sector size in
161c0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e   bytes of the un
161d0 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64  derlying block d
161e0 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65  evice for.** the
161f0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e   specified file.
16200 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20   This is almost 
16210 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
16220 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20  , but may be.** 
16230 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20  larger for some 
16240 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  devices..**.** S
16250 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d  QLite code assum
16260 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  es this function
16270 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74   cannot fail. It
16280 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68   also assumes th
16290 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c  at.** if two fil
162a0 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69  es are created i
162b0 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d  n the same file-
162c0 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79  system directory
162d0 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61   (i.e..** a data
162e0 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75  base and its jou
162f0 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20  rnal file) that 
16300 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
16310 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73  will be the.** s
16320 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f  ame for both..*/
16330 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
16340 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
16350 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28  3_file *id){.  (
16360 76 6f 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72  void)id;.  retur
16370 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  n SQLITE_DEFAULT
16380 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a  _SECTOR_SIZE;.}.
16390 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
163a0 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65  vector of device
163b0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
163c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
163d0 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74  winDeviceCharact
163e0 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
163f0 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69  _file *id){.  wi
16400 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46  nFile *p = (winF
16410 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72  ile*)id;.  retur
16420 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55  n SQLITE_IOCAP_U
16430 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f  NDELETABLE_WHEN_
16440 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20  OPEN |.         
16450 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ((p->ctrlFlags &
16460 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53   WINFILE_PSOW)?S
16470 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45  QLITE_IOCAP_POWE
16480 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
16490 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  0);.}..#ifndef S
164a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
164b0 2f 2a 20 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77  /* .** Windows w
164c0 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75  ill only let you
164d0 20 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65   create file vie
164e0 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e  w mappings.** on
164f0 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
16500 20 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75   granularity bou
16510 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69  ndaries..** Duri
16520 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  ng sqlite3_os_in
16530 69 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 74  it() we do a Get
16540 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20  SystemInfo().** 
16550 74 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e 75  to get the granu
16560 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a  larity size..*/.
16570 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53  SYSTEM_INFO winS
16580 79 73 49 6e 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 48  ysInfo;../*.** H
16590 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  elper functions 
165a0 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65  to obtain and re
165b0 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f  linquish the glo
165c0 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a  bal mutex. The.*
165d0 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  * global mutex i
165e0 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63  s used to protec
165f0 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66  t the winLockInf
16600 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  o objects used b
16610 79 20 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c  y .** this file,
16620 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61   all of which ma
16630 79 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d  y be shared by m
16640 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e  ultiple threads.
16650 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  .**.** Function 
16660 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
16670 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73  ) is used to ass
16680 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67  ert() that the g
16690 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20  lobal mutex .** 
166a0 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71  is held when req
166b0 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63  uired. This func
166c0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
166d0 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
166e0 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
166f0 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a  ents. e.g..**.**
16700 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75     winShmEnterMu
16710 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73  tex().**     ass
16720 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78  ert( winShmMutex
16730 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77  Held() );.**   w
16740 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
16750 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
16760 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
16770 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
16780 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
16790 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
167a0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
167b0 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
167c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
167d0 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  ShmLeaveMutex(vo
167e0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
167f0 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
16800 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
16810 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
16820 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66  _MASTER));.}.#if
16830 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
16840 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
16850 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  hmMutexHeld(void
16860 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
16870 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
16880 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
16890 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
168a0 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
168b0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
168c0 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
168d0 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c  epresent a singl
168e0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e  e file opened an
168f0 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f  d mmapped to pro
16900 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d  vide.** shared m
16910 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c  emory.  When mul
16920 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c  tiple threads al
16930 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  l reference the 
16940 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d  same.** log-summ
16950 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64  ary, each thread
16960 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e   has its own win
16970 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74  File object, but
16980 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69   they all.** poi
16990 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69  nt to a single i
169a0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
169b0 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
169c0 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a  r words, each.**
169d0 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20   log-summary is 
169e0 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65  opened only once
169f0 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a   per process..**
16a00 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  .** winShmMutexH
16a10 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
16a20 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
16a30 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
16a40 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
16a50 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
16a60 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
16a70 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
16a80 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
16a90 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a  **      pNext .*
16aa0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
16ab0 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
16ac0 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
16ad0 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
16ae0 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
16af0 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
16b00 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
16b10 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d  her winShmNode.m
16b20 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
16b30 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  d or winShmNode.
16b40 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77  nRef==0 and.** w
16b50 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
16b60 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
16b70 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
16b80 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
16b90 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
16ba0 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72  cture..**.*/.str
16bb0 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b  uct winShmNode {
16bc0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16bd0 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a   *mutex;      /*
16be0 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73   Mutex to access
16bf0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
16c00 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
16c10 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
16c20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
16c30 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46   */.  winFile hF
16c40 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
16c50 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20   /* File handle 
16c60 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a  from winOpen */.
16c70 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b  .  int szRegion;
16c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16c90 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d   Size of shared-
16ca0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
16cb0 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b  /.  int nRegion;
16cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16cd0 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20  * Size of array 
16ce0 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74  apRegion */.  st
16cf0 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b  ruct ShmRegion {
16d00 0a 20 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70  .    HANDLE hMap
16d10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16d20 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f   File handle fro
16d30 6d 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  m CreateFileMapp
16d40 69 6e 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20  ing */.    void 
16d50 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67  *pMap;.  } *aReg
16d60 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  ion;.  DWORD las
16d70 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
16d80 20 20 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73    /* The Windows
16d90 20 65 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20   errno from the 
16da0 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a  last I/O error *
16db0 2f 0a 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  /..  int nRef;  
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16dd0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e  /* Number of win
16de0 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
16df0 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
16e00 20 20 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74    winShm *pFirst
16e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16e20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63  All winShm objec
16e30 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
16e40 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  his */.  winShmN
16e50 6f 64 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ode *pNext;     
16e60 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c      /* Next in l
16e70 69 73 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68  ist of all winSh
16e80 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f  mNode objects */
16e90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
16ea0 45 42 55 47 0a 20 20 75 38 20 6e 65 78 74 53 68  EBUG.  u8 nextSh
16eb0 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
16ec0 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61    /* Next availa
16ed0 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61  ble winShm.id va
16ee0 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
16ef0 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  ../*.** A global
16f00 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69   array of all wi
16f10 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73  nShmNode objects
16f20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53  ..**.** The winS
16f30 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
16f40 73 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65  st be true while
16f50 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
16f60 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a  ing this list..*
16f70 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e  /.static winShmN
16f80 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c  ode *winShmNodeL
16f90 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
16fa0 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69  Structure used i
16fb0 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69  nternally by thi
16fc0 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20  s VFS to record 
16fd0 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a  the state of an.
16fe0 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d  ** open shared m
16ff0 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  emory connection
17000 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
17010 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
17020 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
17030 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73  n this object is
17040 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
17050 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68  are read-only th
17060 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20  ereafter:.**.** 
17070 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f     winShm.pShmNo
17080 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e  de.**    winShm.
17090 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68  id.**.** All oth
170a0 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  er fields are re
170b0 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77  ad/write.  The w
170c0 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e  inShm.pShmNode->
170d0 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
170e0 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65  ld.** while acce
170f0 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77  ssing any read/w
17100 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a  rite fields..*/.
17110 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a  struct winShm {.
17120 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
17130 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20  hmNode;      /* 
17140 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77  The underlying w
17150 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
17160 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e   */.  winShm *pN
17170 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
17180 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20   /* Next winShm 
17190 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69  with the same wi
171a0 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  nShmNode */.  u8
171b0 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
171c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
171d0 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
171e0 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  winShmNode mutex
171f0 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
17200 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
17210 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
17220 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
17230 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
17240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17250 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
17260 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
17270 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
17280 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20 20  EBUG.  u8 id;   
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172a0 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
172b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20  connection with 
172c0 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  its winShmNode *
172d0 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
172e0 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65  ** Constants use
172f0 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f  d for locking.*/
17300 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d  .#define WIN_SHM
17310 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c  _BASE   ((22+SQL
17320 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34  ITE_SHM_NLOCK)*4
17330 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73  )        /* firs
17340 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23  t lock byte */.#
17350 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 44  define WIN_SHM_D
17360 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d 5f 42  MS    (WIN_SHM_B
17370 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  ASE+SQLITE_SHM_N
17380 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61  LOCK)  /* deadma
17390 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a  n switch */../*.
173a0 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73 6f 72  ** Apply advisor
173b0 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20  y locks for all 
173c0 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e  n bytes beginnin
173d0 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64  g at ofst..*/.#d
173e0 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c 43 4b  efine _SHM_UNLCK
173f0 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d    1.#define _SHM
17400 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e  _RDLCK  2.#defin
17410 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a  e _SHM_WRLCK  3.
17420 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
17430 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77  mSystemLock(.  w
17440 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65  inShmNode *pFile
17450 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f  ,    /* Apply lo
17460 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e  cks to this open
17470 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
17480 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
17490 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20  lockType,       
174a0 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c    /* _SHM_UNLCK,
174b0 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20   _SHM_RDLCK, or 
174c0 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  _SHM_WRLCK */.  
174d0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
174e0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
174f0 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
17500 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63   be locked/unloc
17510 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79  ked */.  int nBy
17520 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  te             /
17530 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
17540 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c  s to lock or unl
17550 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ock */.){.  int 
17560 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
17570 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
17580 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63   form Lock/Unloc
17590 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20  kFileEx() */..  
175a0 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
175b0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
175c0 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64  ct is serialized
175d0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   by the caller *
175e0 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
175f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
17600 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20  File->mutex) || 
17610 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  pFile->nRef==0 )
17620 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  ;..  OSTRACE(("S
17630 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  HM-LOCK file=%p,
17640 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74   lock=%d, offset
17650 3d 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c  =%d, size=%d\n",
17660 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
17670 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b  e->hFile.h, lock
17680 54 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74  Type, ofst, nByt
17690 65 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  e));..  /* Relea
176a0 73 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73  se/Acquire the s
176b0 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b  ystem-level lock
176c0 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79   */.  if( lockTy
176d0 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b 20 29  pe==_SHM_UNLCK )
176e0 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55 6e  {.    rc = winUn
176f0 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
17700 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c 20  >hFile.h, ofst, 
17710 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20  0, nByte, 0);.  
17720 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
17730 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
17740 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
17750 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77 46  */.    DWORD dwF
17760 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45 5f  lags = LOCKFILE_
17770 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
17780 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  ;.    if( lockTy
17790 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c 43 4b  pe == _SHM_WRLCK
177a0 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20 4c 4f   ) dwFlags |= LO
177b0 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
177c0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  _LOCK;.    rc = 
177d0 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
177e0 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64 77 46  le->hFile.h, dwF
177f0 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c 20 6e  lags, ofst, 0, n
17800 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Byte, 0);.  }.  
17810 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b  .  if( rc!= 0 ){
17820 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
17830 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
17840 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
17850 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45  no =  osGetLastE
17860 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d  rror();.    rc =
17870 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
17880 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  }..  OSTRACE(("S
17890 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  HM-LOCK file=%p,
178a0 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d   func=%s, errno=
178b0 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  %lu, rc=%s\n",. 
178c0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
178d0 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54  >hFile.h, (lockT
178e0 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43  ype == _SHM_UNLC
178f0 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46  K) ? "winUnlockF
17900 69 6c 65 22 20 3a 0a 20 20 20 20 20 20 20 20 20  ile" :.         
17910 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c    "winLockFile",
17920 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
17930 6f 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  o, sqlite3ErrNam
17940 65 28 72 63 29 29 29 3b 0a 0a 20 20 72 65 74 75  e(rc)));..  retu
17950 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
17960 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
17970 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a  to VFS methods *
17980 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
17990 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
179a0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71  *,const char*,sq
179b0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
179c0 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  int*);.static in
179d0 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69  t winDelete(sqli
179e0 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20  te3_vfs *,const 
179f0 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a  char*,int);../*.
17a00 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77 69 6e  ** Purge the win
17a10 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
17a20 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
17a30 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  with winShmNode.
17a40 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54  nRef==0..**.** T
17a50 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53  his is not a VFS
17a60 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
17a70 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75  ethod; it is a u
17a80 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20  tility function 
17a90 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53  called.** by VFS
17aa0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
17ab0 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
17ac0 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72  c void winShmPur
17ad0 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ge(sqlite3_vfs *
17ae0 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65  pVfs, int delete
17af0 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e  Flag){.  winShmN
17b00 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53  ode **pp;.  winS
17b10 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42 4f 4f  hmNode *p;.  BOO
17b20 4c 20 62 52 63 3b 0a 20 20 61 73 73 65 72 74 28  L bRc;.  assert(
17b30 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
17b40 28 29 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  () );.  OSTRACE(
17b50 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 3d  ("SHM-PURGE pid=
17b60 25 6c 75 2c 20 64 65 6c 65 74 65 46 6c 61 67 3d  %lu, deleteFlag=
17b70 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
17b80 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
17b90 6f 63 65 73 73 49 64 28 29 2c 20 64 65 6c 65 74  ocessId(), delet
17ba0 65 46 6c 61 67 29 29 3b 0a 20 20 70 70 20 3d 20  eFlag));.  pp = 
17bb0 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b  &winShmNodeList;
17bc0 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a  .  while( (p = *
17bd0 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pp)!=0 ){.    if
17be0 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ( p->nRef==0 ){.
17bf0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
17c00 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20     if( p->mutex 
17c10 29 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ) sqlite3_mutex_
17c20 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a  free(p->mutex);.
17c30 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
17c40 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b  <p->nRegion; i++
17c50 29 7b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d  ){.        bRc =
17c60 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   osUnmapViewOfFi
17c70 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d  le(p->aRegion[i]
17c80 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  .pMap);.        
17c90 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55  OSTRACE(("SHM-PU
17ca0 52 47 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c  RGE-UNMAP pid=%l
17cb0 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63  u, region=%d, rc
17cc0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
17cd0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
17ce0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
17cf0 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20  , i, bRc ? "ok" 
17d00 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
17d10 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c        bRc = osCl
17d20 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65  oseHandle(p->aRe
17d30 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20  gion[i].hMap);. 
17d40 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
17d50 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45  "SHM-PURGE-CLOSE
17d60 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
17d70 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
17d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d90 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
17da0 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20  essId(), i, bRc 
17db0 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
17dc0 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
17dd0 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e     if( p->hFile.
17de0 68 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46  h!=NULL && p->hF
17df0 69 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48  ile.h!=INVALID_H
17e00 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
17e10 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
17e20 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
17e30 0a 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73  .        winClos
17e40 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
17e50 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20  *)&p->hFile);.  
17e60 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
17e70 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
17e80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
17e90 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a  ( deleteFlag ){.
17ea0 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
17eb0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
17ec0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17ed0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
17ee0 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69  oc();.        wi
17ef0 6e 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d  nDelete(pVfs, p-
17f00 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a  >zFilename, 0);.
17f10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
17f20 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
17f30 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  ;.        Simula
17f40 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
17f50 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
17f60 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
17f70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
17f80 66 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29  free(p->aRegion)
17f90 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
17fa0 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c  free(p);.    }el
17fb0 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26  se{.      pp = &
17fc0 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  p->pNext;.    }.
17fd0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
17fe0 6e 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  n the shared-mem
17ff0 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61  ory area associa
18000 74 65 64 20 77 69 74 68 20 64 61 74 61 62 61 73  ted with databas
18010 65 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a  e file pDbFd..**
18020 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67  .** When opening
18030 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65   a new shared-me
18040 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f  mory file, if no
18050 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73   other instances
18060 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65   of that.** file
18070 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   are currently o
18080 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f  pen, in this pro
18090 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72  cess or in other
180a0 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e   processes, then
180b0 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73  .** the file mus
180c0 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  t be truncated t
180d0 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72  o zero length or
180e0 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72   have its header
180f0 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
18100 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53  tic int winOpenS
18110 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46  haredMemory(winF
18120 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
18130 74 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b  truct winShm *p;
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18150 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
18160 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ion to be opened
18170 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e   */.  struct win
18180 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
18190 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  e = 0;   /* The 
181a0 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70  underlying mmapp
181b0 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
181c0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181e0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
181f0 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  /.  struct winSh
18200 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20  mNode *pNew;    
18210 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
18220 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d  allocated winShm
18230 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  Node */.  int nN
18240 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
18250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18260 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e  Size of zName in
18270 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73   bytes */..  ass
18280 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d  ert( pDbFd->pShm
18290 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74  ==0 );    /* Not
182a0 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
182b0 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ed */..  /* Allo
182c0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
182d0 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73  he new sqlite3_s
182e0 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f  hm object.  Also
182f0 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20   speculatively. 
18300 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   ** allocate spa
18310 63 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e  ce for a new win
18320 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65  ShmNode and file
18330 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  name..  */.  p =
18340 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
18350 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  ro( sizeof(*p) )
18360 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
18370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
18380 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d  RR_NOMEM;.  nNam
18390 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
183a0 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  n30(pDbFd->zPath
183b0 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
183c0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
183d0 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
183e0 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b   + nName + 17 );
183f0 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
18400 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
18410 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ee(p);.    retur
18420 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
18430 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  OMEM;.  }.  pNew
18440 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
18450 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
18460 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
18470 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77  f(nName+15, pNew
18480 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73  ->zFilename, "%s
18490 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50  -shm", pDbFd->zP
184a0 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  ath);.  sqlite3F
184b0 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
184c0 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a  ->zPath, pNew->z
184d0 46 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f  Filename); ..  /
184e0 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66  * Look to see if
184f0 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 69   there is an exi
18500 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  sting winShmNode
18510 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
18520 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61  d..  ** If no ma
18530 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  tching winShmNod
18540 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
18550 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ts, create a new
18560 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e   one..  */.  win
18570 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
18580 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20  .  for(pShmNode 
18590 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
185a0 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d  ; pShmNode; pShm
185b0 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  Node=pShmNode->p
185c0 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42  Next){.    /* TB
185d0 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75  D need to come u
185e0 70 20 77 69 74 68 20 62 65 74 74 65 72 20 6d 61  p with better ma
185f0 74 63 68 20 68 65 72 65 2e 20 20 50 65 72 68 61  tch here.  Perha
18600 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49  ps.    ** use FI
18610 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49  LE_ID_BOTH_DIR_I
18620 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20  NFO Structure.. 
18630 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
18640 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 53 68  lite3StrICmp(pSh
18650 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
18660 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
18670 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
18680 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
18690 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
186a0 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d  _free(pNew);.  }
186b0 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f  else{.    pShmNo
186c0 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70  de = pNew;.    p
186d0 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77  New = 0;.    ((w
186e0 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f  inFile*)(&pShmNo
186f0 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d  de->hFile))->h =
18700 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
18710 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e  VALUE;.    pShmN
18720 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e  ode->pNext = win
18730 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  ShmNodeList;.   
18740 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20   winShmNodeList 
18750 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20  = pShmNode;..   
18760 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
18770 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
18780 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
18790 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69  TEX_FAST);.    i
187a0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  f( pShmNode->mut
187b0 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ex==0 ){.      r
187c0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
187d0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
187e0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
187f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
18800 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e   winOpen(pDbFd->
18810 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20  pVfs,.          
18820 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
18830 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  >zFilename,     
18840 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
18850 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46  of the file (UTF
18860 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  -8) */.         
18870 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
18880 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65  _file*)&pShmNode
18890 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c  ->hFile,  /* Fil
188a0 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  e handle here */
188b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
188c0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41    SQLITE_OPEN_WA
188d0 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L | SQLITE_OPEN_
188e0 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49  READWRITE | SQLI
188f0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a  TE_OPEN_CREATE,.
18900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18910 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c   0);.    if( SQL
18920 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
18930 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
18940 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
18950 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
18960 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f  e if another pro
18970 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
18980 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69  the dead-man swi
18990 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e  tch..    ** If n
189a0 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
189b0 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
189c0 6e 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ngth. .    */.  
189d0 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74    if( winShmSyst
189e0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
189f0 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e   _SHM_WRLCK, WIN
18a00 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51  _SHM_DMS, 1)==SQ
18a10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18a20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74   rc = winTruncat
18a30 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
18a40 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
18a50 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  le, 0);.      if
18a60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18a70 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
18a80 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
18a90 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
18aa0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
18ab0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
18ac0 20 20 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d       "winOpenShm
18ad0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
18ae0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18af0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18b00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77  TE_OK ){.      w
18b10 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
18b20 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
18b30 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  NLCK, WIN_SHM_DM
18b40 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20  S, 1);.      rc 
18b50 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
18b60 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
18b70 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_RDLCK, WIN_SHM
18b80 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  _DMS, 1);.    }.
18b90 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
18ba0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
18bb0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74    }..  /* Make t
18bc0 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
18bd0 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65  n a child of the
18be0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20   winShmNode */. 
18bf0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70   p->pShmNode = p
18c00 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20  ShmNode;.#ifdef 
18c10 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70  SQLITE_DEBUG.  p
18c20 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  ->id = pShmNode-
18c30 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65  >nextShmId++;.#e
18c40 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  ndif.  pShmNode-
18c50 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64  >nRef++;.  pDbFd
18c60 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69  ->pShm = p;.  wi
18c70 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
18c80 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65  ;..  /* The refe
18c90 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70  rence count on p
18ca0 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65  ShmNode has alre
18cb0 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65  ady been increme
18cc0 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20  nted under.  ** 
18cd0 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65  the cover of the
18ce0 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
18cf0 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
18d00 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
18d10 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
18d20 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65  uct winShm) obje
18d30 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f  ct to the pShmNo
18d40 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  de has been set.
18d50 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a   All that is.  *
18d60 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20  * left to do is 
18d70 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20  to link the new 
18d80 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20  object into the 
18d90 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
18da0 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68  ting.  ** at pSh
18db0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54  mNode->pFirst. T
18dc0 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
18dd0 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
18de0 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  he pShmNode->mut
18df0 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a  ex .  ** mutex..
18e00 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
18e10 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
18e20 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  ode->mutex);.  p
18e30 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f  ->pNext = pShmNo
18e40 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53  de->pFirst;.  pS
18e50 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d  hmNode->pFirst =
18e60 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   p;.  sqlite3_mu
18e70 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
18e80 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
18e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18ea0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
18eb0 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
18ec0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
18ed0 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
18ee0 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
18ef0 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  UNLCK, WIN_SHM_D
18f00 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d  MS, 1);.  winShm
18f10 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
18f20 73 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54  s, 0);      /* T
18f30 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
18f40 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
18f50 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
18f60 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69  _free(p);.  sqli
18f70 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
18f80 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
18f90 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex();.  return r
18fa0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
18fb0 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  e a connection t
18fc0 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e  o shared-memory.
18fd0 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64    Delete the und
18fe0 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72  erlying .** stor
18ff0 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61  age if deleteFla
19000 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  g is true..*/.st
19010 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55  atic int winShmU
19020 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  nmap(.  sqlite3_
19030 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
19040 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
19050 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
19060 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65  mory */.  int de
19070 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20  leteFlag        
19080 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61       /* Delete a
19090 66 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20  fter closing if 
190a0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  true */.){.  win
190b0 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20  File *pDbFd;    
190c0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
190d0 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  olding shared-me
190e0 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mory */.  winShm
190f0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
19100 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
19110 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
19120 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
19130 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65  pShmNode; /* The
19140 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72   underlying shar
19150 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  ed-memory file *
19160 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b  /.  winShm **pp;
19170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
19180 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69   looping over si
19190 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
191a0 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20  s */..  pDbFd = 
191b0 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20  (winFile*)fd;.  
191c0 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
191d0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
191e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
191f0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
19200 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  pShmNode;..  /* 
19210 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f  Remove connectio
19220 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74  n p from the set
19230 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   of connections 
19240 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20  associated.  ** 
19250 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f  with pShmNode */
19260 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
19270 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
19280 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70  >mutex);.  for(p
19290 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  p=&pShmNode->pFi
192a0 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70  rst; (*pp)!=p; p
192b0 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78  p = &(*pp)->pNex
192c0 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e  t){}.  *pp = p->
192d0 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65  pNext;..  /* Fre
192e0 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
192f0 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f   p */.  sqlite3_
19300 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64  free(p);.  pDbFd
19310 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71  ->pShm = 0;.  sq
19320 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
19330 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
19340 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68  x);..  /* If pSh
19350 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20  mNode->nRef has 
19360 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20  reached 0, then 
19370 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c  close the underl
19380 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64  ying.  ** shared
19390 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f  -memory file, to
193a0 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  o */.  winShmEnt
193b0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
193c0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ert( pShmNode->n
193d0 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e  Ref>0 );.  pShmN
193e0 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ode->nRef--;.  i
193f0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
19400 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53  f==0 ){.    winS
19410 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70  hmPurge(pDbFd->p
19420 56 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29  Vfs, deleteFlag)
19430 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65  ;.  }.  winShmLe
19440 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72  aveMutex();..  r
19450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19460 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
19470 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
19480 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  for a shared-mem
19490 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a  ory segment..*/.
194a0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
194b0 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
194c0 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
194d0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
194e0 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
194f0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
19500 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19520 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
19530 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
19540 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
19550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19560 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
19570 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
19580 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
19590 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
195a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
195b0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
195c0 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
195d0 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  winFile *pDbFd =
195e0 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
195f0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
19600 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ion holding shar
19610 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77  ed memory */.  w
19620 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  inShm *p = pDbFd
19630 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20  ->pShm;         
19640 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
19650 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20  ed memory being 
19660 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53  locked */.  winS
19670 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  hm *pX;         
19680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19690 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
196a0 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e   over all siblin
196b0 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f  gs */.  winShmNo
196c0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
196d0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e  ->pShmNode;.  in
196e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
196f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19700 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
19710 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b  de */.  u16 mask
19720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19740 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74   Mask of locks t
19750 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73  o take or releas
19760 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  e */..  assert( 
19770 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b  ofst>=0 && ofst+
19780 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  n<=SQLITE_SHM_NL
19790 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
197a0 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72   n>=1 );.  asser
197b0 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  t( flags==(SQLIT
197c0 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
197d0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
197e0 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
197f0 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
19800 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
19810 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20  XCLUSIVE).      
19820 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
19830 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
19840 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
19850 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  D).       || fla
19860 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
19870 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
19880 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29  SHM_EXCLUSIVE) )
19890 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  ;.  assert( n==1
198a0 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c   || (flags & SQL
198b0 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
198c0 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b  E)!=0 );..  mask
198d0 20 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f   = (u16)((1U<<(o
198e0 66 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f  fst+n)) - (1U<<o
198f0 66 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28  fst));.  assert(
19900 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
19910 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c  <<ofst) );.  sql
19920 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
19930 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
19940 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  );.  if( flags &
19950 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
19960 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  CK ){.    u16 al
19970 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61  lMask = 0; /* Ma
19980 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  sk of locks held
19990 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a   by siblings */.
199a0 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61  .    /* See if a
199b0 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64  ny siblings hold
199c0 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20   this same lock 
199d0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
199e0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
199f0 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
19a00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ){.      if( pX=
19a10 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =p ) continue;. 
19a20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
19a30 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d  ->exclMask & (p-
19a40 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61  >exclMask|p->sha
19a50 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a  redMask))==0 );.
19a60 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d        allMask |=
19a70 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
19a80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
19a90 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d  nlock the system
19aa0 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a  -level locks */.
19ab0 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
19ac0 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  allMask)==0 ){. 
19ad0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
19ae0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
19af0 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c  ode, _SHM_UNLCK,
19b00 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
19b10 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  SE, n);.    }els
19b20 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
19b30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
19b40 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20      /* Undo the 
19b50 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
19b60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19b70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
19b80 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
19b90 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  sk;.      p->sha
19ba0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
19bb0 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65  ;.    } .  }else
19bc0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
19bd0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29  ITE_SHM_SHARED )
19be0 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61  {.    u16 allSha
19bf0 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69  red = 0;  /* Uni
19c00 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  on of locks held
19c10 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
19c20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a  other than "p" *
19c30 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f  /..    /* Find o
19c40 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
19c50 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
19c60 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
19c70 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
19c80 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62     ** If any sib
19c90 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c  ling already hol
19ca0 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
19cb0 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61  lock, go ahead a
19cc0 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
19cd0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
19ce0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
19cf0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
19d00 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
19d10 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
19d20 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
19d30 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
19d40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
19d50 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
19d60 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
19d70 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70    allShared |= p
19d80 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
19d90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
19da0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74   shared locks at
19db0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
19dc0 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  l, if necessary 
19dd0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
19de0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19df0 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64    if( (allShared
19e00 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
19e10 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53         rc = winS
19e20 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
19e30 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43  mNode, _SHM_RDLC
19e40 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f  K, ofst+WIN_SHM_
19e50 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
19e60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
19e70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19e80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
19e90 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63    /* Get the loc
19ea0 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  al shared locks 
19eb0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
19ec0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19ed0 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
19ee0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  |= mask;.    }. 
19ef0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
19f00 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c  ake sure no sibl
19f10 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
19f20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20  hold locks that 
19f30 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a  will block this.
19f40 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66      ** lock.  If
19f50 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20   any do, return 
19f60 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68  SQLITE_BUSY righ
19f70 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20  t away..    */. 
19f80 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
19f90 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
19fa0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
19fb0 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
19fc0 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
19fd0 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64  0 || (pX->shared
19fe0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
19ff0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1a000 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
1a010 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a020 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
1a030 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c   /* Get the excl
1a040 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74  usive locks at t
1a050 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e  he system level.
1a060 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73    Then if succes
1a070 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f  sful.    ** also
1a080 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20   mark the local 
1a090 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65  connection as be
1a0a0 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20  ing locked..    
1a0b0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1a0c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a0d0 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
1a0e0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1a0f0 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66  , _SHM_WRLCK, of
1a100 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
1a110 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
1a120 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a130 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1a140 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
1a150 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
1a160 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
1a170 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
1a180 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
1a190 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1a1a0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
1a1b0 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
1a1c0 53 48 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75  SHM-LOCK pid=%lu
1a1d0 2c 20 69 64 3d 25 64 2c 20 73 68 61 72 65 64 4d  , id=%d, sharedM
1a1e0 61 73 6b 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61  ask=%03x, exclMa
1a1f0 73 6b 3d 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e  sk=%03x, rc=%s\n
1a200 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1a210 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1a220 73 49 64 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d  sId(), p->id, p-
1a230 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
1a240 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20  exclMask,.      
1a250 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 4e       sqlite3ErrN
1a260 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
1a270 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a280 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d   Implement a mem
1a290 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d  ory barrier or m
1a2a0 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73  emory fence on s
1a2b0 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a  hared memory.  .
1a2c0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20  **.** All loads 
1a2d0 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e  and stores begun
1a2e0 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72   before the barr
1a2f0 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  ier must complet
1a300 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20  e before.** any 
1a310 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65  load or store be
1a320 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61  gun after the ba
1a330 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrier..*/.static
1a340 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72   void winShmBarr
1a350 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ier(.  sqlite3_f
1a360 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20  ile *fd         
1a370 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
1a380 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
1a390 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55  memory */.){.  U
1a3a0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1a3b0 66 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79  fd);.  /* Memory
1a3c0 42 61 72 72 69 65 72 28 29 3b 20 2f 2f 20 64 6f  Barrier(); // do
1a3d0 65 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d 20 64  es not work -- d
1a3e0 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79 20 6e  o not know why n
1a3f0 6f 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  ot */.  winShmEn
1a400 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 77 69  terMutex();.  wi
1a410 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
1a420 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1a430 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1a440 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70  ed to obtain a p
1a450 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e  ointer to region
1a460 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20   iRegion of the 
1a470 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  .** shared-memor
1a480 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
1a490 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
1a4a0 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d  ile fd. Shared-m
1a4b0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a  emory regions .*
1a4c0 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73  * are numbered s
1a4d0 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72  tarting from zer
1a4e0 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d  o. Each shared-m
1a4f0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20  emory region is 
1a500 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74  szRegion .** byt
1a510 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
1a520 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1a530 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
1a540 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
1a550 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20 74  and *pp is set t
1a560 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74  o NULL..**.** Ot
1a570 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
1a580 69 73 57 72 69 74 65 20 70 61 72 61 6d 65 74 65  isWrite paramete
1a590 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20 72  r is 0 and the r
1a5a0 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
1a5b0 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e  memory.** region
1a5c0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
1a5d0 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79 20  located (by any 
1a5e0 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e  client, includin
1a5f0 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e  g one running in
1a600 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70   a.** separate p
1a610 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70  rocess), then *p
1a620 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  p is set to NULL
1a630 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
1a640 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20  eturned. If .** 
1a650 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
1a660 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75  ero and the requ
1a670 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
1a680 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  ory region has n
1a690 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20  ot yet .** been 
1a6a0 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73  allocated, it is
1a6b0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
1a6c0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
1a6d0 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
1a6e0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
1a6f0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1a700 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20  allocated or is 
1a710 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
1a720 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73  this call as des
1a730 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68  cribed above, th
1a740 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20  en it is mapped 
1a750 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
1a760 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20  ses .** address 
1a770 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20  space (if it is 
1a780 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70  not already), *p
1a790 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  p is set to poin
1a7a0 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20  t to the mapped 
1a7b0 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  .** memory and S
1a7c0 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
1a7d0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1a7e0 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71   winShmMap(.  sq
1a7f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
1a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a810 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   Handle open on 
1a820 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1a830 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20  .  int iRegion, 
1a840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a850 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20     /* Region to 
1a860 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e  retrieve */.  in
1a870 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20  t szRegion,     
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a890 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73   Size of regions
1a8a0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74   */.  int isWrit
1a8b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1a8c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
1a8d0 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20   extend file if 
1a8e0 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76  necessary */.  v
1a8f0 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70  oid volatile **p
1a900 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
1a910 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65  * OUT: Mapped me
1a920 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  mory */.){.  win
1a930 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77  File *pDbFd = (w
1a940 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69  inFile*)fd;.  wi
1a950 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  nShm *p = pDbFd-
1a960 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e  >pShm;.  winShmN
1a970 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
1a980 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a990 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 20 29  _OK;..  if( !p )
1a9a0 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70  {.    rc = winOp
1a9b0 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  enSharedMemory(p
1a9c0 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72  DbFd);.    if( r
1a9d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1a9e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 20  eturn rc;.    p 
1a9f0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
1aa00 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20   }.  pShmNode = 
1aa10 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20  p->pShmNode;..  
1aa20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1aa30 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1aa40 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
1aa50 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f  szRegion==pShmNo
1aa60 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20  de->szRegion || 
1aa70 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
1aa80 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  n==0 );..  if( p
1aa90 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1aaa0 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  <=iRegion ){.   
1aab0 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f   struct ShmRegio
1aac0 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20  n *apNew;       
1aad0 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69      /* New aRegi
1aae0 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  on[] array */.  
1aaf0 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69    int nByte = (i
1ab00 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69  Region+1)*szRegi
1ab10 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  on;  /* Minimum 
1ab20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  required file si
1ab30 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ze */.    sqlite
1ab40 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20  3_int64 sz;     
1ab50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ab60 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  Current size of 
1ab70 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a  wal-index file *
1ab80 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  /..    pShmNode-
1ab90 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65  >szRegion = szRe
1aba0 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  gion;..    /* Th
1abb0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
1abc0 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64  on is not mapped
1abd0 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
1abe0 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
1abf0 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b  ce..    ** Check
1ac00 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61   to see if it ha
1ac10 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
1ac20 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61   (i.e. if the wa
1ac30 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a  l-index file is.
1ac40 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f      ** large eno
1ac50 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ugh to contain t
1ac60 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
1ac70 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ion)..    */.   
1ac80 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
1ac90 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
1aca0 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  *)&pShmNode->hFi
1acb0 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66  le, &sz);.    if
1acc0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1acd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  ){.      rc = wi
1ace0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1acf0 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
1ad00 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1ad10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1ad20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70   "winShmMap1", p
1ad30 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1ad40 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1ad50 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
1ad60 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b   if( sz<nByte ){
1ad70 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  .      /* The re
1ad80 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
1ad90 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
1ada0 78 69 73 74 2e 20 49 66 20 69 73 57 72 69 74 65  xist. If isWrite
1adb0 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
1adc0 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65   ** zero, exit e
1add0 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62  arly. *pp will b
1ade0 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  e set to NULL an
1adf0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1ae00 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rned..      **. 
1ae10 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74       ** Alternat
1ae20 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74  ively, if isWrit
1ae30 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75  e is non-zero, u
1ae40 73 65 20 66 74 72 75 6e 63 61 74 65 28 29 20 74  se ftruncate() t
1ae50 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20  o allocate.     
1ae60 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65   ** the requeste
1ae70 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e  d memory region.
1ae80 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1ae90 69 66 28 20 21 69 73 57 72 69 74 65 20 29 20 67  if( !isWrite ) g
1aea0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
1aeb0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54  .      rc = winT
1aec0 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33  runcate((sqlite3
1aed0 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
1aee0 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29  e->hFile, nByte)
1aef0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1af00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1af10 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1af20 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1af30 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65  RR_SHMSIZE, osGe
1af40 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
1af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1af60 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62  winShmMap2", pDb
1af70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
1af80 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
1af90 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
1afa0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20    }..    /* Map 
1afb0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
1afc0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f  mory region into
1afd0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
1afe0 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a  address space. *
1aff0 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73  /.    apNew = (s
1b000 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
1b010 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
1b020 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  c(.        pShmN
1b030 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69  ode->aRegion, (i
1b040 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66  Region+1)*sizeof
1b050 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29  (apNew[0]).    )
1b060 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77  ;.    if( !apNew
1b070 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1b080 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1b090 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
1b0a0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
1b0b0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  .    pShmNode->a
1b0c0 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
1b0d0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d  .    while( pShm
1b0e0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
1b0f0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Region ){.      
1b100 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55  HANDLE hMap = NU
1b110 4c 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66  LL;         /* f
1b120 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64  ile-mapping hand
1b130 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64  le */.      void
1b140 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20   *pMap = 0;     
1b150 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65          /* Mappe
1b160 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
1b170 2a 2f 0a 20 20 20 20 20 0a 23 69 66 20 53 51 4c  */.     .#if SQL
1b180 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
1b190 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
1b1a0 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
1b1b0 6d 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  mApp(pShmNode->h
1b1c0 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20  File.h,.        
1b1d0 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
1b1e0 44 57 52 49 54 45 2c 20 6e 42 79 74 65 2c 20 4e  DWRITE, nByte, N
1b1f0 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c  ULL.      );.#el
1b200 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1b210 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
1b220 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f  ).      hMap = o
1b230 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1b240 6e 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  ngW(pShmNode->hF
1b250 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20 20 20  ile.h, .        
1b260 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
1b270 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65  DWRITE, 0, nByte
1b280 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
1b290 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
1b2a0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1b2b0 4e 53 49 29 0a 20 20 20 20 20 20 68 4d 61 70 20  NSI).      hMap 
1b2c0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1b2d0 70 70 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d  ppingA(pShmNode-
1b2e0 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20  >hFile.h, .     
1b2f0 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f       NULL, PAGE_
1b300 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42  READWRITE, 0, nB
1b310 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
1b320 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1b330 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
1b340 50 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75  P-CREATE pid=%lu
1b350 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a  , region=%d, siz
1b360 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  e=%d, rc=%s\n",.
1b370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
1b380 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1b390 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65  ssId(), pShmNode
1b3a0 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65  ->nRegion, nByte
1b3b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b3c0 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22   hMap ? "ok" : "
1b3d0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
1b3e0 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20   if( hMap ){.   
1b3f0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74       int iOffset
1b400 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65   = pShmNode->nRe
1b410 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20  gion*szRegion;. 
1b420 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73         int iOffs
1b430 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65  etShift = iOffse
1b440 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  t % winSysInfo.d
1b450 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
1b460 6c 61 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49  larity;.#if SQLI
1b470 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
1b480 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70      pMap = osMap
1b490 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
1b4a0 70 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50  p(hMap, FILE_MAP
1b4b0 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41  _WRITE | FILE_MA
1b4c0 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20  P_READ,.        
1b4d0 20 20 20 20 69 4f 66 66 73 65 74 20 2d 20 69 4f      iOffset - iO
1b4e0 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65  ffsetShift, szRe
1b4f0 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68  gion + iOffsetSh
1b500 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23  ift.        );.#
1b510 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 61  else.        pMa
1b520 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  p = osMapViewOfF
1b530 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d  ile(hMap, FILE_M
1b540 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f  AP_WRITE | FILE_
1b550 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20  MAP_READ,.      
1b560 20 20 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74        0, iOffset
1b570 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c   - iOffsetShift,
1b580 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66   szRegion + iOff
1b590 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20  setShift.       
1b5a0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   );.#endif.     
1b5b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d     OSTRACE(("SHM
1b5c0 2d 4d 41 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75  -MAP-MAP pid=%lu
1b5d0 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66  , region=%d, off
1b5e0 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c  set=%d, size=%d,
1b5f0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1b600 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1b610 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1b620 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
1b630 52 65 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c  Region, iOffset,
1b640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b650 20 20 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70    szRegion, pMap
1b660 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
1b670 64 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  d"));.      }.  
1b680 20 20 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b      if( !pMap ){
1b690 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
1b6a0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
1b6b0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1b6c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69  .        rc = wi
1b6d0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1b6e0 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70  _IOERR_SHMMAP, p
1b6f0 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72  ShmNode->lastErr
1b700 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
1b710 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33       "winShmMap3
1b720 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1b730 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d  ;.        if( hM
1b740 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64  ap ) osCloseHand
1b750 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  le(hMap);.      
1b760 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1b770 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
1b780 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1b790 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
1b7a0 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70  Region].pMap = p
1b7b0 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Map;.      pShmN
1b7c0 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68  ode->aRegion[pSh
1b7d0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e  mNode->nRegion].
1b7e0 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20  hMap = hMap;.   
1b7f0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65     pShmNode->nRe
1b800 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  gion++;.    }.  
1b810 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a  }..shmpage_out:.
1b820 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
1b830 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20  nRegion>iRegion 
1b840 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73  ){.    int iOffs
1b850 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52  et = iRegion*szR
1b860 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69  egion;.    int i
1b870 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f  OffsetShift = iO
1b880 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e  ffset % winSysIn
1b890 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
1b8a0 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20  ranularity;.    
1b8b0 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20  char *p = (char 
1b8c0 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67  *)pShmNode->aReg
1b8d0 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61  ion[iRegion].pMa
1b8e0 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f  p;.    *pp = (vo
1b8f0 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53  id *)&p[iOffsetS
1b900 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  hift];.  }else{.
1b910 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
1b920 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1b930 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
1b940 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
1b950 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  n rc;.}..#else.#
1b960 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61   define winShmMa
1b970 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
1b980 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30   winShmLock    0
1b990 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
1b9a0 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69  Barrier 0.# defi
1b9b0 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20  ne winShmUnmap  
1b9c0 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
1b9d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1b9e0 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  _WAL */../*.** C
1b9f0 6c 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61 70  leans up the map
1ba00 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74 68  ped region of th
1ba10 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
1ba20 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66  , if any..*/.#if
1ba30 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1ba40 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
1ba50 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28  nt winUnmapfile(
1ba60 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
1ba70 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1ba80 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  !=0 );.  OSTRACE
1ba90 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69  (("UNMAP-FILE pi
1baa0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1bab0 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52 65   hMap=%p, pMapRe
1bac0 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20  gion=%p, ".     
1bad0 20 20 20 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d        "mmapSize=
1bae0 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41 63  %lld, mmapSizeAc
1baf0 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53  tual=%lld, mmapS
1bb00 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a  izeMax=%lld\n",.
1bb10 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1bb20 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1bb30 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
1bb40 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70  ->hMap, pFile->p
1bb50 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20  MapRegion,.     
1bb60 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61        pFile->mma
1bb70 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d  pSize, pFile->mm
1bb80 61 70 53 69 7a 65 41 63 74 75 61 6c 2c 20 70 46  apSizeActual, pF
1bb90 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
1bba0 29 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  ));.  if( pFile-
1bbb0 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20  >pMapRegion ){. 
1bbc0 20 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70 56     if( !osUnmapV
1bbd0 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
1bbe0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a  >pMapRegion) ){.
1bbf0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
1bc00 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
1bc10 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
1bc20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50   OSTRACE(("UNMAP
1bc30 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
1bc40 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67  File=%p, pMapReg
1bc50 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20  ion=%p, ".      
1bc60 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c           "rc=SQL
1bc70 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e  ITE_IOERR_MMAP\n
1bc80 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50  ", osGetCurrentP
1bc90 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
1bca0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1bcb0 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67    pFile->pMapReg
1bcc0 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ion));.      ret
1bcd0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
1bce0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1bcf0 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
1bd00 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1bd20 69 6e 55 6e 6d 61 70 31 22 2c 20 70 46 69 6c 65  inUnmap1", pFile
1bd30 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
1bd40 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52      pFile->pMapR
1bd50 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70  egion = 0;.    p
1bd60 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
1bd70 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d   0;.    pFile->m
1bd80 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
1bd90 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69  0;.  }.  if( pFi
1bda0 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20 29  le->hMap!=NULL )
1bdb0 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 43 6c 6f  {.    if( !osClo
1bdc0 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
1bdd0 68 4d 61 70 29 20 29 7b 0a 20 20 20 20 20 20 70  hMap) ){.      p
1bde0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
1bdf0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
1be00 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  ();.      OSTRAC
1be10 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70  E(("UNMAP-FILE p
1be20 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1be30 2c 20 68 4d 61 70 3d 25 70 2c 20 72 63 3d 53 51  , hMap=%p, rc=SQ
1be40 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c  LITE_IOERR_MMAP\
1be50 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1be60 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1be70 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
1be80 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 29 29  e, pFile->hMap))
1be90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
1bea0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
1beb0 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46  E_IOERR_MMAP, pF
1bec0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
1bed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bee0 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d           "winUnm
1bef0 61 70 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ap2", pFile->zPa
1bf00 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  th);.    }.    p
1bf10 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c  File->hMap = NUL
1bf20 4c 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  L;.  }.  OSTRACE
1bf30 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69  (("UNMAP-FILE pi
1bf40 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1bf50 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1bf60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1bf70 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1bf80 49 64 28 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20  Id(), pFile));. 
1bf90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1bfa0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f  K;.}../*.** Memo
1bfb0 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20  ry map or remap 
1bfc0 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
1bfd0 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  by file-descript
1bfe0 6f 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66  or pFd (if the f
1bff0 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64  ile.** is alread
1c000 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78  y mapped, the ex
1c010 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69  isting mapping i
1c020 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68  s replaced by th
1c030 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a  e new). Or, if .
1c040 2a 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ** there already
1c050 20 65 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e   exists a mappin
1c060 67 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  g for this file,
1c070 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 73   and there are s
1c080 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e  till .** outstan
1c090 64 69 6e 67 20 78 46 65 74 63 68 28 29 20 72 65  ding xFetch() re
1c0a0 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20  ferences to it, 
1c0b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1c0c0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
1c0d0 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79  If parameter nBy
1c0e0 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  te is non-negati
1c0f0 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ve, then it is t
1c100 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  he requested siz
1c110 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70  e of .** the map
1c120 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20  ping to create. 
1c130 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42  Otherwise, if nB
1c140 79 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  yte is less than
1c150 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
1c160 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73 69  .** requested si
1c170 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ze is the size o
1c180 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
1c190 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73  sk. The actual s
1c1a0 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72  ize of the.** cr
1c1b0 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73  eated mapping is
1c1c0 20 65 69 74 68 65 72 20 74 68 65 20 72 65 71 75   either the requ
1c1d0 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68  ested size or th
1c1e0 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72  e value configur
1c1f0 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c  ed .** using SQL
1c200 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
1c210 49 5a 45 2c 20 77 68 69 63 68 65 76 65 72 20 69  IZE, whichever i
1c220 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a  s smaller..**.**
1c230 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1c240 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72  turned if no err
1c250 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20  or occurs (even 
1c260 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69  if the mapping i
1c270 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74  s not.** recreat
1c280 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ed as a result o
1c290 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  f outstanding re
1c2a0 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20  ferences) or an 
1c2b0 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
1c2c0 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
1c2d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1c2e0 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65  nMapfile(winFile
1c2f0 20 2a 70 46 64 2c 20 73 71 6c 69 74 65 33 5f 69   *pFd, sqlite3_i
1c300 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 73  nt64 nByte){.  s
1c310 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61  qlite3_int64 nMa
1c320 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  p = nByte;.  int
1c330 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1c340 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e  nMap>=0 || pFd->
1c350 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
1c360 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
1c370 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
1c380 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c  ile=%p, size=%ll
1c390 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1c3a0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1c3b0 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 6e  cessId(), pFd, n
1c3c0 42 79 74 65 29 29 3b 0a 0a 20 20 69 66 28 20 70  Byte));..  if( p
1c3d0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20  Fd->nFetchOut>0 
1c3e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1c3f0 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c  OK;..  if( nMap<
1c400 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  0 ){.    rc = wi
1c410 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74  nFileSize((sqlit
1c420 65 33 5f 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e  e3_file*)pFd, &n
1c430 4d 61 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Map);.    if( rc
1c440 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
1c450 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64  E(("MAP-FILE pid
1c460 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
1c470 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
1c480 46 53 54 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20  FSTAT\n",.      
1c490 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1c4a0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1c4b0 2c 20 70 46 64 29 29 3b 0a 20 20 20 20 20 20 72  , pFd));.      r
1c4c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1c4d0 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a  RR_FSTAT;.    }.
1c4e0 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70    }.  if( nMap>p
1c4f0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  Fd->mmapSizeMax 
1c500 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46  ){.    nMap = pF
1c510 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a  d->mmapSizeMax;.
1c520 20 20 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28    }.  nMap &= ~(
1c530 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 77  sqlite3_int64)(w
1c540 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65  inSysInfo.dwPage
1c550 53 69 7a 65 20 2d 20 31 29 3b 0a 20 0a 20 20 69  Size - 1);. .  i
1c560 66 28 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70 46  f( nMap==0 && pF
1c570 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b  d->mmapSize>0 ){
1c580 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c  .    winUnmapfil
1c590 65 28 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69 66  e(pFd);.  }.  if
1c5a0 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61  ( nMap!=pFd->mma
1c5b0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f 69  pSize ){.    voi
1c5c0 64 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20  d *pNew = 0;.   
1c5d0 20 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d   DWORD protect =
1c5e0 20 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a   PAGE_READONLY;.
1c5f0 20 20 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20      DWORD flags 
1c600 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b  = FILE_MAP_READ;
1c610 0a 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69  ..    winUnmapfi
1c620 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 69 66 28  le(pFd);.    if(
1c630 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73   (pFd->ctrlFlags
1c640 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c   & WINFILE_RDONL
1c650 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  Y)==0 ){.      p
1c660 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45  rotect = PAGE_RE
1c670 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20 66  ADWRITE;.      f
1c680 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50  lags |= FILE_MAP
1c690 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23 69  _WRITE;.    }.#i
1c6a0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
1c6b0 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20  T.    pFd->hMap 
1c6c0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1c6d0 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 46 64  ppingFromApp(pFd
1c6e0 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65  ->h, NULL, prote
1c6f0 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b  ct, nMap, NULL);
1c700 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
1c710 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
1c720 57 49 44 45 29 0a 20 20 20 20 70 46 64 2d 3e 68  WIDE).    pFd->h
1c730 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
1c740 6c 65 4d 61 70 70 69 6e 67 57 28 70 46 64 2d 3e  leMappingW(pFd->
1c750 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
1c760 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c780 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e    (DWORD)((nMap>
1c790 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66  >32) & 0xfffffff
1c7a0 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  f),.            
1c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7c0 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70      (DWORD)(nMap
1c7d0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 20   & 0xffffffff), 
1c7e0 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66  NULL);.#elif def
1c7f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1c800 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20  2_HAS_ANSI).    
1c810 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72  pFd->hMap = osCr
1c820 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
1c830 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70  (pFd->h, NULL, p
1c840 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20  rotect,.        
1c850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c860 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
1c870 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66  (nMap>>32) & 0xf
1c880 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20  fffffff),.      
1c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8a0 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44            (DWORD
1c8b0 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66  )(nMap & 0xfffff
1c8c0 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e  fff), NULL);.#en
1c8d0 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 64 2d  dif.    if( pFd-
1c8e0 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20  >hMap==NULL ){. 
1c8f0 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72       pFd->lastEr
1c900 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
1c910 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63  rror();.      rc
1c920 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
1c930 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
1c940 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f  , pFd->lastErrno
1c950 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c960 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70           "winMap
1c970 66 69 6c 65 22 2c 20 70 46 64 2d 3e 7a 50 61 74  file", pFd->zPat
1c980 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67  h);.      /* Log
1c990 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20   the error, but 
1c9a0 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20  continue normal 
1c9b0 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20  operation using 
1c9c0 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a  xRead/xWrite */.
1c9d0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1c9e0 4d 41 50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20  MAP-FILE-CREATE 
1c9f0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1ca00 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
1ca10 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20  RR_MMAP\n",.    
1ca20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1ca30 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1ca40 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 20 20 20  (), pFd));.     
1ca50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ca60 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  K;.    }.    ass
1ca70 65 72 74 28 20 28 6e 4d 61 70 20 25 20 77 69 6e  ert( (nMap % win
1ca80 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69  SysInfo.dwPageSi
1ca90 7a 65 29 3d 3d 30 20 29 3b 0a 23 69 66 20 53 51  ze)==0 );.#if SQ
1caa0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1cab0 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69    pNew = osMapVi
1cac0 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28  ewOfFileFromApp(
1cad0 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73  pFd->hMap, flags
1cae0 2c 20 30 2c 20 6e 4d 61 70 29 3b 0a 23 65 6c 73  , 0, nMap);.#els
1caf0 65 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  e.    assert( si
1cb00 7a 65 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73 69  zeof(SIZE_T)==si
1cb10 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e 74  zeof(sqlite3_int
1cb20 36 34 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66  64) || nMap<=0xf
1cb30 66 66 66 66 66 66 66 20 29 3b 0a 20 20 20 20 70  fffffff );.    p
1cb40 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f  New = osMapViewO
1cb50 66 46 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70 2c  fFile(pFd->hMap,
1cb60 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28 53   flags, 0, 0, (S
1cb70 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6e  IZE_T)nMap);.#en
1cb80 64 69 66 0a 20 20 20 20 69 66 28 20 70 4e 65 77  dif.    if( pNew
1cb90 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ==NULL ){.      
1cba0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
1cbb0 64 2d 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  d->hMap);.      
1cbc0 70 46 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c  pFd->hMap = NULL
1cbd0 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73  ;.      pFd->las
1cbe0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
1cbf0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
1cc00 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1cc10 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
1cc20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  pFd->lastErrno,.
1cc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc40 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 22 2c 20    "winMapfile", 
1cc50 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  pFd->zPath);.   
1cc60 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50     OSTRACE(("MAP
1cc70 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c  -FILE-MAP pid=%l
1cc80 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
1cc90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1cca0 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  P\n",.          
1ccb0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1ccc0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
1ccd0 64 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d));.      retur
1cce0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1ccf0 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70   }.    pFd->pMap
1cd00 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20  Region = pNew;. 
1cd10 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
1cd20 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20 70 46 64   = nMap;.    pFd
1cd30 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
1cd40 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20   = nMap;.  }..  
1cd50 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
1cd60 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
1cd70 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1cd80 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
1cd90 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1cda0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 29 29  ocessId(), pFd))
1cdb0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1cdc0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  E_OK;.}.#endif /
1cdd0 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  * SQLITE_MAX_MMA
1cde0 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a  P_SIZE>0 */../*.
1cdf0 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  ** If possible, 
1ce00 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
1ce10 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66   to a mapping of
1ce20 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e   file fd startin
1ce30 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69  g at offset.** i
1ce40 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67  Off. The mapping
1ce50 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20 66   must be valid f
1ce60 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74  or at least nAmt
1ce70 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   bytes..**.** If
1ce80 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20   such a pointer 
1ce90 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c  can be obtained,
1cea0 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70   store it in *pp
1ceb0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1cec0 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66  TE_OK..** Or, if
1ced0 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20   one cannot but 
1cee0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
1cef0 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e   set *pp to 0 an
1cf00 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
1cf10 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  OK..** Finally, 
1cf20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73  if an error does
1cf30 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61   occur, return a
1cf40 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
1cf50 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a  ode. The final.*
1cf60 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69  * value of *pp i
1cf70 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74  s undefined in t
1cf80 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
1cf90 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
1cfa0 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70   does return a p
1cfb0 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c  ointer, the call
1cfc0 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c  er must eventual
1cfd0 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74  ly .** release t
1cfe0 68 65 20 72 65 66 65 72 65 6e 63 65 20 62 79 20  he reference by 
1cff0 63 61 6c 6c 69 6e 67 20 77 69 6e 55 6e 66 65 74  calling winUnfet
1d000 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ch()..*/.static 
1d010 69 6e 74 20 77 69 6e 46 65 74 63 68 28 73 71 6c  int winFetch(sql
1d020 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
1d030 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d  64 iOff, int nAm
1d040 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23  t, void **pp){.#
1d050 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1d060 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 46  AP_SIZE>0.  winF
1d070 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e 46  ile *pFd = (winF
1d080 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  ile*)fd;   /* Th
1d090 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
1d0a0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65  abase file */.#e
1d0b0 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a  ndif.  *pp = 0;.
1d0c0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54  .  OSTRACE(("FET
1d0d0 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
1d0e0 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c  e=%p, offset=%ll
1d0f0 64 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 70 70  d, amount=%d, pp
1d100 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
1d110 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1d120 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20  rocessId(), fd, 
1d130 69 4f 66 66 2c 20 6e 41 6d 74 2c 20 70 70 29 29  iOff, nAmt, pp))
1d140 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
1d150 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1d160 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
1d170 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66  eMax>0 ){.    if
1d180 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  ( pFd->pMapRegio
1d190 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  n==0 ){.      in
1d1a0 74 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c  t rc = winMapfil
1d1b0 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20  e(pFd, -1);.    
1d1c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d1d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 4f  _OK ){.        O
1d1e0 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70  STRACE(("FETCH p
1d1f0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1d200 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1d210 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
1d220 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1d230 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74  Id(), pFd, sqlit
1d240 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
1d250 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1d260 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1d270 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d  }.    if( pFd->m
1d280 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b  mapSize >= iOff+
1d290 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70  nAmt ){.      *p
1d2a0 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d  p = &((u8 *)pFd-
1d2b0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
1d2c0 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e  f];.      pFd->n
1d2d0 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20  FetchOut++;.    
1d2e0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
1d2f0 4f 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20  OSTRACE(("FETCH 
1d300 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
1d310 70 2c 20 70 70 3d 25 70 2c 20 2a 70 70 3d 25 70  p, pp=%p, *pp=%p
1d320 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
1d330 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
1d340 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1d350 73 49 64 28 29 2c 20 66 64 2c 20 70 70 2c 20 2a  sId(), fd, pp, *
1d360 70 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  pp));.  return S
1d370 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1d380 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20  ** If the third 
1d390 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d  argument is non-
1d3a0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
1d3b0 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73 65  function release
1d3c0 73 20 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63  s a .** referenc
1d3d0 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61 6e  e obtained by an
1d3e0 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
1d3f0 20 77 69 6e 46 65 74 63 68 28 29 2e 20 54 68 65   winFetch(). The
1d400 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d   second.** argum
1d410 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
1d420 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  is function must
1d430 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
1d440 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
1d450 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68  g.** argument th
1d460 61 74 20 77 61 73 20 70 61 73 73 65 64 20 74 6f  at was passed to
1d470 20 74 68 65 20 77 69 6e 46 65 74 63 68 28 29 20   the winFetch() 
1d480 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a  invocation. .**.
1d490 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68  ** Or, if the th
1d4a0 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ird argument is 
1d4b0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
1d4c0 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
1d4d0 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20  g called .** to 
1d4e0 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c  inform the VFS l
1d4f0 61 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72  ayer that, accor
1d500 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61  ding to POSIX, a
1d510 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  ny existing mapp
1d520 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20  ing .** may now 
1d530 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73  be invalid and s
1d540 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65  hould be unmappe
1d550 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1d560 20 77 69 6e 55 6e 66 65 74 63 68 28 73 71 6c 69   winUnfetch(sqli
1d570 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
1d580 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29  4 iOff, void *p)
1d590 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
1d5a0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77  _MMAP_SIZE>0.  w
1d5b0 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77  inFile *pFd = (w
1d5c0 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a  inFile*)fd;   /*
1d5d0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1d5e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
1d5f0 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28  ..  /* If p==0 (
1d600 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65  unmap the entire
1d610 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72   file) then ther
1d620 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74  e must be no out
1d630 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78  standing .  ** x
1d640 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 73  Fetch references
1d650 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d  . Or, if p!=0 (m
1d660 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20  eaning it is an 
1d670 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
1d680 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65  ),.  ** then the
1d690 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  re must be at le
1d6a0 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64  ast one outstand
1d6b0 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ing.  */.  asser
1d6c0 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d  t( (p==0)==(pFd-
1d6d0 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29  >nFetchOut==0) )
1d6e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c  ;..  /* If p!=0,
1d6f0 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74   it must match t
1d700 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a  he iOff value. *
1d710 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  /.  assert( p==0
1d720 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70   || p==&((u8 *)p
1d730 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
1d740 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 4f 53 54 52  iOff] );..  OSTR
1d750 41 43 45 28 28 22 55 4e 46 45 54 43 48 20 70 69  ACE(("UNFETCH pi
1d760 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
1d770 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 70 3d   offset=%lld, p=
1d780 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %p\n",.         
1d790 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1d7a0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20  ocessId(), pFd, 
1d7b0 69 4f 66 66 2c 20 70 29 29 3b 0a 0a 20 20 69 66  iOff, p));..  if
1d7c0 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e  ( p ){.    pFd->
1d7d0 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d  nFetchOut--;.  }
1d7e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 49 58  else{.    /* FIX
1d7f0 4d 45 3a 20 20 49 66 20 57 69 6e 64 6f 77 73 20  ME:  If Windows 
1d800 74 72 75 6c 79 20 61 6c 77 61 79 73 20 70 72 65  truly always pre
1d810 76 65 6e 74 73 20 74 72 75 6e 63 61 74 69 6e 67  vents truncating
1d820 20 6f 72 20 64 65 6c 65 74 69 6e 67 20 61 0a 20   or deleting a. 
1d830 20 20 20 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65     ** file while
1d840 20 61 20 6d 61 70 70 69 6e 67 20 69 73 20 68 65   a mapping is he
1d850 6c 64 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c  ld, then the fol
1d860 6c 6f 77 69 6e 67 20 77 69 6e 55 6e 6d 61 70 66  lowing winUnmapf
1d870 69 6c 65 28 29 20 63 61 6c 6c 0a 20 20 20 20 2a  ile() call.    *
1d880 2a 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79  * is unnecessary
1d890 20 63 61 6e 20 63 61 6e 20 62 65 20 6f 6d 69 74   can can be omit
1d8a0 74 65 64 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c  ted - potentiall
1d8b0 79 20 69 6d 70 72 6f 76 69 6e 67 0a 20 20 20 20  y improving.    
1d8c0 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20  ** performance. 
1d8d0 20 2a 2f 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70   */.    winUnmap
1d8e0 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a  file(pFd);.  }..
1d8f0 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e    assert( pFd->n
1d900 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23  FetchOut>=0 );.#
1d910 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45  endif..  OSTRACE
1d920 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25  (("UNFETCH pid=%
1d930 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
1d940 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
1d950 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1d960 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1d970 29 2c 20 66 64 29 29 3b 0a 20 20 72 65 74 75 72  ), fd));.  retur
1d980 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1d990 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20  /*.** Here ends 
1d9a0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
1d9b0 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65  on of all sqlite
1d9c0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a  3_file methods..
1d9d0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
1d9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71  ********* End sq
1d9f0 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f  lite3_file Metho
1da00 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
1da10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1da20 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
1da30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1da40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1da50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1da60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1da70 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  */../*.** This v
1da80 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c  ector defines al
1da90 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68  l the methods th
1daa0 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f  at can operate o
1dab0 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  n an.** sqlite3_
1dac0 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a  file for win32..
1dad0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
1dae0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1daf0 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d  ds winIoMethod =
1db00 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20   {.  3,         
1db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
1db30 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20   */.  winClose, 
1db40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db50 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
1db60 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20  */.  winRead,   
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db80 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
1db90 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20  .  winWrite,    
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbb0 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a     /* xWrite */.
1dbc0 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20    winTruncate,  
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbe0 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
1dbf0 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20  /.  winSync,    
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc10 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
1dc20 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20    winFileSize,  
1dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc40 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
1dc50 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20  /.  winLock,    
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc70 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a      /* xLock */.
1dc80 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20    winUnlock,    
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dca0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a    /* xUnlock */.
1dcb0 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76    winCheckReserv
1dcc0 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  edLock,         
1dcd0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
1dce0 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  vedLock */.  win
1dcf0 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
1dd00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dd10 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a  xFileControl */.
1dd20 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c    winSectorSize,
1dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd40 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
1dd50 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43   */.  winDeviceC
1dd60 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
1dd70 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65        /* xDevice
1dd80 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1dd90 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20  */.  winShmMap, 
1dda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ddb0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
1ddc0 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c  */.  winShmLock,
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dde0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
1ddf0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72   */.  winShmBarr
1de00 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ier,            
1de10 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
1de20 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  rier */.  winShm
1de30 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  Unmap,          
1de40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
1de50 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46  mUnmap */.  winF
1de60 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20  etch,           
1de70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1de80 46 65 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e  Fetch */.  winUn
1de90 66 65 74 63 68 20 20 20 20 20 20 20 20 20 20 20  fetch           
1dea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
1deb0 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  nfetch */.};../*
1dec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ded0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1dee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1def0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1df00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
1df10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1df20 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33  ******** sqlite3
1df30 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
1df40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1df50 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
1df60 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
1df70 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65  ntains the imple
1df80 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74  mentation of met
1df90 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73  hods on the.** s
1dfa0 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
1dfb0 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  t..*/../*.** Con
1dfc0 76 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c  vert a UTF-8 fil
1dfd0 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65  ename into whate
1dfe0 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64  ver form the und
1dff0 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  erlying.** opera
1e000 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74  ting system want
1e010 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20  s filenames in. 
1e020 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
1e030 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20  he result.** is 
1e040 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
1e050 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65  lloc and must be
1e060 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
1e070 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
1e080 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
1e090 64 20 2a 63 6f 6e 76 65 72 74 55 74 66 38 46 69  d *convertUtf8Fi
1e0a0 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  lename(const cha
1e0b0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
1e0c0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
1e0d0 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 73 4e  d = 0;.  if( isN
1e0e0 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76  T() ){.    zConv
1e0f0 65 72 74 65 64 20 3d 20 75 74 66 38 54 6f 55 6e  erted = utf8ToUn
1e100 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
1e110 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
1e120 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
1e130 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a  SI.  else{.    z
1e140 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69  Converted = sqli
1e150 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
1e160 6f 5f 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65  o_mbcs(zFilename
1e170 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
1e180 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
1e190 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
1e1a0 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
1e1b0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f  zConverted;.}../
1e1c0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
1e1d0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
1e1e0 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66  e in zBuf.  zBuf
1e1f0 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f   must be big eno
1e200 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61  ugh to.** hold a
1e210 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  t pVfs->mxPathna
1e220 6d 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  me characters..*
1e230 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
1e240 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
1e250 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
1e260 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 43    static char zC
1e270 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
1e280 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
1e290 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
1e2a0 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
1e2b0 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
1e2c0 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73  0123456789";.  s
1e2d0 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e  ize_t i, j;.  in
1e2e0 74 20 6e 54 65 6d 70 50 61 74 68 3b 0a 20 20 63  t nTempPath;.  c
1e2f0 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d 41  har zTempPath[MA
1e300 58 5f 50 41 54 48 2b 32 5d 3b 0a 0a 20 20 2f 2a  X_PATH+2];..  /*
1e310 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
1e320 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
1e330 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
1e340 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
1e350 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
1e360 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
1e370 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
1e380 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
1e390 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
1e3a0 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a  ction failing. .
1e3b0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
1e3c0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
1e3d0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
1e3e0 20 20 6d 65 6d 73 65 74 28 7a 54 65 6d 70 50 61    memset(zTempPa
1e3f0 74 68 2c 20 30 2c 20 4d 41 58 5f 50 41 54 48 2b  th, 0, MAX_PATH+
1e400 32 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  2);..  if( sqlit
1e410 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
1e420 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
1e430 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
1e440 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68  TH-30, zTempPath
1e450 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  , "%s", sqlite3_
1e460 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b  temp_directory);
1e470 0a 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45  .  }.#if !SQLITE
1e480 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 65 6c 73 65  _OS_WINRT.  else
1e490 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
1e4a0 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b     char *zMulti;
1e4b0 0a 20 20 20 20 57 43 48 41 52 20 7a 57 69 64 65  .    WCHAR zWide
1e4c0 50 61 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a  Path[MAX_PATH];.
1e4d0 20 20 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74      osGetTempPat
1e4e0 68 57 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20  hW(MAX_PATH-30, 
1e4f0 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
1e500 7a 4d 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65  zMulti = unicode
1e510 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68  ToUtf8(zWidePath
1e520 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74  );.    if( zMult
1e530 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  i ){.      sqlit
1e540 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f  e3_snprintf(MAX_
1e550 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61  PATH-30, zTempPa
1e560 74 68 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69  th, "%s", zMulti
1e570 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1e580 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20  _free(zMulti);. 
1e590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e5a0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
1e5b0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
1e5c0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
1e5d0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1e5e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1e5f0 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  MEM;.    }.  }.#
1e600 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
1e610 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
1e620 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55  se{.    char *zU
1e630 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20 7a 4d  tf8;.    char zM
1e640 62 63 73 50 61 74 68 5b 4d 41 58 5f 50 41 54 48  bcsPath[MAX_PATH
1e650 5d 3b 0a 20 20 20 20 6f 73 47 65 74 54 65 6d 70  ];.    osGetTemp
1e660 50 61 74 68 41 28 4d 41 58 5f 50 41 54 48 2d 33  PathA(MAX_PATH-3
1e670 30 2c 20 7a 4d 62 63 73 50 61 74 68 29 3b 0a 20  0, zMbcsPath);. 
1e680 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74     zUtf8 = sqlit
1e690 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
1e6a0 5f 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29  _utf8(zMbcsPath)
1e6b0 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38 20  ;.    if( zUtf8 
1e6c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1e6d0 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
1e6e0 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68  TH-30, zTempPath
1e6f0 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a  , "%s", zUtf8);.
1e700 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1e710 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d  ee(zUtf8);.    }
1e720 65 6c 73 65 7b 0a 20 20 20 20 20 20 4f 53 54 52  else{.      OSTR
1e730 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
1e740 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
1e750 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
1e760 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e770 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1e780 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1e790 66 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 43  f.#endif..  /* C
1e7a0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75  heck that the ou
1e7b0 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c  tput buffer is l
1e7c0 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20  arge enough for 
1e7d0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
1e7e0 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49  le .  ** name. I
1e7f0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72 65 74  f it is not, ret
1e800 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1e810 2e 0a 20 20 2a 2f 0a 20 20 6e 54 65 6d 70 50 61  ..  */.  nTempPa
1e820 74 68 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  th = sqlite3Strl
1e830 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29 3b  en30(zTempPath);
1e840 0a 0a 20 20 69 66 28 20 28 6e 54 65 6d 70 50 61  ..  if( (nTempPa
1e850 74 68 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c  th + sqlite3Strl
1e860 65 6e 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50  en30(SQLITE_TEMP
1e870 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b 20  _FILE_PREFIX) + 
1e880 31 38 29 20 3e 3d 20 6e 42 75 66 20 29 7b 0a 20  18) >= nBuf ){. 
1e890 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
1e8a0 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
1e8b0 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b  LITE_ERROR\n"));
1e8c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e8d0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
1e8e0 20 66 6f 72 28 69 3d 6e 54 65 6d 70 50 61 74 68   for(i=nTempPath
1e8f0 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61  ; i>0 && zTempPa
1e900 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69  th[i-1]=='\\'; i
1e910 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74  --){}.  zTempPat
1e920 68 5b 69 5d 20 3d 20 30 3b 0a 0a 20 20 73 71 6c  h[i] = 0;..  sql
1e930 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42  ite3_snprintf(nB
1e940 75 66 2d 31 38 2c 20 7a 42 75 66 2c 20 28 6e 54  uf-18, zBuf, (nT
1e950 65 6d 70 50 61 74 68 20 3e 20 30 29 20 3f 0a 20  empPath > 0) ?. 
1e960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e970 20 20 20 20 20 20 22 25 73 5c 5c 22 53 51 4c 49        "%s\\"SQLI
1e980 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45  TE_TEMP_FILE_PRE
1e990 46 49 58 20 3a 20 53 51 4c 49 54 45 5f 54 45 4d  FIX : SQLITE_TEM
1e9a0 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 0a 20  P_FILE_PREFIX,. 
1e9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9c0 20 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20    zTempPath);.  
1e9d0 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  j = sqlite3Strle
1e9e0 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c  n30(zBuf);.  sql
1e9f0 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
1ea00 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
1ea10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
1ea20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  i++, j++){.    z
1ea30 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
1ea40 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
1ea50 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
1ea60 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
1ea70 31 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66  1) ];.  }.  zBuf
1ea80 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b  [j] = 0;.  zBuf[
1ea90 6a 2b 31 5d 20 3d 20 30 3b 0a 0a 20 20 4f 53 54  j+1] = 0;..  OST
1eaa0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
1eab0 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63  NAME name=%s, rc
1eac0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 7a  =SQLITE_OK\n", z
1ead0 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Buf));.  return 
1eae0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1eaf0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1eb00 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  if the named fil
1eb10 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 64 69  e is really a di
1eb20 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75 72 6e  rectory.  Return
1eb30 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74 20   false if.** it 
1eb40 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  is something oth
1eb50 65 72 20 74 68 61 6e 20 61 20 64 69 72 65 63 74  er than a direct
1eb60 6f 72 79 2c 20 6f 72 20 69 66 20 74 68 65 72 65  ory, or if there
1eb70 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20   is any kind of 
1eb80 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61  memory.** alloca
1eb90 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  tion failure..*/
1eba0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49  .static int winI
1ebb0 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20  sDir(const void 
1ebc0 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20 20  *zConverted){.  
1ebd0 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e  DWORD attr;.  in
1ebe0 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52  t rc = 0;.  DWOR
1ebf0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
1ec00 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
1ec10 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
1ec20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
1ec30 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
1ec40 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73  trData;.    mems
1ec50 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
1ec60 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
1ec70 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ta));.    while(
1ec80 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c   !(rc = osGetFil
1ec90 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28  eAttributesExW((
1eca0 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
1ecb0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecd0 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
1ece0 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20  andard,.        
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29       &sAttrData)
1ed10 29 20 26 26 20 72 65 74 72 79 49 6f 65 72 72 28  ) && retryIoerr(
1ed20 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
1ed30 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72  ) ){}.    if( !r
1ed40 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
1ed50 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20  n 0; /* Invalid 
1ed60 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20  name? */.    }. 
1ed70 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
1ed80 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
1ed90 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45  utes;.#if SQLITE
1eda0 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
1edb0 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d  else{.    attr =
1edc0 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
1edd0 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f  utesA((char*)zCo
1ede0 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
1edf0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61  .  }.  return (a
1ee00 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
1ee10 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26 26  E_ATTRIBUTES) &&
1ee20 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52   (attr&FILE_ATTR
1ee30 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29  IBUTE_DIRECTORY)
1ee40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1ee50 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
1ee60 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20  c int winOpen(. 
1ee70 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1ee80 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  fs,        /* No
1ee90 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  t used */.  cons
1eea0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
1eeb0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1eec0 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38   the file (UTF-8
1eed0 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  ) */.  sqlite3_f
1eee0 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
1eef0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53 51   /* Write the SQ
1ef00 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  Lite file handle
1ef10 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66   here */.  int f
1ef20 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
1ef30 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64       /* Open mod
1ef40 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74  e flags */.  int
1ef50 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
1ef60 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73         /* Status
1ef70 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f   return flags */
1ef80 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a  .){.  HANDLE h;.
1ef90 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
1efa0 6f 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73  o;.  DWORD dwDes
1efb0 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57  iredAccess;.  DW
1efc0 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b  ORD dwShareMode;
1efd0 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74  .  DWORD dwCreat
1efe0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a  ionDisposition;.
1eff0 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41    DWORD dwFlagsA
1f000 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 30  ndAttributes = 0
1f010 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
1f020 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65  WINCE.  int isTe
1f030 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  mp = 0;.#endif. 
1f040 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
1f050 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
1f060 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
1f070 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
1f080 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20   /* Filename in 
1f090 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  OS encoding */. 
1f0a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74   const char *zUt
1f0b0 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20  f8Name = zName; 
1f0c0 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55  /* Filename in U
1f0d0 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  TF-8 encoding */
1f0e0 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
1f0f0 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
1f100 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c  t zPath is a NUL
1f110 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  L pointer, this 
1f120 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75  function is requ
1f130 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  ired to open.  *
1f140 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
1f150 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66  le. Use this buf
1f160 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
1f170 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20   file name in.. 
1f180 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e   */.  char zTmpn
1f190 61 6d 65 5b 4d 41 58 5f 50 41 54 48 2b 32 5d 3b  ame[MAX_PATH+2];
1f1a0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75       /* Buffer u
1f1b0 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 74 65  sed to create te
1f1c0 6d 70 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 0a  mp filename */..
1f1d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1f1e0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
1f1f0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74   /* Function Ret
1f200 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20  urn Code */.#if 
1f210 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
1f220 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
1f230 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20  NCE.  int eType 
1f240 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
1f250 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
1f260 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
1f270 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73  #endif..  int is
1f280 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c  Exclusive  = (fl
1f290 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1f2a0 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  N_EXCLUSIVE);.  
1f2b0 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
1f2c0 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
1f2d0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
1f2e0 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73  CLOSE);.  int is
1f2f0 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c  Create     = (fl
1f300 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1f310 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74  N_CREATE);.  int
1f320 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20   isReadonly   = 
1f330 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1f340 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
1f350 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74    int isReadWrit
1f360 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
1f370 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1f380 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  ITE);..#ifndef N
1f390 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f 70  DEBUG.  int isOp
1f3a0 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43  enJournal = (isC
1f3b0 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20  reate && (.     
1f3c0 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45     eType==SQLITE
1f3d0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
1f3e0 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
1f3f0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1f400 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _MAIN_JOURNAL . 
1f410 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
1f420 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
1f430 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53  ));.#endif..  OS
1f440 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
1f450 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70 2c 20  e=%s, pFile=%p, 
1f460 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74 46 6c  flags=%x, pOutFl
1f470 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  ags=%p\n",.     
1f480 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 2c        zUtf8Name,
1f490 20 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74   id, flags, pOut
1f4a0 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a 20 43  Flags));..  /* C
1f4b0 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69  heck the followi
1f4c0 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ng statements ar
1f4d0 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20  e true: .  **.  
1f4e0 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79  **   (a) Exactly
1f4f0 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44   one of the READ
1f500 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e  WRITE and READON
1f510 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  LY flags must be
1f520 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20   set, and .  ** 
1f530 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
1f540 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
1f550 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
1f560 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
1f570 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
1f580 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
1f590 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
1f5a0 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20  so be set..  ** 
1f5b0 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f    (d) if DELETEO
1f5c0 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74  NCLOSE is set, t
1f5d0 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
1f5e0 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
1f5f0 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
1f600 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
1f610 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
1f620 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
1f630 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
1f640 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
1f650 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
1f660 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
1f670 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
1f680 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65  sCreate);.  asse
1f690 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c  rt(isDelete==0 |
1f6a0 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20  | isCreate);..  
1f6b0 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20  /* The main DB, 
1f6c0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41  main journal, WA
1f6d0 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65  L file and maste
1f6e0 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65  r journal are ne
1f6f0 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61  ver .  ** automa
1f700 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e  tically deleted.
1f710 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76   Nor are they ev
1f720 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  er temporary fil
1f730 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  es.  */.  assert
1f740 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
1f750 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
1f760 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
1f770 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  N_DB );.  assert
1f780 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
1f790 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
1f7a0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
1f7b0 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  N_JOURNAL );.  a
1f7c0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
1f7d0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
1f7e0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
1f7f0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
1f800 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
1f810 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
1f820 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
1f830 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a  ITE_OPEN_WAL );.
1f840 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61  .  /* Assert tha
1f850 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  t the upper laye
1f860 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66  r has set one of
1f870 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22   the "file-type"
1f880 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73   flags. */.  ass
1f890 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49  ert( eType==SQLI
1f8a0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
1f8b0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
1f8c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
1f8d0 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  DB .       || eT
1f8e0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1f8f0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  _MAIN_JOURNAL ||
1f900 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1f910 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
1f920 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
1f930 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  e==SQLITE_OPEN_S
1f940 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65  UBJOURNAL   || e
1f950 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1f960 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
1f970 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
1f980 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
1f990 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65  RANSIENT_DB || e
1f9a0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
1f9b0 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73  N_WAL.  );..  as
1f9c0 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29  sert( pFile!=0 )
1f9d0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65  ;.  memset(pFile
1f9e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46  , 0, sizeof(winF
1f9f0 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  ile));.  pFile->
1fa00 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44  h = INVALID_HAND
1fa10 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53  LE_VALUE;..#if S
1fa20 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
1fa30 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 74 65   if( !sqlite3_te
1fa40 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a  mp_directory ){.
1fa50 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
1fa60 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20  SQLITE_ERROR,.  
1fa70 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f 74        "sqlite3_t
1fa80 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76 61  emp_directory va
1fa90 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65  riable should be
1faa0 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22 29   set for WinRT")
1fab0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
1fac0 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  /* If the second
1fad0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
1fae0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55  s function is NU
1faf0 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a  LL, generate a .
1fb00 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66    ** temporary f
1fb10 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20  ile name to use 
1fb20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74  .  */.  if( !zUt
1fb30 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  f8Name ){.    as
1fb40 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26  sert(isDelete &&
1fb50 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 29   !isOpenJournal)
1fb60 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 54 6d  ;.    memset(zTm
1fb70 70 6e 61 6d 65 2c 20 30 2c 20 4d 41 58 5f 50 41  pname, 0, MAX_PA
1fb80 54 48 2b 32 29 3b 0a 20 20 20 20 72 63 20 3d 20  TH+2);.    rc = 
1fb90 67 65 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f  getTempname(MAX_
1fba0 50 41 54 48 2b 32 2c 20 7a 54 6d 70 6e 61 6d 65  PATH+2, zTmpname
1fbb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1fbc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1fbd0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
1fbe0 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 22   name=%s, rc=%s"
1fbf0 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 73 71 6c  , zUtf8Name, sql
1fc00 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
1fc10 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1fc20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55  rc;.    }.    zU
1fc30 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61  tf8Name = zTmpna
1fc40 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61  me;.  }..  /* Da
1fc50 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73  tabase filenames
1fc60 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f   are double-zero
1fc70 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74   terminated if t
1fc80 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a  hey are not.  **
1fc90 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d   URIs with param
1fca0 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74  eters.  Hence, t
1fcb0 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62  hey can always b
1fcc0 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20  e passed into.  
1fcd0 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  ** sqlite3_uri_p
1fce0 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f  arameter()..  */
1fcf0 0a 20 20 61 73 73 65 72 74 28 20 28 65 54 79 70  .  assert( (eTyp
1fd00 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
1fd10 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67  AIN_DB) || (flag
1fd20 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
1fd30 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  URI) ||.        
1fd40 7a 55 74 66 38 4e 61 6d 65 5b 73 74 72 6c 65 6e  zUtf8Name[strlen
1fd50 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d  (zUtf8Name)+1]==
1fd60 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  0 );..  /* Conve
1fd70 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  rt the filename 
1fd80 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e  to the system en
1fd90 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f  coding. */.  zCo
1fda0 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72  nverted = conver
1fdb0 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55  tUtf8Filename(zU
1fdc0 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  tf8Name);.  if( 
1fdd0 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
1fde0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f  .    OSTRACE(("O
1fdf0 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  PEN name=%s, rc=
1fe00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1fe10 45 4d 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29  EM", zUtf8Name))
1fe20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1fe30 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1fe40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49  .  }..  if( winI
1fe50 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29  sDir(zConverted)
1fe60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1fe70 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
1fe80 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
1fe90 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63  OPEN name=%s, rc
1fea0 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
1feb0 5f 49 53 44 49 52 22 2c 20 7a 55 74 66 38 4e 61  _ISDIR", zUtf8Na
1fec0 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me));.    return
1fed0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1fee0 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ISDIR;.  }..  i
1fef0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
1ff00 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41  {.    dwDesiredA
1ff10 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f  ccess = GENERIC_
1ff20 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57  READ | GENERIC_W
1ff30 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RITE;.  }else{. 
1ff40 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
1ff50 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41  ss = GENERIC_REA
1ff60 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c  D;.  }..  /* SQL
1ff70 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1ff80 56 45 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  VE is used to ma
1ff90 6b 65 20 73 75 72 65 20 74 68 61 74 20 61 20 6e  ke sure that a n
1ffa0 65 77 20 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a  ew file is .  **
1ffb0 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69 74 65   created. SQLite
1ffc0 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69 74 20   doesn't use it 
1ffd0 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65 78 63  to indicate "exc
1ffe0 6c 75 73 69 76 65 20 61 63 63 65 73 73 22 20 0a  lusive access" .
1fff0 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20 75 73    ** as it is us
20000 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64  ually understood
20010 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45  ..  */.  if( isE
20020 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
20030 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e 65 77  /* Creates a new
20040 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69   file, only if i
20050 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
20060 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20  dy exist. */.   
20070 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
20080 65 78 69 73 74 73 2c 20 69 74 20 66 61 69 6c 73  exists, it fails
20090 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  . */.    dwCreat
200a0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
200b0 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d   CREATE_NEW;.  }
200c0 65 6c 73 65 20 69 66 28 20 69 73 43 72 65 61 74  else if( isCreat
200d0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  e ){.    /* Open
200e0 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 2c 20   existing file, 
200f0 6f 72 20 63 72 65 61 74 65 20 69 66 20 69 74 20  or create if it 
20100 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20 2a 2f  doesn't exist */
20110 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
20120 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45  isposition = OPE
20130 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73  N_ALWAYS;.  }els
20140 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20  e{.    /* Opens 
20150 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20  a file, only if 
20160 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20  it exists. */.  
20170 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
20180 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45  osition = OPEN_E
20190 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20  XISTING;.  }..  
201a0 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 46 49  dwShareMode = FI
201b0 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20  LE_SHARE_READ | 
201c0 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45  FILE_SHARE_WRITE
201d0 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74  ;..  if( isDelet
201e0 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  e ){.#if SQLITE_
201f0 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77 46  OS_WINCE.    dwF
20200 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
20210 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
20220 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 69  TE_HIDDEN;.    i
20230 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65  sTemp = 1;.#else
20240 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
20250 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
20260 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f  _ATTRIBUTE_TEMPO
20270 52 41 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  RARY.           
20280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20290 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49      | FILE_ATTRI
202a0 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20 20  BUTE_HIDDEN.    
202b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
202c0 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c             | FIL
202d0 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e  E_FLAG_DELETE_ON
202e0 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20  _CLOSE;.#endif. 
202f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c   }else{.    dwFl
20300 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
20310 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
20320 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  E_NORMAL;.  }.  
20330 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20  /* Reports from 
20340 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72 65  the internet are
20350 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e 63   that performanc
20360 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a  e is always.  **
20370 20 62 65 74 74 65 72 20 69 66 20 46 49 4c 45 5f   better if FILE_
20380 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45  FLAG_RANDOM_ACCE
20390 53 53 20 69 73 20 75 73 65 64 2e 20 20 54 69 63  SS is used.  Tic
203a0 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69  ket #2699. */.#i
203b0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
203c0 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74  E.  dwFlagsAndAt
203d0 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45  tributes |= FILE
203e0 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
203f0 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ESS;.#endif..  i
20400 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23 69 66  f( isNT() ){.#if
20410 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
20420 0a 20 20 20 20 43 52 45 41 54 45 46 49 4c 45 32  .    CREATEFILE2
20430 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
20440 54 45 52 53 20 65 78 74 65 6e 64 65 64 50 61 72  TERS extendedPar
20450 61 6d 65 74 65 72 73 3b 0a 20 20 20 20 65 78 74  ameters;.    ext
20460 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
20470 64 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  dwSize = sizeof(
20480 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45  CREATEFILE2_EXTE
20490 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29  NDED_PARAMETERS)
204a0 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
204b0 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 41  rameters.dwFileA
204c0 74 74 72 69 62 75 74 65 73 20 3d 0a 20 20 20 20  ttributes =.    
204d0 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41          dwFlagsA
204e0 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46  ndAttributes & F
204f0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41  ILE_ATTRIBUTE_MA
20500 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  SK;.    extended
20510 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c  Parameters.dwFil
20520 65 46 6c 61 67 73 20 3d 20 64 77 46 6c 61 67 73  eFlags = dwFlags
20530 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20  AndAttributes & 
20540 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a  FILE_FLAG_MASK;.
20550 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
20560 6d 65 74 65 72 73 2e 64 77 53 65 63 75 72 69 74  meters.dwSecurit
20570 79 51 6f 73 46 6c 61 67 73 20 3d 20 53 45 43 55  yQosFlags = SECU
20580 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a  RITY_ANONYMOUS;.
20590 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
205a0 6d 65 74 65 72 73 2e 6c 70 53 65 63 75 72 69 74  meters.lpSecurit
205b0 79 41 74 74 72 69 62 75 74 65 73 20 3d 20 4e 55  yAttributes = NU
205c0 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  LL;.    extended
205d0 50 61 72 61 6d 65 74 65 72 73 2e 68 54 65 6d 70  Parameters.hTemp
205e0 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b  lateFile = NULL;
205f0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
20600 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32 28 28   osCreateFile2((
20610 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
20620 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
20630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20640 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
20650 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
20660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20670 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20   dwShareMode,.  
20680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20690 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
206a0 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
206b0 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
206c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206d0 20 26 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65   &extendedParame
206e0 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  ters))==INVALID_
206f0 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
20700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
20720 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
20730 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
20740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20750 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65  Noop */.    }.#e
20760 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 28  lse.    while( (
20770 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  h = osCreateFile
20780 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
20790 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
207a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207b0 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
207c0 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
207d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207e0 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
207f0 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
20800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20810 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
20820 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
20830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20840 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
20850 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
20860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
20880 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  LL))==INVALID_HA
20890 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20  NDLE_VALUE &&.  
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 72              retr
208c0 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
208d0 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
208e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
208f0 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64  op */.    }.#end
20900 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  if.  }.#ifdef SQ
20910 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
20920 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
20930 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72  while( (h = osCr
20940 65 61 74 65 46 69 6c 65 41 28 28 4c 50 43 53 54  eateFileA((LPCST
20950 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
20960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20970 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65              dwDe
20980 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
20990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209a0 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61             dwSha
209b0 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20  reMode, NULL,.  
209c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209d0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
209e0 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
209f0 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a10 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
20a20 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20  butes,.         
20a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a40 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56       NULL))==INV
20a50 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
20a60 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a80 20 20 20 72 65 74 72 79 49 6f 65 72 72 28 26 63     retryIoerr(&c
20a90 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
20aa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
20ab0 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20    /* Noop */.   
20ac0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
20ad0 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a  logIoerr(cnt);..
20ae0 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
20af0 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25   file=%p, name=%
20b00 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 72  s, access=%lx, r
20b10 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66  c=%s\n", h, zUtf
20b20 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  8Name,.         
20b30 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
20b40 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  s, (h==INVALID_H
20b50 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22  ANDLE_VALUE) ? "
20b60 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
20b70 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41  ;..  if( h==INVA
20b80 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
20b90 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
20ba0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
20bb0 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
20bc0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
20bd0 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61  TOPEN, pFile->la
20be0 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65  stErrno, "winOpe
20bf0 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a  n", zUtf8Name);.
20c00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
20c10 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
20c20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
20c30 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76  e && !isExclusiv
20c40 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
20c50 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20  n winOpen(pVfs, 
20c60 7a 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20  zName, id, .    
20c70 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c       ((flags|SQL
20c80 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
20c90 59 29 20 26 0a 20 20 20 20 20 20 20 20 20 20 20  Y) &.           
20ca0 20 20 20 20 20 20 20 20 20 20 7e 28 53 51 4c 49            ~(SQLI
20cb0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53  TE_OPEN_CREATE|S
20cc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
20cd0 52 49 54 45 29 29 2c 0a 20 20 20 20 20 20 20 20  RITE)),.        
20ce0 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20   pOutFlags);.   
20cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
20d00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
20d10 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
20d20 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74  .  }..  if( pOut
20d30 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28  Flags ){.    if(
20d40 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
20d50 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
20d60 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
20d70 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  EADWRITE;.    }e
20d80 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74  lse{.      *pOut
20d90 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
20da0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
20db0 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41    }.  }..  OSTRA
20dc0 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25  CE(("OPEN file=%
20dd0 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65  p, name=%s, acce
20de0 73 73 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67  ss=%lx, pOutFlag
20df0 73 3d 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73  s=%p, *pOutFlags
20e00 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%d, ".         
20e10 20 20 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20    "rc=%s\n", h, 
20e20 7a 55 74 66 38 4e 61 6d 65 2c 20 64 77 44 65 73  zUtf8Name, dwDes
20e30 69 72 65 64 41 63 63 65 73 73 2c 20 70 4f 75 74  iredAccess, pOut
20e40 46 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73  Flags, pOutFlags
20e50 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 2a 70   ?.           *p
20e60 4f 75 74 46 6c 61 67 73 20 3a 20 30 2c 20 28 68  OutFlags : 0, (h
20e70 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
20e80 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65  _VALUE) ? "faile
20e90 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23 69  d" : "ok"));..#i
20ea0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
20eb0 45 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  E.  if( isReadWr
20ec0 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53 51  ite && eType==SQ
20ed0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
20ee0 42 0a 20 20 20 20 20 20 20 26 26 20 28 72 63 20  B.       && (rc 
20ef0 3d 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63  = winceCreateLoc
20f00 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29  k(zName, pFile))
20f10 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b  !=SQLITE_OK.  ){
20f20 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
20f30 6c 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  le(h);.    sqlit
20f40 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
20f50 65 64 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  ed);.    OSTRACE
20f60 28 28 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20  (("OPEN-CE-LOCK 
20f70 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e  name=%s, rc=%s\n
20f80 22 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65  ", zName, sqlite
20f90 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
20fa0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
20fb0 20 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20   }.  if( isTemp 
20fc0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44  ){.    pFile->zD
20fd0 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a  eleteOnClose = z
20fe0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c  Converted;.  }el
20ff0 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
21000 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
21010 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a  Converted);.  }.
21020 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  .  pFile->pMetho
21030 64 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64  d = &winIoMethod
21040 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20  ;.  pFile->pVfs 
21050 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d  = pVfs;.  pFile-
21060 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20 69 73  >h = h;.  if( is
21070 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20  Readonly ){.    
21080 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
21090 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e   |= WINFILE_RDON
210a0 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  LY;.  }.  if( sq
210b0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
210c0 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c  n(zName, "psow",
210d0 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46   SQLITE_POWERSAF
210e0 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a  E_OVERWRITE) ){.
210f0 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
21100 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f  lags |= WINFILE_
21110 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  PSOW;.  }.  pFil
21120 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e  e->lastErrno = N
21130 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65  O_ERROR;.  pFile
21140 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b  ->zPath = zName;
21150 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
21160 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 46  MMAP_SIZE>0.  pF
21170 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c  ile->hMap = NULL
21180 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  ;.  pFile->pMapR
21190 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46 69  egion = 0;.  pFi
211a0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30  le->mmapSize = 0
211b0 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ;.  pFile->mmapS
211c0 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20  izeActual = 0;. 
211d0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
211e0 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  Max = sqlite3Glo
211f0 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70  balConfig.mxMmap
21200 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65 6e  ;.#endif..  Open
21210 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72  Counter(+1);.  r
21220 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
21230 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61  ** Delete the na
21240 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  med file..**.** 
21250 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f 77  Note that Window
21260 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  s does not allow
21270 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65   a file to be de
21280 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  leted if some ot
21290 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68  her.** process h
212a0 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d  as it open.  Som
212b0 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20 73  etimes a virus s
212c0 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69  canner or indexi
212d0 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69  ng program.** wi
212e0 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  ll open a journa
212f0 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61  l file shortly a
21300 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61 74  fter it is creat
21310 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64  ed in order to d
21320 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74  o.** whatever it
21330 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68   does.  While th
21340 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  is other process
21350 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a   is holding the.
21360 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65  ** file open, we
21370 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20   will be unable 
21380 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54  to delete it.  T
21390 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
213a0 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77  is.** problem, w
213b0 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c  e delay 100 mill
213c0 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79  iseconds and try
213d0 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e   to delete again
213e0 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44  .  Up.** to MX_D
213f0 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73  ELETION_ATTEMPTs
21400 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70   deletion attemp
21410 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72  ts are run befor
21420 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61  e giving.** up a
21430 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20  nd returning an 
21440 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  error..*/.static
21450 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a   int winDelete(.
21460 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
21470 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Vfs,          /*
21480 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e   Not used on win
21490 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  32 */.  const ch
214a0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
214b0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
214c0 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  ile to delete */
214d0 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20  .  int syncDir  
214e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
214f0 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
21500 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  n32 */.){.  int 
21510 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  cnt = 0;.  int r
21520 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b  c;.  DWORD attr;
21530 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
21540 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e  no;.  void *zCon
21550 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44  verted;.  UNUSED
21560 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
21570 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
21580 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a  ETER(syncDir);..
21590 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
215a0 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
215b0 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20  IOERR_DELETE);. 
215c0 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54   OSTRACE(("DELET
215d0 45 20 6e 61 6d 65 3d 25 73 2c 20 73 79 6e 63 44  E name=%s, syncD
215e0 69 72 3d 25 64 5c 6e 22 2c 20 7a 46 69 6c 65 6e  ir=%d\n", zFilen
215f0 61 6d 65 2c 20 73 79 6e 63 44 69 72 29 29 3b 0a  ame, syncDir));.
21600 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
21610 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e  convertUtf8Filen
21620 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
21630 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
21640 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
21650 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
21660 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  OMEM;.  }.  if( 
21670 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f  isNT() ){.    do
21680 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53   {.#if SQLITE_OS
21690 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49 4e  _WINRT.      WIN
216a0 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  32_FILE_ATTRIBUT
216b0 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61  E_DATA sAttrData
216c0 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
216d0 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69  sAttrData, 0, si
216e0 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29  zeof(sAttrData))
216f0 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 47  ;.      if ( osG
21700 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
21710 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ExW(zConverted, 
21720 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
21730 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ndard,.         
21740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21750 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
21760 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ata) ){.        
21770 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
21780 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
21790 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  s;.      }else{.
217a0 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
217b0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
217c0 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  or();.        if
217d0 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ( lastErrno==ERR
217e0 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
217f0 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61  D.         || la
21800 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50  stErrno==ERROR_P
21810 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b  ATH_NOT_FOUND ){
21820 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
21830 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
21840 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c  ETE_NOENT; /* Al
21850 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20  ready gone? */. 
21860 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
21870 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
21880 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
21890 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
218a0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73  ak;.      }.#els
218b0 65 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f  e.      attr = o
218c0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
218d0 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  esW(zConverted);
218e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
218f0 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44   ( attr==INVALID
21900 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
21910 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
21920 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
21930 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
21940 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
21950 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
21960 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
21970 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
21980 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
21990 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
219a0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
219b0 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
219c0 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
219d0 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
219e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
219f0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
21a00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21a10 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
21a20 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26        if ( attr&
21a30 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
21a40 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20  IRECTORY ){.    
21a50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
21a60 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20  ERROR; /* Files 
21a70 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  only. */.       
21a80 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
21a90 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c        if ( osDel
21aa0 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72  eteFileW(zConver
21ab0 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
21ac0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
21ad0 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a  /* Deleted OK. *
21ae0 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
21af0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
21b00 66 20 28 20 21 72 65 74 72 79 49 6f 65 72 72 28  f ( !retryIoerr(
21b10 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
21b20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
21b30 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
21b40 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69  /* No more retri
21b50 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  es. */.        b
21b60 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
21b70 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20    } while(1);.  
21b80 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
21b90 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
21ba0 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a   else{.    do {.
21bb0 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47        attr = osG
21bc0 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
21bd0 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  A(zConverted);. 
21be0 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d       if ( attr==
21bf0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
21c00 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20  RIBUTES ){.     
21c10 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
21c20 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
21c30 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73  .        if( las
21c40 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49  tErrno==ERROR_FI
21c50 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20  LE_NOT_FOUND.   
21c60 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72        || lastErr
21c70 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no==ERROR_PATH_N
21c80 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
21c90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
21ca0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
21cb0 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79  OENT; /* Already
21cc0 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20   gone? */.      
21cd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21ce0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
21cf0 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
21d00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
21d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
21d20 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52  ( attr&FILE_ATTR
21d30 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20  IBUTE_DIRECTORY 
21d40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
21d50 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
21d60 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a   Files only. */.
21d70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
21d80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
21d90 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 28  ( osDeleteFileA(
21da0 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
21db0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
21dc0 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65  TE_OK; /* Delete
21dd0 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d OK. */.       
21de0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
21df0 20 20 20 20 20 20 69 66 20 28 20 21 72 65 74 72        if ( !retr
21e00 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
21e10 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
21e20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
21e30 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72  ERROR; /* No mor
21e40 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20  e retries. */.  
21e50 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21e60 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65     }.    } while
21e70 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (1);.  }.#endif.
21e80 20 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d    if( rc && rc!=
21e90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
21ea0 45 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20  ETE_NOENT ){.   
21eb0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
21ec0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
21ed0 45 4c 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f  ELETE, lastErrno
21ee0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
21ef0 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c  winDelete", zFil
21f00 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ename);.  }else{
21f10 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e  .    logIoerr(cn
21f20 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
21f30 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
21f40 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  d);.  OSTRACE(("
21f50 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
21f60 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e  rc=%s\n", zFilen
21f70 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ame, sqlite3ErrN
21f80 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
21f90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21fa0 20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74   Check the exist
21fb0 65 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20  ence and status 
21fc0 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  of a file..*/.st
21fd0 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65  atic int winAcce
21fe0 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
21ff0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
22000 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
22010 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
22020 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
22030 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ,     /* Name of
22040 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
22050 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
22060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22070 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74  * Type of test t
22080 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66  o make on this f
22090 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  ile */.  int *pR
220a0 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
220b0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75      /* OUT: Resu
220c0 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44  lt */.){.  DWORD
220d0 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
220e0 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
220f0 74 45 72 72 6e 6f 3b 0a 20 20 76 6f 69 64 20 2a  tErrno;.  void *
22100 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e  zConverted;.  UN
22110 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
22120 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Vfs);..  Simulat
22130 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
22140 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
22150 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52 41  CESS; );.  OSTRA
22160 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
22170 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70  =%s, flags=%x, p
22180 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20 20  ResOut=%p\n",.  
22190 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
221a0 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f  me, flags, pResO
221b0 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72  ut));..  zConver
221c0 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
221d0 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
221e0 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
221f0 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
22200 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53   OSTRACE(("ACCES
22210 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  S name=%s, rc=SQ
22220 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
22230 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29  \n", zFilename))
22240 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
22250 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
22260 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28  .  }.  if( isNT(
22270 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  ) ){.    int cnt
22280 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f   = 0;.    WIN32_
22290 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
222a0 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
222b0 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
222c0 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
222d0 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
222e0 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f   while( !(rc = o
222f0 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
22300 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a  esExW((LPCWSTR)z
22310 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
22320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22330 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45          GetFileE
22340 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 20 0a  xInfoStandard, .
22350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
22370 74 74 72 44 61 74 61 29 29 20 26 26 20 72 65 74  ttrData)) && ret
22380 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
22390 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20  astErrno) ){}.  
223a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
223b0 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49    /* For an SQLI
223c0 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
223d0 20 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20   query, treat a 
223e0 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65  zero-length file
223f0 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20  .      ** as if 
22400 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  it does not exis
22410 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
22420 20 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d    if(    flags==
22430 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
22440 49 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26  ISTS.          &
22450 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
22460 65 53 69 7a 65 48 69 67 68 3d 3d 30 20 0a 20 20  eSizeHigh==0 .  
22470 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72          && sAttr
22480 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f  Data.nFileSizeLo
22490 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
224a0 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46  attr = INVALID_F
224b0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
224c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
224d0 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74       attr = sAtt
224e0 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
224f0 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a  ibutes;.      }.
22500 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22510 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74 29 3b 0a   logIoerr(cnt);.
22520 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
22530 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno!=ERROR_FILE_
22540 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73  NOT_FOUND && las
22550 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41  tErrno!=ERROR_PA
22560 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
22570 20 20 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72          winLogEr
22580 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
22590 5f 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72  _ACCESS, lastErr
225a0 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c  no, "winAccess",
225b0 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
225c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
225d0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
225e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
225f0 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
22600 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  S;.      }else{.
22610 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49          attr = I
22620 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
22630 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a  IBUTES;.      }.
22640 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
22650 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
22660 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
22670 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
22680 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 28  ileAttributesA((
22690 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
226a0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
226b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
226c0 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74  nverted);.  swit
226d0 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20  ch( flags ){.   
226e0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
226f0 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61  ESS_READ:.    ca
22700 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
22710 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72  _EXISTS:.      r
22720 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49  c = attr!=INVALI
22730 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
22740 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S;.      break;.
22750 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22760 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
22770 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74  :.      rc = att
22780 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
22790 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20 20  ATTRIBUTES &&.  
227a0 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74 72             (attr
227b0 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
227c0 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a  E_READONLY)==0;.
227d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
227e0 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
227f0 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64  assert(!"Invalid
22800 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22   flags argument"
22810 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75  );.  }.  *pResOu
22820 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41 43  t = rc;.  OSTRAC
22830 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d  E(("ACCESS name=
22840 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c 20  %s, pResOut=%p, 
22850 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d  *pResOut=%d, rc=
22860 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
22870 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
22880 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52  me, pResOut, *pR
22890 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72  esOut));.  retur
228a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
228b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e  ./*.** Returns n
228c0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
228d0 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61  pecified path na
228e0 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  me should be use
228f0 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66 0a  d verbatim.  If.
22900 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  ** non-zero is r
22910 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69  eturned from thi
22920 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20  s function, the 
22930 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
22940 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20   must simply.** 
22950 75 73 65 20 74 68 65 20 70 72 6f 76 69 64 65 64  use the provided
22960 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62 61   path name verba
22970 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65  tim -OR- resolve
22980 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20   it into a full 
22990 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69  path name.** usi
229a0 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50 61  ng the GetFullPa
229b0 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50 49  thName Win32 API
229c0 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61 76   function (if av
229d0 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61  ailable)..*/.sta
229e0 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65  tic BOOL winIsVe
229f0 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a  rbatimPathname(.
22a00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
22a10 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a  athname.){.  /*.
22a20 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68    ** If the path
22a30 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74   name starts wit
22a40 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61 73  h a forward slas
22a50 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73 68  h or a backslash
22a60 2c 20 69 74 20 69 73 20 65 69 74 68 65 72 0a 20  , it is either. 
22a70 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43 20   ** a legal UNC 
22a80 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72  name, a volume r
22a90 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72  elative path, or
22aa0 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74   an absolute pat
22ab0 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20 20  h name in the.  
22ac0 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61 74  ** "Unix" format
22ad0 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68   on Windows.  Th
22ae0 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20 77  ere is no easy w
22af0 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69  ay to differenti
22b00 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a  ate between.  **
22b10 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20 63   the final two c
22b20 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65 2c  ases; therefore,
22b30 20 77 65 20 72 65 74 75 72 6e 20 74 68 65 20 73   we return the s
22b40 61 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  afer return valu
22b50 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20 73  e of TRUE.  ** s
22b60 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20 6f  o that callers o
22b70 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
22b80 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65 20  will simply use 
22b90 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a  it verbatim..  *
22ba0 2f 0a 20 20 69 66 20 28 20 7a 50 61 74 68 6e 61  /.  if ( zPathna
22bb0 6d 65 5b 30 5d 3d 3d 27 2f 27 20 7c 7c 20 7a 50  me[0]=='/' || zP
22bc0 61 74 68 6e 61 6d 65 5b 30 5d 3d 3d 27 5c 5c 27  athname[0]=='\\'
22bd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
22be0 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  RUE;.  }..  /*. 
22bf0 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20   ** If the path 
22c00 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68  name starts with
22c10 20 61 20 6c 65 74 74 65 72 20 61 6e 64 20 61 20   a letter and a 
22c20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69 74 68  colon it is eith
22c30 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a  er a volume.  **
22c40 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6f   relative path o
22c50 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  r an absolute pa
22c60 74 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66 20  th.  Callers of 
22c70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
22c80 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 65  st not.  ** atte
22c90 6d 70 74 20 74 6f 20 74 72 65 61 74 20 69 74 20  mpt to treat it 
22ca0 61 73 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  as a relative pa
22cb0 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74 68  th name (i.e. th
22cc0 65 79 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c 79  ey should simply
22cd0 20 75 73 65 0a 20 20 2a 2a 20 69 74 20 76 65 72   use.  ** it ver
22ce0 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69  batim)..  */.  i
22cf0 66 20 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70  f ( sqlite3Isalp
22d00 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29  ha(zPathname[0])
22d10 20 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d   && zPathname[1]
22d20 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 72 65 74  ==':' ){.    ret
22d30 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20  urn TRUE;.  }.. 
22d40 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 67   /*.  ** If we g
22d50 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
22d60 2c 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20  , the path name 
22d70 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65  should almost ce
22d80 72 74 61 69 6e 6c 79 20 62 65 20 61 20 70 75 72  rtainly be a pur
22d90 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76  ely.  ** relativ
22da0 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20  e one (i.e. not 
22db0 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20  a UNC name, not 
22dc0 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f  absolute, and no
22dd0 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76  t volume relativ
22de0 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  e)..  */.  retur
22df0 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  n FALSE;.}../*.*
22e00 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
22e10 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
22e20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
22e30 20 20 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c    Write the full
22e40 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  .** pathname int
22e50 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b  o zOut[].  zOut[
22e60 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61  ] will be at lea
22e70 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  st pVfs->mxPathn
22e80 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20  ame.** bytes in 
22e90 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
22ea0 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e  int winFullPathn
22eb0 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
22ec0 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20  fs *pVfs,       
22ed0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
22ee0 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f  to vfs object */
22ef0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
22f00 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20  Relative,       
22f10 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c   /* Possibly rel
22f20 61 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68  ative input path
22f30 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c   */.  int nFull,
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f50 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f      /* Size of o
22f60 75 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20  utput buffer in 
22f70 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
22f80 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20  *zFull          
22f90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
22fa0 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a  ut buffer */.){.
22fb0 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f    .#if defined(_
22fc0 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d  _CYGWIN__).  Sim
22fd0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
22fe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
22ff0 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  R );.  UNUSED_PA
23000 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a  RAMETER(nFull);.
23010 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e    assert( pVfs->
23020 6d 78 50 61 74 68 6e 61 6d 65 3e 3d 4d 41 58 5f  mxPathname>=MAX_
23030 50 41 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  PATH );.  assert
23040 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d 3e 6d  ( nFull>=pVfs->m
23050 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 69  xPathname );.  i
23060 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61  f ( sqlite3_data
23070 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77  _directory && !w
23080 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68  inIsVerbatimPath
23090 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20  name(zRelative) 
230a0 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
230b0 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65   NOTE: We are de
230c0 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c  aling with a rel
230d0 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
230e0 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20  and the data.   
230f0 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74   **       direct
23100 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74  ory has been set
23110 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73  .  Therefore, us
23120 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69  e it as the basi
23130 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66  s.    **       f
23140 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68  or converting th
23150 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  e relative path 
23160 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c  name to an absol
23170 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ute.    **      
23180 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69   one by prependi
23190 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65  ng the data dire
231a0 63 74 6f 72 79 20 61 6e 64 20 61 20 73 6c 61 73  ctory and a slas
231b0 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68  h..    */.    ch
231c0 61 72 20 7a 4f 75 74 5b 4d 41 58 5f 50 41 54 48  ar zOut[MAX_PATH
231d0 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  +1];.    memset(
231e0 7a 4f 75 74 2c 20 30 2c 20 4d 41 58 5f 50 41 54  zOut, 0, MAX_PAT
231f0 48 2b 31 29 3b 0a 20 20 20 20 63 79 67 77 69 6e  H+1);.    cygwin
23200 5f 63 6f 6e 76 5f 70 61 74 68 28 43 43 50 5f 50  _conv_path(CCP_P
23210 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 7c 43 43  OSIX_TO_WIN_A|CC
23220 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52 65 6c  P_RELATIVE, zRel
23230 61 74 69 76 65 2c 20 7a 4f 75 74 2c 0a 20 20 20  ative, zOut,.   
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23250 20 20 4d 41 58 5f 50 41 54 48 2b 31 29 3b 0a 20    MAX_PATH+1);. 
23260 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
23270 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
23280 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
23290 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c 25 73  , zFull, "%s\\%s
232a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
232b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
232c0 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20  data_directory, 
232d0 7a 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zOut);.  }else{.
232e0 20 20 20 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f      cygwin_conv_
232f0 70 61 74 68 28 43 43 50 5f 50 4f 53 49 58 5f 54  path(CCP_POSIX_T
23300 4f 5f 57 49 4e 5f 41 2c 20 7a 52 65 6c 61 74 69  O_WIN_A, zRelati
23310 76 65 2c 20 7a 46 75 6c 6c 2c 20 6e 46 75 6c 6c  ve, zFull, nFull
23320 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
23330 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
23340 66 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f  f..#if (SQLITE_O
23350 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
23360 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21  E_OS_WINRT) && !
23370 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
23380 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  __).  SimulateIO
23390 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
233a0 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
233b0 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20  /* WinCE has no 
233c0 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c  concept of a rel
233d0 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20  ative pathname, 
233e0 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e  or so I am told.
233f0 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68   */.  /* WinRT h
23400 61 73 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e  as no way to con
23410 76 65 72 74 20 61 20 72 65 6c 61 74 69 76 65 20  vert a relative 
23420 70 61 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c  path to an absol
23430 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66  ute one. */.  if
23440 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
23450 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
23460 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
23470 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
23480 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
23490 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
234a0 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
234b0 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
234c0 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
234d0 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
234e0 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
234f0 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
23500 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
23510 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
23520 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
23530 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
23540 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
23550 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
23560 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
23570 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
23580 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73  tory and a backs
23590 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
235a0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
235b0 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
235c0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
235d0 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c 25 73 22 2c  zFull, "%s\\%s",
235e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
235f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
23600 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 7a 52  ta_directory, zR
23610 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73  elative);.  }els
23620 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  e{.    sqlite3_s
23630 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
23640 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
23650 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
23660 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
23670 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
23680 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23  TE_OK;.#endif..#
23690 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
236a0 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
236b0 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
236c0 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
236d0 20 20 44 57 4f 52 44 20 6e 42 79 74 65 3b 0a 20    DWORD nByte;. 
236e0 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
236f0 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 3b  d;.  char *zOut;
23700 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70  ..  /* If this p
23710 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20  ath name begins 
23720 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72  with "/X:", wher
23730 65 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70  e "X" is any alp
23740 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61  habetic.  ** cha
23750 72 61 63 74 65 72 2c 20 64 69 73 63 61 72 64 20  racter, discard 
23760 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20  the initial "/" 
23770 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d  from the pathnam
23780 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52  e..  */.  if( zR
23790 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20  elative[0]=='/' 
237a0 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68  && sqlite3Isalph
237b0 61 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d 29 20  a(zRelative[1]) 
237c0 26 26 20 7a 52 65 6c 61 74 69 76 65 5b 32 5d 3d  && zRelative[2]=
237d0 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a 52 65 6c  =':' ){.    zRel
237e0 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  ative++;.  }..  
237f0 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
23800 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
23810 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
23820 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
23830 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
23840 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
23850 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
23860 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
23870 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
23880 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
23890 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
238a0 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
238b0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
238c0 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
238d0 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
238e0 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
238f0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
23900 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
23910 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
23920 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
23930 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
23940 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
23950 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
23960 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
23970 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
23980 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
23990 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
239a0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
239b0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
239c0 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
239d0 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
239e0 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
239f0 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
23a00 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
23a10 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
23a20 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
23a30 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
23a40 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
23a50 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
23a60 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62  irectory and a b
23a70 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f  ackslash..    */
23a80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
23a90 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
23aa0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
23ab0 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c  e), zFull, "%s\\
23ac0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
23ad0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23ae0 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
23af0 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
23b00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23b10 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65  OK;.  }.  zConve
23b20 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74  rted = convertUt
23b30 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61  f8Filename(zRela
23b40 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  tive);.  if( zCo
23b50 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
23b60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23b70 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  IOERR_NOMEM;.  }
23b80 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
23b90 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d  .    LPWSTR zTem
23ba0 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f  p;.    nByte = o
23bb0 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  sGetFullPathName
23bc0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
23bd0 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b  erted, 0, 0, 0);
23be0 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
23bf0 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  0 ){.      winLo
23c00 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
23c10 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ROR, osGetLastEr
23c20 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
23c30 20 20 20 20 20 20 20 20 20 22 47 65 74 46 75 6c           "GetFul
23c40 6c 50 61 74 68 4e 61 6d 65 57 31 22 2c 20 7a 43  lPathNameW1", zC
23c50 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
23c60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
23c70 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
23c80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
23c90 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
23ca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74  ;.    }.    nByt
23cb0 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d  e += 3;.    zTem
23cc0 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
23cd0 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a  cZero( nByte*siz
23ce0 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b  eof(zTemp[0]) );
23cf0 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d  .    if( zTemp==
23d00 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
23d10 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
23d20 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ed);.      retur
23d30 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
23d40 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
23d50 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
23d60 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57  lPathNameW((LPCW
23d70 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
23d80 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
23d90 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
23da0 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c  =0 ){.      winL
23db0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45  ogError(SQLITE_E
23dc0 52 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45  RROR, osGetLastE
23dd0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
23de0 20 20 20 20 20 20 20 20 20 20 22 47 65 74 46 75            "GetFu
23df0 6c 6c 50 61 74 68 4e 61 6d 65 57 32 22 2c 20 7a  llPathNameW2", z
23e00 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
23e10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23e20 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
23e30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23e40 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74  Temp);.      ret
23e50 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
23e60 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20  PEN_FULLPATH;.  
23e70 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
23e80 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
23e90 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75 6e 69  ;.    zOut = uni
23ea0 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d 70  codeToUtf8(zTemp
23eb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
23ec0 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a  ree(zTemp);.  }.
23ed0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
23ee0 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
23ef0 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
23f00 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20  Temp;.    nByte 
23f10 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
23f20 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
23f30 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
23f40 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
23f50 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c  =0 ){.      winL
23f60 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45  ogError(SQLITE_E
23f70 52 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45  RROR, osGetLastE
23f80 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
23f90 20 20 20 20 20 20 20 20 20 20 22 47 65 74 46 75            "GetFu
23fa0 6c 6c 50 61 74 68 4e 61 6d 65 41 31 22 2c 20 7a  llPathNameA1", z
23fb0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
23fc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23fd0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
23fe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23ff0 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
24000 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79  H;.    }.    nBy
24010 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65  te += 3;.    zTe
24020 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  mp = sqlite3Mall
24030 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69  ocZero( nByte*si
24040 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29  zeof(zTemp[0]) )
24050 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d  ;.    if( zTemp=
24060 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
24070 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
24080 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
24090 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
240a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
240b0 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
240c0 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
240d0 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  r*)zConverted, n
240e0 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
240f0 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
24100 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  0 ){.      winLo
24110 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
24120 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ROR, osGetLastEr
24130 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
24140 20 20 20 20 20 20 20 20 20 22 47 65 74 46 75 6c           "GetFul
24150 6c 50 61 74 68 4e 61 6d 65 41 32 22 2c 20 7a 43  lPathNameA2", zC
24160 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
24170 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
24180 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
24190 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
241a0 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  emp);.      retu
241b0 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
241c0 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20 20 20  EN_FULLPATH;.   
241d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
241e0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
241f0 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69  .    zOut = sqli
24200 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
24210 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20  o_utf8(zTemp);. 
24220 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24230 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64  zTemp);.  }.#end
24240 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b  if.  if( zOut ){
24250 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
24260 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
24270 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
24280 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c  e), zFull, "%s",
24290 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69   zOut);.    sqli
242a0 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
242b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
242c0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
242d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
242e0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
242f0 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e  }.#endif.}..#ifn
24300 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24310 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
24320 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
24330 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
24340 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
24350 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
24360 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
24370 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
24380 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
24390 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
243a0 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  .*/./*.** Interf
243b0 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
243c0 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
243d0 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
243e0 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
243f0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
24400 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
24410 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
24420 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rary..*/.static 
24430 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28  void *winDlOpen(
24440 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
24450 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  s, const char *z
24460 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e  Filename){.  HAN
24470 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20 2a 7a  DLE h;.  void *z
24480 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
24490 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
244a0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e  zFilename);.  UN
244b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
244c0 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  Vfs);.  if( zCon
244d0 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
244e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
244f0 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23   if( isNT() ){.#
24500 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
24510 52 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61  RT.    h = osLoa
24520 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79  dPackagedLibrary
24530 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
24540 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a  rted, 0);.#else.
24550 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69      h = osLoadLi
24560 62 72 61 72 79 57 28 28 4c 50 43 57 53 54 52 29  braryW((LPCWSTR)
24570 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
24580 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  dif.  }.#ifdef S
24590 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
245a0 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
245b0 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61   h = osLoadLibra
245c0 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  ryA((char*)zConv
245d0 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  erted);.  }.#end
245e0 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  if.  sqlite3_fre
245f0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
24600 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68   return (void*)h
24610 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
24620 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  winDlError(sqlit
24630 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
24640 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
24650 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44  ufOut){.  UNUSED
24660 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
24670 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72 6f 72  ;.  getLastError
24680 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72  Msg(osGetLastErr
24690 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66  or(), nBuf, zBuf
246a0 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Out);.}.static v
246b0 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73  oid (*winDlSym(s
246c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
246d0 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20  ,void *pH,const 
246e0 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69  char *zSym))(voi
246f0 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
24700 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
24710 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28  return (void(*)(
24720 76 6f 69 64 29 29 6f 73 47 65 74 50 72 6f 63 41  void))osGetProcA
24730 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29  ddressA((HANDLE)
24740 70 48 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61  pH, zSym);.}.sta
24750 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c  tic void winDlCl
24760 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
24770 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
24780 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
24790 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
247a0 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79  .  osFreeLibrary
247b0 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65  ((HANDLE)pHandle
247c0 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
247d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
247e0 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
247f0 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
24800 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20  fine winDlOpen  
24810 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
24820 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
24830 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a  ne winDlSym   0.
24840 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43    #define winDlC
24850 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 0a  lose 0.#endif...
24860 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74  /*.** Write up t
24870 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  o nBuf bytes of 
24880 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20  randomness into 
24890 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
248a0 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73  int winRandomnes
248b0 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  s(sqlite3_vfs *p
248c0 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
248d0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 6e  har *zBuf){.  in
248e0 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45  t n = 0;.  UNUSE
248f0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
24900 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
24910 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 6e 20  QLITE_TEST).  n 
24920 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73 65 74  = nBuf;.  memset
24930 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b  (zBuf, 0, nBuf);
24940 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a  .#else.  if( siz
24950 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29 3c  eof(SYSTEMTIME)<
24960 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 53  =nBuf-n ){.    S
24970 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20  YSTEMTIME x;.   
24980 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
24990 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  (&x);.    memcpy
249a0 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c 20 73  (&zBuf[n], &x, s
249b0 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 6e  izeof(x));.    n
249c0 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b 0a 20   += sizeof(x);. 
249d0 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28   }.  if( sizeof(
249e0 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e 20 29  DWORD)<=nBuf-n )
249f0 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64 20  {.    DWORD pid 
24a00 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  = osGetCurrentPr
24a10 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 6d  ocessId();.    m
24a20 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20  emcpy(&zBuf[n], 
24a30 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64  &pid, sizeof(pid
24a40 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
24a50 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a 23 69  eof(pid);.  }.#i
24a60 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
24a70 54 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 55  T.  if( sizeof(U
24a80 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75 66 2d  LONGLONG)<=nBuf-
24a90 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f  n ){.    ULONGLO
24aa0 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69  NG cnt = osGetTi
24ab0 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20  ckCount64();.   
24ac0 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
24ad0 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63  , &cnt, sizeof(c
24ae0 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  nt));.    n += s
24af0 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d 0a  izeof(cnt);.  }.
24b00 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69 7a 65  #else.  if( size
24b10 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d  of(DWORD)<=nBuf-
24b20 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 63  n ){.    DWORD c
24b30 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f  nt = osGetTickCo
24b40 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70  unt();.    memcp
24b50 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74  y(&zBuf[n], &cnt
24b60 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a  , sizeof(cnt));.
24b70 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28      n += sizeof(
24b80 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  cnt);.  }.#endif
24b90 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 41  .  if( sizeof(LA
24ba0 52 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d 6e 42  RGE_INTEGER)<=nB
24bb0 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41 52 47  uf-n ){.    LARG
24bc0 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20 20  E_INTEGER i;.   
24bd0 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61   osQueryPerforma
24be0 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a  nceCounter(&i);.
24bf0 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
24c00 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f 66 28  [n], &i, sizeof(
24c10 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  i));.    n += si
24c20 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23 65 6e  zeof(i);.  }.#en
24c30 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  dif.  return n;.
24c40 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  }.../*.** Sleep 
24c50 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
24c60 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
24c70 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
24c80 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lept..*/.static 
24c90 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c  int winSleep(sql
24ca0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
24cb0 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20  int microsec){. 
24cc0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
24cd0 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39  leep((microsec+9
24ce0 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55  99)/1000);.  UNU
24cf0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
24d00 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  fs);.  return ((
24d10 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30  microsec+999)/10
24d20 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a  00)*1000;.}../*.
24d30 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
24d40 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65   variable, if se
24d50 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  t to a non-zero 
24d60 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70  value, is interp
24d70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  reted as.** the 
24d80 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
24d90 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64  s since 1970 and
24da0 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20   is used to set 
24db0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
24dc0 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e   sqlite3OsCurren
24dd0 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74  tTime() during t
24de0 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  esting..*/.#ifde
24df0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e  f SQLITE_TEST.in
24e00 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
24e10 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20  t_time = 0;  /* 
24e20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65  Fake system time
24e30 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   in seconds sinc
24e40 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69  e 1970. */.#endi
24e50 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  f../*.** Find th
24e60 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
24e70 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
24e80 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
24e90 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   Write into *piN
24ea0 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  ow.** the curren
24eb0 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
24ec0 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
24ed0 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f  number times 86_
24ee0 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20  400_000.  In.** 
24ef0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69  other words, wri
24f00 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74  te into *piNow t
24f10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  he number of mil
24f20 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  liseconds since 
24f30 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70  the Julian.** ep
24f40 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47  och of noon in G
24f50 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65  reenwich on Nove
24f60 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e  mber 24, 4714 B.
24f70 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  C according to t
24f80 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20  he.** proleptic 
24f90 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64  Gregorian calend
24fa0 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63  ar..**.** On suc
24fb0 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  cess, return SQL
24fc0 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20  ITE_OK.  Return 
24fd0 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
24fe0 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74  the time and dat
24ff0 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  e .** cannot be 
25000 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
25010 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54   int winCurrentT
25020 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33  imeInt64(sqlite3
25030 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69  _vfs *pVfs, sqli
25040 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77  te3_int64 *piNow
25050 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45  ){.  /* FILETIME
25060 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20   structure is a 
25070 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70  64-bit value rep
25080 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75  resenting the nu
25090 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20 31 30  mber of .     10
250a0 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74  0-nanosecond int
250b0 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e  ervals since Jan
250c0 75 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20  uary 1, 1601 (= 
250d0 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e 20 0a  JD 2305813.5). .
250e0 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20    */.  FILETIME 
250f0 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  ft;.  static con
25100 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
25110 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63   winFiletimeEpoc
25120 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71  h = 23058135*(sq
25130 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30  lite3_int64)8640
25140 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  000;.#ifdef SQLI
25150 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63  TE_TEST.  static
25160 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
25170 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d  nt64 unixEpoch =
25180 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74   24405875*(sqlit
25190 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30  e3_int64)8640000
251a0 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e  ;.#endif.  /* 2^
251b0 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73  32 - to avoid us
251c0 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e  e of LL and warn
251d0 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20  ings in gcc */. 
251e0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
251f0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33  lite3_int64 max3
25200 32 42 69 74 56 61 6c 75 65 20 3d 20 0a 20 20 20  2BitValue = .   
25210 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
25220 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28  4)2000000000 + (
25230 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
25240 30 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20  00000000 +.     
25250 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
25260 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20  294967296;..#if 
25270 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
25280 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d    SYSTEMTIME tim
25290 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  e;.  osGetSystem
252a0 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f  Time(&time);.  /
252b0 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54  * if SystemTimeT
252c0 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c  oFileTime() fail
252d0 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  s, it returns ze
252e0 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73  ro. */.  if (!os
252f0 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
25300 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29  Time(&time,&ft))
25310 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
25320 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
25330 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74  else.  osGetSyst
25340 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
25350 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a  ( &ft );.#endif.
25360 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46  .  *piNow = winF
25370 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20  iletimeEpoch +. 
25380 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73             ((((s
25390 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
253a0 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a  dwHighDateTime)*
253b0 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b  max32BitValue) +
253c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
253d0 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
253e0 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  ft.dwLowDateTime
253f0 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  )/(sqlite3_int64
25400 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20  )10000;..#ifdef 
25410 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
25420 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
25430 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
25440 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c  iNow = 1000*(sql
25450 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74  ite3_int64)sqlit
25460 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
25470 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d  + unixEpoch;.  }
25480 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44  .#endif.  UNUSED
25490 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
254a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
254b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  E_OK;.}../*.** F
254c0 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
254d0 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
254e0 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
254f0 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
25500 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
25510 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
25520 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
25530 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
25540 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
25550 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
25560 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
25570 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
25580 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
25590 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
255a0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f  e3_vfs *pVfs, do
255b0 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20  uble *prNow){.  
255c0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
255d0 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20  3_int64 i;.  rc 
255e0 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  = winCurrentTime
255f0 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b  Int64(pVfs, &i);
25600 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20  .  if( !rc ){.  
25610 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34    *prNow = i/864
25620 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72  00000.0;.  }.  r
25630 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25640 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74  ** The idea is t
25650 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
25660 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63  n works like a c
25670 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a  ombination of.**
25680 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
25690 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  and FormatMessag
256a0 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28  e() on Windows (
256b0 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20  or errno and.** 
256c0 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20  strerror_r() on 
256d0 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20  Unix). After an 
256e0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
256f0 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75  d by an OS.** fu
25700 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63  nction, SQLite c
25710 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
25720 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69  on with zBuf poi
25730 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75  nting to.** a bu
25740 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74  ffer of nBuf byt
25750 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72  es. The OS layer
25760 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65   should populate
25770 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77   the.** buffer w
25780 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  ith a nul-termin
25790 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64  ated UTF-8 encod
257a0 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ed error message
257b0 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74  .** describing t
257c0 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72  he last IO error
257d0 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65   to have occurre
257e0 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c  d within the cal
257f0 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a  ling.** thread..
25800 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72  **.** If the err
25810 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f  or message is to
25820 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20  o large for the 
25830 73 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c  supplied buffer,
25840 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65  .** it should be
25850 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20   truncated. The 
25860 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
25870 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a  xGetLastError.**
25880 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20   is zero if the 
25890 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69  error message fi
258a0 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  ts in the buffer
258b0 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  , or non-zero.**
258c0 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74   otherwise (if t
258d0 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74  he message was t
258e0 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f  runcated). If no
258f0 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e  n-zero is return
25900 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69  ed,.** then it i
25910 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
25920 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  to include the n
25930 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68  ul-terminator ch
25940 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68  aracter.** in th
25950 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  e output buffer.
25960 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c  .**.** Not suppl
25970 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65  ying an error me
25980 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20  ssage will have 
25990 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63  no adverse effec
259a0 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20  t.** on SQLite. 
259b0 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61  It is fine to ha
259c0 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ve an implementa
259d0 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a  tion that never.
259e0 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72  ** returns an er
259f0 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a  ror message:.**.
25a00 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73  **   int xGetLas
25a10 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
25a20 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
25a30 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
25a40 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a  .**     assert(z
25a50 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a  Buf[0]=='\0');.*
25a60 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  *     return 0;.
25a70 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77  **   }.**.** How
25a80 65 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72  ever if an error
25a90 20 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70   message is supp
25aa0 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65  lied, it will be
25ab0 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a   incorporated.**
25ac0 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20   by sqlite into 
25ad0 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
25ae0 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  e available to t
25af0 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a  he user using.**
25b00 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
25b10 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69  ), possibly maki
25b20 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73  ng IO errors eas
25b30 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f  ier to debug..*/
25b40 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
25b50 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
25b60 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
25b70 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
25b80 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Buf){.  UNUSED_P
25b90 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
25ba0 20 20 72 65 74 75 72 6e 20 67 65 74 4c 61 73 74    return getLast
25bb0 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61  ErrorMsg(osGetLa
25bc0 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c  stError(), nBuf,
25bd0 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zBuf);.}../*.**
25be0 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
25bf0 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  deinitialize the
25c00 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
25c10 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  m interface..*/.
25c20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69  int sqlite3_os_i
25c30 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  nit(void){.  sta
25c40 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
25c50 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 33  winVfs = {.    3
25c60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25c70 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
25c80 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
25c90 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73  nFile),     /* s
25ca0 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 4d  zOsFile */.    M
25cb0 41 58 5f 50 41 54 48 2c 20 20 20 20 20 20 20 20  AX_PATH,        
25cc0 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d      /* mxPathnam
25cd0 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
25ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25cf0 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77   pNext */.    "w
25d00 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20 20  in32",          
25d10 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20     /* zName */. 
25d20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
25d30 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
25d40 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
25d50 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
25d60 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
25d70 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
25d80 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20       /* xDelete 
25d90 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73  */.    winAccess
25da0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
25db0 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
25dc0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
25dd0 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
25de0 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ame */.    winDl
25df0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
25e00 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
25e10 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
25e20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72         /* xDlErr
25e30 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53  or */.    winDlS
25e40 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ym,            /
25e50 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20  * xDlSym */.    
25e60 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20  winDlClose,     
25e70 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
25e80 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
25e90 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20  mness,       /* 
25ea0 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
25eb0 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
25ec0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65          /* xSlee
25ed0 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  p */.    winCurr
25ee0 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a  entTime,      /*
25ef0 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
25f00 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
25f10 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65  rror,     /* xGe
25f20 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
25f30 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
25f40 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65  Int64, /* xCurre
25f50 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20  ntTimeInt64 */. 
25f60 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43     winSetSystemC
25f70 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53  all,    /* xSetS
25f80 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
25f90 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c   winGetSystemCal
25fa0 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73  l,    /* xGetSys
25fb0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
25fc0 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
25fd0 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74  ,   /* xNextSyst
25fe0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 0a  emCall */.  };..
25ff0 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63    /* Double-chec
26000 6b 20 74 68 61 74 20 74 68 65 20 61 53 79 73 63  k that the aSysc
26010 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 20  all[] array has 
26020 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64  been constructed
26030 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e  .  ** correctly.
26040 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62 62    See ticket [bb
26050 33 61 38 36 65 38 39 30 63 38 65 39 36 61 62 5d  3a86e890c8e96ab]
26060 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41 72   */.  assert( Ar
26070 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
26080 29 3d 3d 37 34 20 29 3b 0a 0a 20 20 2f 2a 20 67  )==74 );..  /* g
26090 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c  et memory map al
260a0 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61  location granula
260b0 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  rity */.  memset
260c0 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c  (&winSysInfo, 0,
260d0 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49   sizeof(SYSTEM_I
260e0 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54  NFO));.#if SQLIT
260f0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47  E_OS_WINRT.  osG
26100 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
26110 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b  fo(&winSysInfo);
26120 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79  .#else.  osGetSy
26130 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73  stemInfo(&winSys
26140 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Info);.#endif.  
26150 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e  assert( winSysIn
26160 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
26170 72 61 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b 0a  ranularity>0 );.
26180 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73    assert( winSys
26190 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 3e  Info.dwPageSize>
261a0 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  0 );..  sqlite3_
261b0 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69  vfs_register(&wi
261c0 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72 65 74 75  nVfs, 1);.  retu
261d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d  rn SQLITE_OK; .}
261e0 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  ..int sqlite3_os
261f0 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23 69 66  _end(void){ .#if
26200 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
26210 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 21  .  if( sleepObj!
26220 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43  =NULL ){.    osC
26230 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70  loseHandle(sleep
26240 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f  Obj);.    sleepO
26250 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23  bj = NULL;.  }.#
26260 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
26270 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
26280 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53  dif /* SQLITE_OS
26290 5f 57 49 4e 20 2a 2f 0a                          _WIN */.