/ Hex Artifact Content
Login

Artifact a2f41c9dfb9b065285ba94d4a40a31ca2e2b6ea3:


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 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74  .  int nFetchOut
1360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1370: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
1380: 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20  standing xFetch 
1390: 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 20 20  references */.  
13a0: 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20  HANDLE hMap;    
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13c0: 48 61 6e 64 6c 65 20 66 6f 72 20 61 63 63 65 73  Handle for acces
13d0: 73 69 6e 67 20 6d 65 6d 6f 72 79 20 6d 61 70 70  sing memory mapp
13e0: 69 6e 67 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ing */.  void *p
13f0: 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  MapRegion;      
1400: 20 20 20 20 20 20 2f 2a 20 41 72 65 61 20 6d 65        /* Area me
1410: 6d 6f 72 79 20 6d 61 70 70 65 64 20 2a 2f 0a 20  mory mapped */. 
1420: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1430: 6d 61 70 53 69 7a 65 3b 20 20 20 20 20 20 2f 2a  mapSize;      /*
1440: 20 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20   Usable size of 
1450: 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f  mapped region */
1460: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1470: 20 6d 6d 61 70 4f 72 69 67 73 69 7a 65 3b 20 20   mmapOrigsize;  
1480: 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65 20 6f  /* Actual size o
1490: 66 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  f mapped region 
14a0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
14b0: 36 34 20 6d 6d 61 70 4c 69 6d 69 74 3b 20 20 20  64 mmapLimit;   
14c0: 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20    /* Configured 
14d0: 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54  FCNTL_MMAP_LIMIT
14e0: 20 76 61 6c 75 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   value */.};../*
14f0: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
1500: 65 73 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63  es for winFile.c
1510: 74 72 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  trlFlags.*/.#def
1520: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e  ine WINFILE_RDON
1530: 4c 59 20 20 20 20 20 20 20 20 20 20 30 78 30 32  LY          0x02
1540: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1550: 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f   is read only */
1560: 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45  .#define WINFILE
1570: 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 20 20 20  _PERSIST_WAL    
1580: 20 30 78 30 34 20 20 20 2f 2a 20 50 65 72 73 69   0x04   /* Persi
1590: 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a  stent WAL mode *
15a0: 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c  /.#define WINFIL
15b0: 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 20 20  E_PSOW          
15c0: 20 20 30 78 31 30 20 20 20 2f 2a 20 53 51 4c 49    0x10   /* SQLI
15d0: 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
15e0: 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a  FE_OVERWRITE */.
15f0: 0a 2f 2a 0a 20 2a 20 54 68 65 20 73 69 7a 65 20  ./*. * The size 
1600: 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 75 73  of the buffer us
1610: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77 69  ed by sqlite3_wi
1620: 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28  n32_write_debug(
1630: 29 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ).. */.#ifndef S
1640: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
1650: 42 55 46 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  BUF_SIZE.#  defi
1660: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
1670: 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 20 20 28  DBG_BUF_SIZE   (
1680: 28 69 6e 74 29 28 34 30 39 36 2d 73 69 7a 65 6f  (int)(4096-sizeo
1690: 66 28 44 57 4f 52 44 29 29 29 0a 23 65 6e 64 69  f(DWORD))).#endi
16a0: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c  f../*. * The val
16b0: 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  ue used with sql
16c0: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
16d0: 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70  irectory() to sp
16e0: 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68  ecify that. * th
16f0: 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
1700: 20 73 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67   should be chang
1710: 65 64 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ed.. */.#ifndef 
1720: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
1730: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
1740: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
1750: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
1760: 45 43 54 4f 52 59 5f 54 59 50 45 20 28 31 29 0a  ECTORY_TYPE (1).
1770: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
1780: 65 20 76 61 6c 75 65 20 75 73 65 64 20 77 69 74  e value used wit
1790: 68 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  h sqlite3_win32_
17a0: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20  set_directory() 
17b0: 74 6f 20 73 70 65 63 69 66 79 20 74 68 61 74 0a  to specify that.
17c0: 20 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79   * the temporary
17d0: 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75 6c   directory shoul
17e0: 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a  d be changed.. *
17f0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1800: 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45  _WIN32_TEMP_DIRE
1810: 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64 65  CTORY_TYPE.#  de
1820: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
1830: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
1840: 5f 54 59 50 45 20 28 32 29 0a 23 65 6e 64 69 66  _TYPE (2).#endif
1850: 0a 0a 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69  ../*. * If compi
1860: 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f  led with SQLITE_
1870: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20  WIN32_MALLOC on 
1880: 57 69 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c 6c  Windows, we will
1890: 20 75 73 65 20 74 68 65 0a 20 2a 20 76 61 72 69   use the. * vari
18a0: 6f 75 73 20 57 69 6e 33 32 20 41 50 49 20 68 65  ous Win32 API he
18b0: 61 70 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 73  ap functions ins
18c0: 74 65 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e 2e  tead of our own.
18d0: 0a 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  . */.#ifdef SQLI
18e0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a  TE_WIN32_MALLOC.
18f0: 0a 2f 2a 0a 20 2a 20 49 66 20 74 68 69 73 20 69  ./*. * If this i
1900: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69  s non-zero, an i
1910: 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c  solated heap wil
1920: 6c 20 62 65 20 63 72 65 61 74 65 64 20 62 79 20  l be created by 
1930: 74 68 65 20 6e 61 74 69 76 65 20 57 69 6e 33 32  the native Win32
1940: 0a 20 2a 20 61 6c 6c 6f 63 61 74 6f 72 20 73 75  . * allocator su
1950: 62 73 79 73 74 65 6d 3b 20 6f 74 68 65 72 77 69  bsystem; otherwi
1960: 73 65 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20  se, the default 
1970: 70 72 6f 63 65 73 73 20 68 65 61 70 20 77 69 6c  process heap wil
1980: 6c 20 62 65 20 75 73 65 64 2e 20 20 54 68 69 73  l be used.  This
1990: 0a 20 2a 20 73 65 74 74 69 6e 67 20 68 61 73 20  . * setting has 
19a0: 6e 6f 20 65 66 66 65 63 74 20 77 68 65 6e 20 63  no effect when c
19b0: 6f 6d 70 69 6c 69 6e 67 20 66 6f 72 20 57 69 6e  ompiling for Win
19c0: 52 54 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c  RT.  By default,
19d0: 20 74 68 69 73 20 69 73 20 65 6e 61 62 6c 65 64   this is enabled
19e0: 0a 20 2a 20 61 6e 64 20 61 6e 20 69 73 6f 6c 61  . * and an isola
19f0: 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ted heap will be
1a00: 20 63 72 65 61 74 65 64 20 74 6f 20 73 74 6f 72   created to stor
1a10: 65 20 61 6c 6c 20 61 6c 6c 6f 63 61 74 65 64 20  e all allocated 
1a20: 64 61 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a  data.. *. ******
1a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a70: 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e  ********. * WARN
1a80: 49 4e 47 3a 20 49 74 20 69 73 20 69 6d 70 6f 72  ING: It is impor
1a90: 74 61 6e 74 20 74 6f 20 6e 6f 74 65 20 74 68 61  tant to note tha
1aa0: 74 20 77 68 65 6e 20 74 68 69 73 20 73 65 74 74  t when this sett
1ab0: 69 6e 67 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ing is non-zero 
1ac0: 61 6e 64 20 74 68 65 0a 20 2a 20 20 20 20 20 20  and the. *      
1ad0: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
1ae0: 77 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  wn function is c
1af0: 61 6c 6c 65 64 20 28 65 2e 67 2e 20 62 79 20 74  alled (e.g. by t
1b00: 68 65 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64  he sqlite3_shutd
1b10: 6f 77 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 20  own. *          
1b20: 66 75 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c 20 64  function), all d
1b30: 61 74 61 20 74 68 61 74 20 77 61 73 20 61 6c 6c  ata that was all
1b40: 6f 63 61 74 65 64 20 75 73 69 6e 67 20 74 68 65  ocated using the
1b50: 20 69 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77   isolated heap w
1b60: 69 6c 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 20  ill. *          
1b70: 62 65 20 66 72 65 65 64 20 69 6d 6d 65 64 69 61  be freed immedia
1b80: 74 65 6c 79 20 61 6e 64 20 61 6e 79 20 61 74 74  tely and any att
1b90: 65 6d 70 74 20 74 6f 20 61 63 63 65 73 73 20 61  empt to access a
1ba0: 6e 79 20 6f 66 20 74 68 61 74 20 66 72 65 65 64  ny of that freed
1bb0: 0a 20 2a 20 20 20 20 20 20 20 20 20 20 64 61 74  . *          dat
1bc0: 61 20 77 69 6c 6c 20 61 6c 6d 6f 73 74 20 63 65  a will almost ce
1bd0: 72 74 61 69 6e 6c 79 20 72 65 73 75 6c 74 20 69  rtainly result i
1be0: 6e 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 61  n an immediate a
1bf0: 63 63 65 73 73 20 76 69 6f 6c 61 74 69 6f 6e 2e  ccess violation.
1c00: 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  . **************
1c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
1c60: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43  ITE_WIN32_HEAP_C
1c70: 52 45 41 54 45 0a 23 20 20 64 65 66 69 6e 65 20  REATE.#  define 
1c80: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
1c90: 50 5f 43 52 45 41 54 45 20 20 20 20 28 54 52 55  P_CREATE    (TRU
1ca0: 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  E).#endif../*. *
1cb0: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a   The initial siz
1cc0: 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73  e of the Win32-s
1cd0: 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 54  pecific heap.  T
1ce0: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
1cf0: 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64   zero.. */.#ifnd
1d00: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1d10: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23  HEAP_INIT_SIZE.#
1d20: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
1d30: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
1d40: 53 49 5a 45 20 28 28 53 51 4c 49 54 45 5f 44 45  SIZE ((SQLITE_DE
1d50: 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45  FAULT_CACHE_SIZE
1d60: 29 20 2a 20 5c 0a 20 20 20 20 20 20 20 20 20 20  ) * \.          
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51               (SQ
1d90: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
1da0: 45 5f 53 49 5a 45 29 20 2b 20 34 31 39 34 33 30  E_SIZE) + 419430
1db0: 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  4).#endif../*. *
1dc0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   The maximum siz
1dd0: 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73  e of the Win32-s
1de0: 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 54  pecific heap.  T
1df0: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
1e00: 20 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64   zero.. */.#ifnd
1e10: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
1e20: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20  HEAP_MAX_SIZE.# 
1e30: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
1e40: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
1e50: 5a 45 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a  ZE  (0).#endif..
1e60: 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20  /*. * The extra 
1e70: 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20  flags to use in 
1e80: 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e  calls to the Win
1e90: 33 32 20 68 65 61 70 20 41 50 49 73 2e 20 20 54  32 heap APIs.  T
1ea0: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
1eb0: 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65  . * zero for the
1ec0: 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f   default behavio
1ed0: 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  r.. */.#ifndef S
1ee0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
1ef0: 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65  _FLAGS.#  define
1f00: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
1f10: 41 50 5f 46 4c 41 47 53 20 20 20 20 20 28 30 29  AP_FLAGS     (0)
1f20: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1f30: 68 65 20 77 69 6e 4d 65 6d 44 61 74 61 20 73 74  he winMemData st
1f40: 72 75 63 74 75 72 65 20 73 74 6f 72 65 73 20 69  ructure stores i
1f50: 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75 69  nformation requi
1f60: 72 65 64 20 62 79 20 74 68 65 20 57 69 6e 33 32  red by the Win32
1f70: 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c  -specific.** sql
1f80: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
1f90: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
1fa0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1fb0: 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69  ct winMemData wi
1fc0: 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72 75 63 74  nMemData;.struct
1fd0: 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b 0a 23 69   winMemData {.#i
1fe0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75  fndef NDEBUG.  u
1ff0: 33 32 20 6d 61 67 69 63 3b 20 20 20 20 2f 2a 20  32 magic;    /* 
2000: 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20  Magic number to 
2010: 64 65 74 65 63 74 20 73 74 72 75 63 74 75 72 65  detect structure
2020: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a   corruption. */.
2030: 23 65 6e 64 69 66 0a 20 20 48 41 4e 44 4c 45 20  #endif.  HANDLE 
2040: 68 48 65 61 70 3b 20 2f 2a 20 54 68 65 20 68 61  hHeap; /* The ha
2050: 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68 65 61 70  ndle to our heap
2060: 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e  . */.  BOOL bOwn
2070: 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77  ed;  /* Do we ow
2080: 6e 20 74 68 65 20 68 65 61 70 20 28 69 2e 65 2e  n the heap (i.e.
2090: 20 64 65 73 74 72 6f 79 20 69 74 20 6f 6e 20 73   destroy it on s
20a0: 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a 7d 3b 0a  hutdown)? */.};.
20b0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
20c0: 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d  #define WINMEM_M
20d0: 41 47 49 43 20 20 20 20 20 30 78 34 32 62 32 38  AGIC     0x42b28
20e0: 33 30 62 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  30b.#endif..stat
20f0: 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d  ic struct winMem
2100: 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  Data win_mem_dat
2110: 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44  a = {.#ifndef ND
2120: 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41  EBUG.  WINMEM_MA
2130: 47 49 43 2c 0a 23 65 6e 64 69 66 0a 20 20 4e 55  GIC,.#endif.  NU
2140: 4c 4c 2c 20 46 41 4c 53 45 0a 7d 3b 0a 0a 23 69  LL, FALSE.};..#i
2150: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65  fndef NDEBUG.#de
2160: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
2170: 74 4d 61 67 69 63 28 29 20 61 73 73 65 72 74 28  tMagic() assert(
2180: 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61   win_mem_data.ma
2190: 67 69 63 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49  gic==WINMEM_MAGI
21a0: 43 20 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  C ).#else.#defin
21b0: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
21c0: 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64  gic().#endif..#d
21d0: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48  efine winMemGetH
21e0: 65 61 70 28 29 20 77 69 6e 5f 6d 65 6d 5f 64 61  eap() win_mem_da
21f0: 74 61 2e 68 48 65 61 70 0a 0a 73 74 61 74 69 63  ta.hHeap..static
2200: 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c   void *winMemMal
2210: 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b  loc(int nBytes);
2220: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
2230: 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50  MemFree(void *pP
2240: 72 69 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f  rior);.static vo
2250: 69 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f  id *winMemReallo
2260: 63 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20  c(void *pPrior, 
2270: 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61  int nBytes);.sta
2280: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69  tic int winMemSi
2290: 7a 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61  ze(void *p);.sta
22a0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f  tic int winMemRo
22b0: 75 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74  undup(int n);.st
22c0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49  atic int winMemI
22d0: 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61  nit(void *pAppDa
22e0: 74 61 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  ta);.static void
22f0: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28   winMemShutdown(
2300: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b  void *pAppData);
2310: 0a 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  ..const sqlite3_
2320: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c  mem_methods *sql
2330: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
2340: 76 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  void);.#endif /*
2350: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
2360: 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  LLOC */../*.** T
2370: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
2380: 69 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c  iable is (normal
2390: 6c 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64  ly) set once and
23a0: 20 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a   never changes.*
23b0: 2a 20 74 68 65 72 65 61 66 74 65 72 2e 20 20 49  * thereafter.  I
23c0: 74 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65  t records whethe
23d0: 72 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  r the operating 
23e0: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a  system is Win9x.
23f0: 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a  ** or WinNT..**.
2400: 2a 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 0:   Operatin
2410: 67 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e  g system unknown
2420: 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74  ..** 1:   Operat
2430: 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69  ing system is Wi
2440: 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65  n9x..** 2:   Ope
2450: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
2460: 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e   WinNT..**.** In
2470: 20 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69   order to facili
2480: 74 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20  tate testing on 
2490: 61 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20  a WinNT system, 
24a0: 74 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65  the test fixture
24b0: 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79  .** can manually
24c0: 20 73 65 74 20 74 68 69 73 20 76 61 6c 75 65 20   set this value 
24d0: 74 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20  to 1 to emulate 
24e0: 57 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a  Win98 behavior..
24f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2500: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
2510: 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23  3_os_type = 0;.#
2520: 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20  else.static int 
2530: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
2540: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 0;.#endif..#if
2550: 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23 20 20  ndef SYSCALL.#  
2560: 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c 20 73  define SYSCALL s
2570: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2580: 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  tr.#endif../*.**
2590: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
25a0: 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
25b0: 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6f 72  on Windows CE or
25c0: 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66   WinRT.. */..#if
25d0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
25e0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
25f0: 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20 6f 73  NRT.#  define os
2600: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
2610: 29 20 20 20 20 20 20 20 31 0a 23 65 6e 64 69 66  )       1.#endif
2620: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73  ../*.** Many sys
2630: 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63  tem calls are ac
2640: 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70  cessed through p
2650: 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69  ointer-to-functi
2660: 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ons so that.** t
2670: 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72  hey may be overr
2680: 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65  idden at runtime
2690: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66   to facilitate f
26a0: 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64  ault injection d
26b0: 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67  uring.** testing
26c0: 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e   and sandboxing.
26d0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
26e0: 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20  array holds the 
26f0: 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65  names and pointe
2700: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65  rs.** to all ove
2710: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
2720: 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   calls..*/.stati
2730: 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73 79 73  c struct win_sys
2740: 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63  call {.  const c
2750: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
2760: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2770: 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c  f the system cal
2780: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  l */.  sqlite3_s
2790: 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72  yscall_ptr pCurr
27a0: 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  ent; /* Current 
27b0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73  value of the sys
27c0: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
27d0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
27e0: 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44  r pDefault; /* D
27f0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a  efault value */.
2800: 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b  } aSyscall[] = {
2810: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
2820: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
2830: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41  _OS_WINRT.  { "A
2840: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c  reFileApisANSI",
2850: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
2860: 4c 29 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  L)AreFileApisANS
2870: 49 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  I,         0 },.
2880: 23 65 6c 73 65 0a 20 20 7b 20 22 41 72 65 46 69  #else.  { "AreFi
2890: 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20  leApisANSI",    
28a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
28d0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 41 72  if..#ifndef osAr
28e0: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 0a 23 64  eFileApisANSI.#d
28f0: 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41  efine osAreFileA
2900: 70 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57  pisANSI ((BOOL(W
2910: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
2920: 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65  yscall[0].pCurre
2930: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  nt).#endif..#if 
2940: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
2950: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
2960: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
2970: 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72  ).  { "CharLower
2980: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
2990: 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f   (SYSCALL)CharLo
29a0: 77 65 72 57 2c 20 20 20 20 20 20 20 20 20 20 20  werW,           
29b0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
29c0: 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20  { "CharLowerW", 
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
29e0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
2a00: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
2a10: 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65 72 57  ine osCharLowerW
2a20: 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49   ((LPWSTR(WINAPI
2a30: 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79 73 63  *)(LPWSTR))aSysc
2a40: 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29  all[1].pCurrent)
2a50: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
2a60: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
2a70: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
2a80: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61  S_WIDE).  { "Cha
2a90: 72 55 70 70 65 72 57 22 2c 20 20 20 20 20 20 20  rUpperW",       
2aa0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2ab0: 43 68 61 72 55 70 70 65 72 57 2c 20 20 20 20 20  CharUpperW,     
2ac0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
2ad0: 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 55 70 70  lse.  { "CharUpp
2ae0: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
2af0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
2b20: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72  ..#define osChar
2b30: 55 70 70 65 72 57 20 28 28 4c 50 57 53 54 52 28  UpperW ((LPWSTR(
2b40: 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29  WINAPI*)(LPWSTR)
2b50: 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75  )aSyscall[2].pCu
2b60: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f  rrent)..  { "Clo
2b70: 73 65 48 61 6e 64 6c 65 22 2c 20 20 20 20 20 20  seHandle",      
2b80: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
2b90: 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20 20 20  CloseHandle,    
2ba0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
2bb0: 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61  define osCloseHa
2bc0: 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  ndle ((BOOL(WINA
2bd0: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79  PI*)(HANDLE))aSy
2be0: 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e  scall[3].pCurren
2bf0: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
2c00: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2c10: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43 72 65 61  _ANSI).  { "Crea
2c20: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
2c30: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
2c40: 72 65 61 74 65 46 69 6c 65 41 2c 20 20 20 20 20  reateFileA,     
2c50: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
2c60: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
2c70: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  leA",           
2c80: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
2cb0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
2cc0: 65 46 69 6c 65 41 20 28 28 48 41 4e 44 4c 45 28  eFileA ((HANDLE(
2cd0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c  WINAPI*)(LPCSTR,
2ce0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
2cf0: 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49 54         LPSECURIT
2d00: 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f  Y_ATTRIBUTES,DWO
2d10: 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29  RD,DWORD,HANDLE)
2d20: 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75  )aSyscall[4].pCu
2d30: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
2d40: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
2d50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2d60: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2d70: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57 22   { "CreateFileW"
2d80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
2d90: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
2da0: 65 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eW,             
2db0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
2dc0: 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20  CreateFileW",   
2dd0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
2de0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
2e00: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
2e10: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 20 28   osCreateFileW (
2e20: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
2e30: 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44  (LPCWSTR,DWORD,D
2e40: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
2e50: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
2e60: 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52  BUTES,DWORD,DWOR
2e70: 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  D,HANDLE))aSysca
2e80: 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[5].pCurrent).
2e90: 0a 23 69 66 20 28 21 53 51 4c 49 54 45 5f 4f 53  .#if (!SQLITE_OS
2ea0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
2eb0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
2ec0: 41 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a 20 20  AS_ANSI) && \.  
2ed0: 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28 53        !defined(S
2ee0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 29  QLITE_OMIT_WAL))
2ef0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
2f00: 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20  MappingA",      
2f10: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
2f20: 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20 20 20 20  ileMappingA,    
2f30: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
2f40: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
2f50: 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53  ingA",      (SYS
2f60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
2f80: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
2f90: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d  ne osCreateFileM
2fa0: 61 70 70 69 6e 67 41 20 28 28 48 41 4e 44 4c 45  appingA ((HANDLE
2fb0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
2fc0: 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52  ,LPSECURITY_ATTR
2fd0: 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20  IBUTES, \.      
2fe0: 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57    DWORD,DWORD,DW
2ff0: 4f 52 44 2c 4c 50 43 53 54 52 29 29 61 53 79 73  ORD,LPCSTR))aSys
3000: 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74  call[6].pCurrent
3010: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
3020: 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49  _WINCE || (!SQLI
3030: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
3040: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3050: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26  N32_HAS_WIDE) &&
3060: 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69   \.        !defi
3070: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3080: 57 41 4c 29 29 0a 20 20 7b 20 22 43 72 65 61 74  WAL)).  { "Creat
3090: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20  eFileMappingW", 
30a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
30b0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
30c0: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
30d0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
30e0: 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20  eMappingW",     
30f0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3110: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
3120: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
3130: 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48  FileMappingW ((H
3140: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
3150: 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59  ANDLE,LPSECURITY
3160: 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20  _ATTRIBUTES, \. 
3170: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
3180: 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52  RD,DWORD,LPCWSTR
3190: 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43  ))aSyscall[7].pC
31a0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
31b0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
31c0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
31d0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
31e0: 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78    { "CreateMutex
31f0: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
3200: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75  SYSCALL)CreateMu
3210: 74 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20  texW,           
3220: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3230: 22 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20  "CreateMutexW", 
3240: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3250: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3270: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3280: 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57  e osCreateMutexW
3290: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
32a0: 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54  *)(LPSECURITY_AT
32b0: 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c  TRIBUTES,BOOL, \
32c0: 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52  .        LPCWSTR
32d0: 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43  ))aSyscall[8].pC
32e0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
32f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3300: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
3310: 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20  "DeleteFileA",  
3320: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3330: 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c  ALL)DeleteFileA,
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3350: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c  ,.#else.  { "Del
3360: 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  eteFileA",      
3370: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3380: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3390: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
33a0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
33b0: 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f  DeleteFileA ((BO
33c0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  OL(WINAPI*)(LPCS
33d0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e  TR))aSyscall[9].
33e0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
33f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
3400: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
3410: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c  { "DeleteFileW",
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
3430: 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65  SCALL)DeleteFile
3440: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  W,             0
3450: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44   },.#else.  { "D
3460: 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20  eleteFileW",    
3470: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3480: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
3490: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
34a0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
34b0: 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28  osDeleteFileW ((
34c0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
34d0: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
34e0: 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  10].pCurrent)..#
34f0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
3500: 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  CE.  { "FileTime
3510: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22  ToLocalFileTime"
3520: 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54  , (SYSCALL)FileT
3530: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
3540: 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  me, 0 },.#else. 
3550: 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f   { "FileTimeToLo
3560: 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  calFileTime", (S
3570: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3590: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
35a0: 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54  fine osFileTimeT
35b0: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28  oLocalFileTime (
35c0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43  (BOOL(WINAPI*)(C
35d0: 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20  ONST FILETIME*, 
35e0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
35f0: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  TIME))aSyscall[1
3600: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
3610: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
3620: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  E.  { "FileTimeT
3630: 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  oSystemTime",   
3640: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69   (SYSCALL)FileTi
3650: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20  meToSystemTime, 
3660: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3670: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73  { "FileTimeToSys
3680: 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59  temTime",    (SY
3690: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
36b0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
36c0: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ine osFileTimeTo
36d0: 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f  SystemTime ((BOO
36e0: 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54  L(WINAPI*)(CONST
36f0: 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20   FILETIME*, \.  
3700: 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49        LPSYSTEMTI
3710: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d  ME))aSyscall[12]
3720: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
3730: 22 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72  "FlushFileBuffer
3740: 73 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  s",        (SYSC
3750: 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66  ALL)FlushFileBuf
3760: 66 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d  fers,        0 }
3770: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75  ,..#define osFlu
3780: 73 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28  shFileBuffers ((
3790: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
37a0: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  NDLE))aSyscall[1
37b0: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
37c0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
37d0: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
37e0: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
37f0: 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ageA",          
3800: 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d  (SYSCALL)FormatM
3810: 65 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20  essageA,        
3820: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
3830: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41   "FormatMessageA
3840: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
3850: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
3860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3870: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
3880: 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61  ne osFormatMessa
3890: 67 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  geA ((DWORD(WINA
38a0: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f  PI*)(DWORD,LPCVO
38b0: 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  ID,DWORD,DWORD,L
38c0: 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  PSTR, \.        
38d0: 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29  DWORD,va_list*))
38e0: 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75  aSyscall[14].pCu
38f0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3900: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
3910: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
3920: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c  FormatMessageW",
3930: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3940: 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  LL)FormatMessage
3950: 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  W,          0 },
3960: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d  .#else.  { "Form
3970: 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20  atMessageW",    
3980: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
3990: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
39a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
39b0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
39c0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28  ormatMessageW ((
39d0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44  DWORD(WINAPI*)(D
39e0: 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f  WORD,LPCVOID,DWO
39f0: 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c  RD,DWORD,LPWSTR,
3a00: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
3a10: 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63  ,va_list*))aSysc
3a20: 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74  all[15].pCurrent
3a30: 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  )..#if !defined(
3a40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
3a50: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
3a60: 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20  "FreeLibrary",  
3a70: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3a80: 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79 2c  ALL)FreeLibrary,
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3aa0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72 65  ,.#else.  { "Fre
3ab0: 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20  eLibrary",      
3ac0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3ad0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3ae0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3af0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3b00: 46 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f  FreeLibrary ((BO
3b10: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44  OL(WINAPI*)(HMOD
3b20: 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36  ULE))aSyscall[16
3b30: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3b40: 20 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63   "GetCurrentProc
3b50: 65 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53  essId",     (SYS
3b60: 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50  CALL)GetCurrentP
3b70: 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20  rocessId,     0 
3b80: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
3b90: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
3ba0: 64 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  d ((DWORD(WINAPI
3bb0: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
3bc0: 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[17].pCurrent).
3bd0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
3be0: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
3bf0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3c00: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
3c10: 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c  DiskFreeSpaceA",
3c20: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3c30: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
3c40: 41 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  A,       0 },.#e
3c50: 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b  lse.  { "GetDisk
3c60: 46 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20  FreeSpaceA",    
3c70: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c90: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
3ca0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44  ..#define osGetD
3cb0: 69 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28  iskFreeSpaceA ((
3cc0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
3cd0: 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  CSTR,LPDWORD,LPD
3ce0: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
3cf0: 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29          LPDWORD)
3d00: 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43  )aSyscall[18].pC
3d10: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
3d20: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
3d30: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
3d40: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
3d50: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3d60: 44 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b  DE).  { "GetDisk
3d70: 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20  FreeSpaceW",    
3d80: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44     (SYSCALL)GetD
3d90: 69 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20  iskFreeSpaceW,  
3da0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3db0: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
3dc0: 53 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28  SpaceW",       (
3dd0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3df0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3e00: 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46  efine osGetDiskF
3e10: 72 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c  reeSpaceW ((BOOL
3e20: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
3e30: 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  R,LPDWORD,LPDWOR
3e40: 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20  D,LPDWORD, \.   
3e50: 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53       LPDWORD))aS
3e60: 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72  yscall[19].pCurr
3e70: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3e80: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3e90: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
3ea0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
3eb0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
3ec0: 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  )GetFileAttribut
3ed0: 65 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  esA,      0 },.#
3ee0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
3ef0: 65 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20  eAttributesA",  
3f00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
3f30: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
3f40: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20  FileAttributesA 
3f50: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
3f60: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
3f70: 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[20].pCurrent).
3f80: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
3f90: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
3fa0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
3fb0: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74  S_WIDE).  { "Get
3fc0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22  FileAttributesW"
3fd0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
3fe0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
3ff0: 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sW,      0 },.#e
4000: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
4010: 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20  AttributesW",   
4020: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4040: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
4050: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
4060: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28  ileAttributesW (
4070: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
4080: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
4090: 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[21].pCurrent).
40a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
40b0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
40c0: 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  DE).  { "GetFile
40d0: 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20  AttributesExW", 
40e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
40f0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
4100: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
4110: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
4120: 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28  ibutesExW",    (
4130: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4150: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4160: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41  efine osGetFileA
4170: 74 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42  ttributesExW ((B
4180: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
4190: 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f  WSTR,GET_FILEEX_
41a0: 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20  INFO_LEVELS, \. 
41b0: 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61         LPVOID))a
41c0: 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72  Syscall[22].pCur
41d0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
41e0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
41f0: 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20  "GetFileSize",  
4200: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4210: 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65 2c  ALL)GetFileSize,
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4230: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
4240: 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20  FileSize",      
4250: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4260: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4270: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4280: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4290: 47 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44 57  GetFileSize ((DW
42a0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
42b0: 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53 79  DLE,LPDWORD))aSy
42c0: 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65  scall[23].pCurre
42d0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
42e0: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66  _OS_WINCE && def
42f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4300: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
4310: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
4320: 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  A",        (SYSC
4330: 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e  ALL)GetFullPathN
4340: 61 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20 7d  ameA,        0 }
4350: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
4360: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20  FullPathNameA", 
4370: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4380: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4390: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
43a0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
43b0: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
43c0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
43d0: 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c  )(LPCSTR,DWORD,L
43e0: 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  PSTR, \.        
43f0: 4c 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c  LPSTR*))aSyscall
4400: 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [24].pCurrent)..
4410: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
4420: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
4430: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
4440: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4450: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
4460: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
4470: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
4480: 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  LL)GetFullPathNa
4490: 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  meW,        0 },
44a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
44b0: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20  ullPathNameW",  
44c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
44d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
44e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
44f0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
4500: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20  etFullPathNameW 
4510: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
4520: 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c  (LPCWSTR,DWORD,L
4530: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
4540: 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61   LPWSTR*))aSysca
4550: 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[25].pCurrent)
4560: 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72  ..  { "GetLastEr
4570: 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ror",           
4580: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73   (SYSCALL)GetLas
4590: 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  tError,         
45a0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
45b0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20   osGetLastError 
45c0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
45d0: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
45e0: 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  26].pCurrent)..#
45f0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
4600: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
4610: 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c 49  ENSION).#if SQLI
4620: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
4630: 20 54 68 65 20 47 65 74 50 72 6f 63 41 64 64 72   The GetProcAddr
4640: 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69  essA() routine i
4650: 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
4660: 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e 20   on Windows CE. 
4670: 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41  */.  { "GetProcA
4680: 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20  ddressA",       
4690: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72    (SYSCALL)GetPr
46a0: 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20 20 20  ocAddressA,     
46b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
46c0: 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57 69   /* All other Wi
46d0: 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20  ndows platforms 
46e0: 65 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64  expect GetProcAd
46f0: 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a  dress() to take.
4700: 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74 72    ** an ANSI str
4710: 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ing regardless o
4720: 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73  f the _UNICODE s
4730: 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47  etting */.  { "G
4740: 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c  etProcAddressA",
4750: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4760: 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  L)GetProcAddress
4770: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
4780: 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20 7b  #endif.#else.  {
4790: 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73   "GetProcAddress
47a0: 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  A",         (SYS
47b0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
47d0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
47e0: 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72  ne osGetProcAddr
47f0: 65 73 73 41 20 28 28 46 41 52 50 52 4f 43 28 57  essA ((FARPROC(W
4800: 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 2c  INAPI*)(HMODULE,
4810: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54   \.        LPCST
4820: 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e  R))aSyscall[27].
4830: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4840: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
4850: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e    { "GetSystemIn
4860: 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  fo",           (
4870: 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65  SYSCALL)GetSyste
4880: 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  mInfo,          
4890: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
48a0: 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c  "GetSystemInfo",
48b0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
48c0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
48d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
48e0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
48f0: 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66  e osGetSystemInf
4900: 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  o ((VOID(WINAPI*
4910: 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29  )(LPSYSTEM_INFO)
4920: 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43  )aSyscall[28].pC
4930: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
4940: 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  tSystemTime",   
4950: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4960: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20  )GetSystemTime, 
4970: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
4980: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
4990: 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57  temTime ((VOID(W
49a0: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
49b0: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32  TIME))aSyscall[2
49c0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
49d0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
49e0: 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  CE.  { "GetSyste
49f0: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22  mTimeAsFileTime"
4a00: 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79  , (SYSCALL)GetSy
4a10: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
4a20: 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  me, 0 },.#else. 
4a30: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
4a40: 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  eAsFileTime", (S
4a50: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a70: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4a80: 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d  fine osGetSystem
4a90: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28  TimeAsFileTime (
4aa0: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20  (VOID(WINAPI*)( 
4ab0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
4ac0: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33  TIME))aSyscall[3
4ad0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
4ae0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4af0: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
4b00: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
4b10: 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hA",            
4b20: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
4b30: 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 20  PathA,          
4b40: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4b50: 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c   "GetTempPathA",
4b60: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4b70: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4b90: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4ba0: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
4bb0: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
4bc0: 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29  *)(DWORD,LPSTR))
4bd0: 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75  aSyscall[31].pCu
4be0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4bf0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
4c00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4c10: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4c20: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57   { "GetTempPathW
4c30: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4c40: 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61  YSCALL)GetTempPa
4c50: 74 68 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  thW,            
4c60: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4c70: 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20  GetTempPathW",  
4c80: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4c90: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4cb0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4cc0: 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 20   osGetTempPathW 
4cd0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
4ce0: 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29 61  (DWORD,LPWSTR))a
4cf0: 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75 72  Syscall[32].pCur
4d00: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
4d10: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
4d20: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20  "GetTickCount", 
4d30: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4d40: 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74  ALL)GetTickCount
4d50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
4d60: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
4d70: 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20  TickCount",     
4d80: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4d90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4da0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4db0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4dc0: 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44  GetTickCount ((D
4dd0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f  WORD(WINAPI*)(VO
4de0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d  ID))aSyscall[33]
4df0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4e00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4e10: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
4e20: 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78   { "GetVersionEx
4e30: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  A",           (S
4e40: 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69 6f  YSCALL)GetVersio
4e50: 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20 20 20  nExA,           
4e60: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4e70: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20  GetVersionExA", 
4e80: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4e90: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4eb0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4ec0: 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41   osGetVersionExA
4ed0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4ee0: 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 53  ( \.        LPOS
4ef0: 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53  VERSIONINFOA))aS
4f00: 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72  yscall[34].pCurr
4f10: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 41  ent)..  { "HeapA
4f20: 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20  lloc",          
4f30: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
4f40: 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20  apAlloc,        
4f50: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
4f60: 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63  fine osHeapAlloc
4f70: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
4f80: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
4f90: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
4fa0: 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e  T))aSyscall[35].
4fb0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4fc0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
4fd0: 20 20 7b 20 22 48 65 61 70 43 72 65 61 74 65 22    { "HeapCreate"
4fe0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
4ff0: 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65 61  SYSCALL)HeapCrea
5000: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
5010: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5020: 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20 20  "HeapCreate",   
5030: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5040: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5060: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5070: 65 20 6f 73 48 65 61 70 43 72 65 61 74 65 20 28  e osHeapCreate (
5080: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
5090: 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c  (DWORD,SIZE_T, \
50a0: 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29  .        SIZE_T)
50b0: 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43  )aSyscall[36].pC
50c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
50d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
50e0: 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c  { "HeapDestroy",
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
5100: 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74 72 6f  SCALL)HeapDestro
5110: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  y,             0
5120: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
5130: 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20  eapDestroy",    
5140: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5150: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5160: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5170: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5180: 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20 28 28  osHeapDestroy ((
5190: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
51a0: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33  NDLE))aSyscall[3
51b0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
51c0: 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20 20 20  { "HeapFree",   
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
51e0: 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c 20  SCALL)HeapFree, 
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5200: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48   },..#define osH
5210: 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28 57  eapFree ((BOOL(W
5220: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
5230: 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53 79  WORD,LPVOID))aSy
5240: 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65  scall[38].pCurre
5250: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52 65  nt)..  { "HeapRe
5260: 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20  Alloc",         
5270: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
5280: 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20  pReAlloc,       
5290: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
52a0: 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f  ine osHeapReAllo
52b0: 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  c ((LPVOID(WINAP
52c0: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
52d0: 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20  ,LPVOID, \.     
52e0: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
52f0: 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74  all[39].pCurrent
5300: 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a 65  )..  { "HeapSize
5310: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
5320: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 53    (SYSCALL)HeapS
5330: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
5340: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
5350: 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28 53  e osHeapSize ((S
5360: 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28 48  IZE_T(WINAPI*)(H
5370: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20  ANDLE,DWORD, \. 
5380: 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29         LPCVOID))
5390: 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75  aSyscall[40].pCu
53a0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
53b0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
53c0: 20 22 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c   "HeapValidate",
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
53e0: 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61 74  CALL)HeapValidat
53f0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  e,            0 
5400: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65  },.#else.  { "He
5410: 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20  apValidate",    
5420: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5430: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5440: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5450: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5460: 73 48 65 61 70 56 61 6c 69 64 61 74 65 20 28 28  sHeapValidate ((
5470: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
5480: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  NDLE,DWORD, \.  
5490: 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61        LPCVOID))a
54a0: 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72  Syscall[41].pCur
54b0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
54c0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
54d0: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64 65  HAS_ANSI) && !de
54e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
54f0: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
5500: 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  ).  { "LoadLibra
5510: 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryA",           
5520: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69   (SYSCALL)LoadLi
5530: 62 72 61 72 79 41 2c 20 20 20 20 20 20 20 20 20  braryA,         
5540: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5550: 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22  { "LoadLibraryA"
5560: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
5570: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5590: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
55a0: 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  ine osLoadLibrar
55b0: 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e  yA ((HMODULE(WIN
55c0: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
55d0: 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72  yscall[42].pCurr
55e0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
55f0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
5600: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
5610: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20  32_HAS_WIDE) && 
5620: 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69 6e  \.        !defin
5630: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
5640: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
5650: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57   { "LoadLibraryW
5660: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
5670: 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61  YSCALL)LoadLibra
5680: 72 79 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  ryW,            
5690: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
56a0: 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20  LoadLibraryW",  
56b0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
56c0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
56d0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
56e0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
56f0: 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 20   osLoadLibraryW 
5700: 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49  ((HMODULE(WINAPI
5710: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
5720: 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e  call[43].pCurren
5730: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5740: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f  OS_WINRT.  { "Lo
5750: 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20  calFree",       
5760: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5770: 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20 20  )LocalFree,     
5780: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5790: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61 6c 46  else.  { "LocalF
57a0: 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ree",           
57b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
57e0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63  f..#define osLoc
57f0: 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c 28  alFree ((HLOCAL(
5800: 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c 29  WINAPI*)(HLOCAL)
5810: 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 43  )aSyscall[44].pC
5820: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5830: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
5840: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5850: 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22  T.  { "LockFile"
5860: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5870: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69   (SYSCALL)LockFi
5880: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
5890: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
58a0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20  { "LockFile",   
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
58c0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
58d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
58e0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
58f0: 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23  def osLockFile.#
5900: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c  define osLockFil
5910: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
5920: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
5930: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
5940: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
5950: 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 65  scall[45].pCurre
5960: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  nt).#endif..#if 
5970: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
5980: 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78  .  { "LockFileEx
5990: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
59a0: 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c  (SYSCALL)LockFil
59b0: 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  eEx,            
59c0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
59d0: 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20   "LockFileEx",  
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
59f0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5a10: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
5a20: 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 0a  ef osLockFileEx.
5a30: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69  #define osLockFi
5a40: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
5a50: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
5a60: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  D,DWORD,DWORD,DW
5a70: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
5a80: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
5a90: 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65  scall[46].pCurre
5aa0: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  nt).#endif..#if 
5ab0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
5ac0: 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57  || (!SQLITE_OS_W
5ad0: 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64  INRT && !defined
5ae0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
5af0: 29 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  )).  { "MapViewO
5b00: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
5b10: 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69    (SYSCALL)MapVi
5b20: 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20  ewOfFile,       
5b30: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5b40: 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c   { "MapViewOfFil
5b50: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
5b60: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b80: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5b90: 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66  fine osMapViewOf
5ba0: 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28 57 49  File ((LPVOID(WI
5bb0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
5bc0: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
5bd0: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
5be0: 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e  T))aSyscall[47].
5bf0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5c00: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
5c10: 68 61 72 22 2c 20 20 20 20 20 28 53 59 53 43 41  har",     (SYSCA
5c20: 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f 57 69  LL)MultiByteToWi
5c30: 64 65 43 68 61 72 2c 20 20 20 20 20 30 20 7d 2c  deChar,     0 },
5c40: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74  ..#define osMult
5c50: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 20  iByteToWideChar 
5c60: 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55  ((int(WINAPI*)(U
5c70: 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52  INT,DWORD,LPCSTR
5c80: 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20  ,int,LPWSTR, \. 
5c90: 20 20 20 20 20 20 20 69 6e 74 29 29 61 53 79 73         int))aSys
5ca0: 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e  call[48].pCurren
5cb0: 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79 50 65  t)..  { "QueryPe
5cc0: 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72  rformanceCounter
5cd0: 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 65 72  ", (SYSCALL)Quer
5ce0: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
5cf0: 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69  ter, 0 },..#defi
5d00: 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72  ne osQueryPerfor
5d10: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 28 42  manceCounter ((B
5d20: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OOL(WINAPI*)( \.
5d30: 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f 49 4e          LARGE_IN
5d40: 54 45 47 45 52 2a 29 29 61 53 79 73 63 61 6c 6c  TEGER*))aSyscall
5d50: 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [49].pCurrent)..
5d60: 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22 2c 20    { "ReadFile", 
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
5d80: 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69 6c 65  SYSCALL)ReadFile
5d90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5da0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
5db0: 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c  sReadFile ((BOOL
5dc0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
5dd0: 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50  ,LPVOID,DWORD,LP
5de0: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
5df0: 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61   LPOVERLAPPED))a
5e00: 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72  Syscall[50].pCur
5e10: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74 45  rent)..  { "SetE
5e20: 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ndOfFile",      
5e30: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53        (SYSCALL)S
5e40: 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20  etEndOfFile,    
5e50: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
5e60: 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66  efine osSetEndOf
5e70: 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  File ((BOOL(WINA
5e80: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79  PI*)(HANDLE))aSy
5e90: 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65  scall[51].pCurre
5ea0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5eb0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53  _OS_WINRT.  { "S
5ec0: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20  etFilePointer", 
5ed0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5ee0: 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  L)SetFilePointer
5ef0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
5f00: 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69  #else.  { "SetFi
5f10: 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20  lePointer",     
5f20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5f50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65  if..#define osSe
5f60: 74 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 28 44  tFilePointer ((D
5f70: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
5f80: 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c  NDLE,LONG,PLONG,
5f90: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
5fa0: 29 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e 70  ))aSyscall[52].p
5fb0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
5fc0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
5fd0: 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20   { "Sleep",     
5fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
5ff0: 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20  YSCALL)Sleep,   
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6010: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6020: 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20  Sleep",         
6030: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6040: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6050: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6060: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6070: 20 6f 73 53 6c 65 65 70 20 28 28 56 4f 49 44 28   osSleep ((VOID(
6080: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 29 29  WINAPI*)(DWORD))
6090: 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75  aSyscall[53].pCu
60a0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73  rrent)..  { "Sys
60b0: 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
60c0: 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  e",    (SYSCALL)
60d0: 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
60e0: 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23  Time,    0 },..#
60f0: 64 65 66 69 6e 65 20 6f 73 53 79 73 74 65 6d 54  define osSystemT
6100: 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20 28 28  imeToFileTime ((
6110: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
6120: 4e 53 54 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c  NST SYSTEMTIME*,
6130: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c   \.        LPFIL
6140: 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b  ETIME))aSyscall[
6150: 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  54].pCurrent)..#
6160: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
6170: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
6180: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55 6e 6c  S_WINRT.  { "Unl
6190: 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20  ockFile",       
61a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
61b0: 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20  UnlockFile,     
61c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
61d0: 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  lse.  { "UnlockF
61e0: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
61f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6220: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e 6c 6f  ..#ifndef osUnlo
6230: 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f  ckFile.#define o
6240: 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42 4f  sUnlockFile ((BO
6250: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
6260: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
6270: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
6280: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
6290: 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65  55].pCurrent).#e
62a0: 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
62b0: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
62c0: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20  UnlockFileEx",  
62d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
62e0: 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c  LL)UnlockFileEx,
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6300: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f  .#else.  { "Unlo
6310: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
6320: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6330: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6340: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6350: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55  dif..#define osU
6360: 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f  nlockFileEx ((BO
6370: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
6380: 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  LE,DWORD,DWORD,D
6390: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
63a0: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
63b0: 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72  yscall[56].pCurr
63c0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
63d0: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21 64 65  _OS_WINCE || !de
63e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
63f0: 54 5f 57 41 4c 29 0a 20 20 7b 20 22 55 6e 6d 61  T_WAL).  { "Unma
6400: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
6410: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
6420: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20  nmapViewOfFile, 
6430: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6440: 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65  se.  { "UnmapVie
6450: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
6460: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6480: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6490: 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70  .#define osUnmap
64a0: 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f  ViewOfFile ((BOO
64b0: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f  L(WINAPI*)(LPCVO
64c0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d  ID))aSyscall[57]
64d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
64e0: 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  "WideCharToMulti
64f0: 42 79 74 65 22 2c 20 20 20 20 20 28 53 59 53 43  Byte",     (SYSC
6500: 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d 75  ALL)WideCharToMu
6510: 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30 20 7d  ltiByte,     0 }
6520: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69 64  ,..#define osWid
6530: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
6540: 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28   ((int(WINAPI*)(
6550: 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53  UINT,DWORD,LPCWS
6560: 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74  TR,int,LPSTR,int
6570: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53  , \.        LPCS
6580: 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63  TR,LPBOOL))aSysc
6590: 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74  all[58].pCurrent
65a0: 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69 6c  )..  { "WriteFil
65b0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
65c0: 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74 65    (SYSCALL)Write
65d0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
65e0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
65f0: 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28 28  e osWriteFile ((
6600: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6610: 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f  NDLE,LPCVOID,DWO
6620: 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20  RD,LPDWORD, \.  
6630: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50        LPOVERLAPP
6640: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d  ED))aSyscall[59]
6650: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6660: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6670: 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74    { "CreateEvent
6680: 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 28  ExW",          (
6690: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 45 76  SYSCALL)CreateEv
66a0: 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20 20 20  entExW,         
66b0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
66c0: 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 22  "CreateEventExW"
66d0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
66e0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6700: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6710: 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45  e osCreateEventE
6720: 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  xW ((HANDLE(WINA
6730: 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f  PI*)(LPSECURITY_
6740: 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43 57 53  ATTRIBUTES,LPCWS
6750: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  TR, \.        DW
6760: 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63  ORD,DWORD))aSysc
6770: 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e 74  all[60].pCurrent
6780: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
6790: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69  S_WINRT.  { "Wai
67a0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
67b0: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
67c0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
67d0: 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65  ect,     0 },.#e
67e0: 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  lse.  { "WaitFor
67f0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20  SingleObject",  
6800: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6820: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6830: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74  ..#define osWait
6840: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 20  ForSingleObject 
6850: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
6860: 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20  (HANDLE, \.     
6870: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
6880: 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[61].pCurrent)
6890: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
68a0: 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69 74 46  WINRT.  { "WaitF
68b0: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
68c0: 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61  ",   (SYSCALL)Wa
68d0: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
68e0: 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73  tEx,   0 },.#els
68f0: 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69  e.  { "WaitForSi
6900: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20  ngleObjectEx",  
6910: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6930: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6940: 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f  #define osWaitFo
6950: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 20  rSingleObjectEx 
6960: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
6970: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
6980: 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29 29 61  .        BOOL))a
6990: 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72  Syscall[62].pCur
69a0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
69b0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
69c0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
69d0: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
69e0: 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  LL)SetFilePointe
69f0: 72 45 78 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  rEx,        0 },
6a00: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46  .#else.  { "SetF
6a10: 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20  ilePointerEx",  
6a20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6a30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6a40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6a50: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53  dif..#define osS
6a60: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 20  etFilePointerEx 
6a70: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6a80: 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e 54  HANDLE,LARGE_INT
6a90: 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  EGER, \.        
6aa0: 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 44  PLARGE_INTEGER,D
6ab0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  WORD))aSyscall[6
6ac0: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
6ad0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
6ae0: 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e  T.  { "GetFileIn
6af0: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
6b00: 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 47  eEx", (SYSCALL)G
6b10: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
6b20: 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30 20 7d  nByHandleEx, 0 }
6b30: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
6b40: 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
6b50: 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59 53  yHandleEx", (SYS
6b60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6b70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6b80: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6b90: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
6ba0: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28 28 42  onByHandleEx ((B
6bb0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
6bc0: 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 46  DLE, \.        F
6bd0: 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e 44  ILE_INFO_BY_HAND
6be0: 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44 2c  LE_CLASS,LPVOID,
6bf0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
6c00: 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  64].pCurrent)..#
6c10: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
6c20: 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  RT && !defined(S
6c30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 0a  QLITE_OMIT_WAL).
6c40: 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69    { "MapViewOfFi
6c50: 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28  leFromApp",    (
6c60: 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f  SYSCALL)MapViewO
6c70: 66 46 69 6c 65 46 72 6f 6d 41 70 70 2c 20 20 20  fFileFromApp,   
6c80: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6c90: 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  "MapViewOfFileFr
6ca0: 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53 43  omApp",    (SYSC
6cb0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6cd0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6ce0: 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  e osMapViewOfFil
6cf0: 65 46 72 6f 6d 41 70 70 20 28 28 4c 50 56 4f 49  eFromApp ((LPVOI
6d00: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
6d10: 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c  E,ULONG,ULONG64,
6d20: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
6d30: 54 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e  T))aSyscall[65].
6d40: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
6d50: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6d60: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32 22   { "CreateFile2"
6d70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
6d80: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
6d90: 65 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e2,             
6da0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6db0: 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20  CreateFile2",   
6dc0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6dd0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6df0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6e00: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32 20 28   osCreateFile2 (
6e10: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
6e20: 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44  (LPCWSTR,DWORD,D
6e30: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
6e40: 20 20 20 20 20 20 4c 50 43 52 45 41 54 45 46 49        LPCREATEFI
6e50: 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52  LE2_EXTENDED_PAR
6e60: 41 4d 45 54 45 52 53 29 29 61 53 79 73 63 61 6c  AMETERS))aSyscal
6e70: 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[66].pCurrent).
6e80: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
6e90: 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64  INRT && !defined
6ea0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41  (SQLITE_OMIT_LOA
6eb0: 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b  D_EXTENSION).  {
6ec0: 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69   "LoadPackagedLi
6ed0: 62 72 61 72 79 22 2c 20 20 20 20 20 28 53 59 53  brary",     (SYS
6ee0: 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65  CALL)LoadPackage
6ef0: 64 4c 69 62 72 61 72 79 2c 20 20 20 20 20 30 20  dLibrary,     0 
6f00: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f  },.#else.  { "Lo
6f10: 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72  adPackagedLibrar
6f20: 79 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  y",     (SYSCALL
6f30: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6f40: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6f50: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6f60: 73 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62  sLoadPackagedLib
6f70: 72 61 72 79 20 28 28 48 4d 4f 44 55 4c 45 28 57  rary ((HMODULE(W
6f80: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
6f90: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
6fa0: 29 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70  ))aSyscall[67].p
6fb0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
6fc0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6fd0: 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36  { "GetTickCount6
6fe0: 34 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  4",          (SY
6ff0: 53 43 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75  SCALL)GetTickCou
7000: 6e 74 36 34 2c 20 20 20 20 20 20 20 20 20 20 30  nt64,          0
7010: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
7020: 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20  etTickCount64", 
7030: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7040: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7050: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7060: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7070: 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34  osGetTickCount64
7080: 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e   ((ULONGLONG(WIN
7090: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
70a0: 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65 6e  call[68].pCurren
70b0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
70c0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
70d0: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
70e0: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
70f0: 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
7100: 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65  nfo,     0 },.#e
7110: 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e 61 74 69  lse.  { "GetNati
7120: 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20  veSystemInfo",  
7130: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7150: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7160: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4e  ..#define osGetN
7170: 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 20  ativeSystemInfo 
7180: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
7190: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53   \.        LPSYS
71a0: 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61  TEM_INFO))aSysca
71b0: 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[69].pCurrent)
71c0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
71d0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
71e0: 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74 70 75 74  NSI).  { "Output
71f0: 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20  DebugStringA",  
7200: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74      (SYSCALL)Out
7210: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 2c  putDebugStringA,
7220: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7230: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75  .  { "OutputDebu
7240: 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20 20  gStringA",      
7250: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7270: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7280: 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44  define osOutputD
7290: 65 62 75 67 53 74 72 69 6e 67 41 20 28 28 56 4f  ebugStringA ((VO
72a0: 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  ID(WINAPI*)(LPCS
72b0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d  TR))aSyscall[70]
72c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
72d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
72e0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
72f0: 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53   { "OutputDebugS
7300: 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53  tringW",      (S
7310: 59 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62  YSCALL)OutputDeb
7320: 75 67 53 74 72 69 6e 67 57 2c 20 20 20 20 20 20  ugStringW,      
7330: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7340: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
7350: 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gW",      (SYSCA
7360: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7370: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7380: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7390: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
73a0: 72 69 6e 67 57 20 28 28 56 4f 49 44 28 57 49 4e  ringW ((VOID(WIN
73b0: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
73c0: 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72  Syscall[71].pCur
73d0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 50  rent)..  { "GetP
73e0: 72 6f 63 65 73 73 48 65 61 70 22 2c 20 20 20 20  rocessHeap",    
73f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
7400: 65 74 50 72 6f 63 65 73 73 48 65 61 70 2c 20 20  etProcessHeap,  
7410: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
7420: 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 65  efine osGetProce
7430: 73 73 48 65 61 70 20 28 28 48 41 4e 44 4c 45 28  ssHeap ((HANDLE(
7440: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
7450: 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75 72  Syscall[72].pCur
7460: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
7470: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
7480: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7490: 49 54 5f 57 41 4c 29 0a 20 20 7b 20 22 43 72 65  IT_WAL).  { "Cre
74a0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
74b0: 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c  omApp", (SYSCALL
74c0: 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  )CreateFileMappi
74d0: 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c 0a  ngFromApp, 0 },.
74e0: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
74f0: 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
7500: 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  App", (SYSCALL)0
7510: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7520: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7530: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
7540: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
7550: 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c 45 28  romApp ((HANDLE(
7560: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
7570: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43   \.        LPSEC
7580: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
7590: 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 4c  ,ULONG,ULONG64,L
75a0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
75b0: 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [73].pCurrent)..
75c0: 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  }; /* End of the
75d0: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
75e0: 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f  stem calls */../
75f0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
7600: 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28   xSetSystemCall(
7610: 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69  ) method of sqli
7620: 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20  te3_vfs for all 
7630: 6f 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32  of the.** "win32
7640: 22 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e  " VFSes.  Return
7650: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20   SQLITE_OK opon 
7660: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64  successfully upd
7670: 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73  ating the.** sys
7680: 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72  tem call pointer
7690: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46  , or SQLITE_NOTF
76a0: 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73  OUND if there is
76b0: 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65   no configurable
76c0: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
76d0: 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a  named zName..*/.
76e0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65  static int winSe
76f0: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
7700: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
7710: 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20  Used,        /* 
7720: 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e  The VFS pointer.
7730: 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20    Not used */.  
7740: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
7750: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
7760: 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20   Name of system 
7770: 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65  call to override
7780: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
7790: 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75  scall_ptr pNewFu
77a0: 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  nc  /* Pointer t
77b0: 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c  o new system cal
77c0: 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20  l value */.){.  
77d0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
77e0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
77f0: 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55  E_NOTFOUND;..  U
7800: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
7810: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  pNotUsed);.  if(
7820: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
7830: 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20   /* If no zName 
7840: 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72  is given, restor
7850: 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c  e all system cal
7860: 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61  ls to their defa
7870: 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69  ult.    ** setti
7880: 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ngs and return N
7890: 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ULL.    */.    r
78a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
78b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
78c0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
78d0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
78e0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
78f0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
7900: 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  pDefault ){.    
7910: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
7920: 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63  pCurrent = aSysc
7930: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
7940: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7950: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
7960: 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69  f zName is speci
7970: 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e  fied, operate on
7980: 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79   only the one sy
7990: 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  stem call.    **
79a0: 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20   specified..    
79b0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
79c0: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
79d0: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
79e0: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
79f0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
7a00: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
7a10: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
7a20: 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63         if( aSysc
7a30: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d  all[i].pDefault=
7a40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7a50: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
7a60: 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  ault = aSyscall[
7a70: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20  i].pCurrent;.   
7a80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
7a90: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
7aa0: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46         if( pNewF
7ab0: 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e  unc==0 ) pNewFun
7ac0: 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  c = aSyscall[i].
7ad0: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
7ae0: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
7af0: 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e  urrent = pNewFun
7b00: 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
7b10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7b20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
7b40: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
7b50: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65  system call.  Re
7b60: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61  turn NULL if zNa
7b70: 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72  me is not a.** r
7b80: 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d  ecognized system
7b90: 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c   call name.  NUL
7ba0: 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  L is also return
7bb0: 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d  ed if the system
7bc0: 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72   call.** is curr
7bd0: 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e  ently undefined.
7be0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
7bf0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77  e3_syscall_ptr w
7c00: 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  inGetSystemCall(
7c10: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
7c20: 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73  pNotUsed,.  cons
7c30: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
7c40: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
7c50: 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  i;..  UNUSED_PAR
7c60: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
7c70: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
7c80: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
7c90: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
7ca0: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
7cb0: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
7cc0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
7cd0: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
7ce0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
7cf0: 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rent;.  }.  retu
7d00: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
7d10: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
7d20: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
7d30: 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e  em call after zN
7d40: 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d  ame.  If zName==
7d50: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  NULL.** then ret
7d60: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
7d70: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
7d80: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
7d90: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20  ULL if zName.** 
7da0: 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74  is the last syst
7db0: 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e  em call or if zN
7dc0: 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e  ame is not the n
7dd0: 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a  ame of a valid.*
7de0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a  * system call..*
7df0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
7e00: 68 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74  har *winNextSyst
7e10: 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76  emCall(sqlite3_v
7e20: 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  fs *p, const cha
7e30: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
7e40: 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53   i = -1;..  UNUS
7e50: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
7e60: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
7e70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
7e80: 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
7e90: 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l)-1; i++){.    
7ea0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
7eb0: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
7ec0: 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  zName)==0 ) brea
7ed0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  k;.    }.  }.  f
7ee0: 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53  or(i++; i<ArrayS
7ef0: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69  ize(aSyscall); i
7f00: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79  ++){.    if( aSy
7f10: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
7f20: 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  t!=0 ) return aS
7f30: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b  yscall[i].zName;
7f40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
7f50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
7f60: 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20  unction outputs 
7f70: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 28 41  the specified (A
7f80: 4e 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74  NSI) string to t
7f90: 68 65 20 57 69 6e 33 32 20 64 65 62 75 67 67 65  he Win32 debugge
7fa0: 72 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62  r.** (if availab
7fb0: 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71  le)..*/..void sq
7fc0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74  lite3_win32_writ
7fd0: 65 5f 64 65 62 75 67 28 63 6f 6e 73 74 20 63 68  e_debug(const ch
7fe0: 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42  ar *zBuf, int nB
7ff0: 75 66 29 7b 0a 20 20 63 68 61 72 20 7a 44 62 67  uf){.  char zDbg
8000: 42 75 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32  Buf[SQLITE_WIN32
8010: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a  _DBG_BUF_SIZE];.
8020: 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e    int nMin = MIN
8030: 28 6e 42 75 66 2c 20 28 53 51 4c 49 54 45 5f 57  (nBuf, (SQLITE_W
8040: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
8050: 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79 20  E - 1)); /* may 
8060: 62 65 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f 0a  be negative. */.
8070: 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29 20    if( nMin<-1 ) 
8080: 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61 6c  nMin = -1; /* al
8090: 6c 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  l negative value
80a0: 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f 0a  s become -1. */.
80b0: 20 20 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d 3d    assert( nMin==
80c0: 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c 7c  -1 || nMin==0 ||
80d0: 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49 4e   nMin<SQLITE_WIN
80e0: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20  32_DBG_BUF_SIZE 
80f0: 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
8100: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
8110: 41 4e 53 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e  ANSI).  if( nMin
8120: 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  >0 ){.    memset
8130: 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c  (zDbgBuf, 0, SQL
8140: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
8150: 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d  F_SIZE);.    mem
8160: 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75  cpy(zDbgBuf, zBu
8170: 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73  f, nMin);.    os
8180: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8190: 67 41 28 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d  gA(zDbgBuf);.  }
81a0: 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70  else{.    osOutp
81b0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a  utDebugStringA(z
81c0: 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20  Buf);.  }.#elif 
81d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
81e0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
81f0: 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c   memset(zDbgBuf,
8200: 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   0, SQLITE_WIN32
8210: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a  _DBG_BUF_SIZE);.
8220: 20 20 69 66 20 28 20 6f 73 4d 75 6c 74 69 42 79    if ( osMultiBy
8230: 74 65 54 6f 57 69 64 65 43 68 61 72 28 0a 20 20  teToWideChar(.  
8240: 20 20 20 20 20 20 20 20 6f 73 41 72 65 46 69 6c          osAreFil
8250: 65 41 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50  eApisANSI() ? CP
8260: 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c  _ACP : CP_OEMCP,
8270: 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20   0, zBuf,.      
8280: 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54      nMin, (LPWST
8290: 52 29 7a 44 62 67 42 75 66 2c 20 53 51 4c 49 54  R)zDbgBuf, SQLIT
82a0: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
82b0: 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48 41  SIZE/sizeof(WCHA
82c0: 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65  R))<=0 ){.    re
82d0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75  turn;.  }.  osOu
82e0: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57  tputDebugStringW
82f0: 28 28 4c 50 43 57 53 54 52 29 7a 44 62 67 42 75  ((LPCWSTR)zDbgBu
8300: 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  f);.#else.  if( 
8310: 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65  nMin>0 ){.    me
8320: 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c  mset(zDbgBuf, 0,
8330: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
8340: 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20  G_BUF_SIZE);.   
8350: 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c   memcpy(zDbgBuf,
8360: 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20   zBuf, nMin);.  
8370: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
8380: 2c 20 22 25 73 22 2c 20 7a 44 62 67 42 75 66 29  , "%s", zDbgBuf)
8390: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
83a0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
83b0: 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a  %s", zBuf);.  }.
83c0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
83d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
83e0: 75 74 69 6e 65 20 73 75 73 70 65 6e 64 73 20 74  utine suspends t
83f0: 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
8400: 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6d  d for at least m
8410: 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  s.** millisecond
8420: 73 2e 20 20 54 68 69 73 20 69 73 20 65 71 75 69  s.  This is equi
8430: 76 61 6c 65 6e 74 20 74 6f 20 74 68 65 20 57 69  valent to the Wi
8440: 6e 33 32 20 53 6c 65 65 70 28 29 20 69 6e 74 65  n32 Sleep() inte
8450: 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51  rface..*/.#if SQ
8460: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74  LITE_OS_WINRT.st
8470: 61 74 69 63 20 48 41 4e 44 4c 45 20 73 6c 65 65  atic HANDLE slee
8480: 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e  pObj = NULL;.#en
8490: 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65  dif..void sqlite
84a0: 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 44 57  3_win32_sleep(DW
84b0: 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  ORD milliseconds
84c0: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
84d0: 5f 57 49 4e 52 54 0a 20 20 69 66 20 28 20 73 6c  _WINRT.  if ( sl
84e0: 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a  eepObj==NULL ){.
84f0: 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f      sleepObj = o
8500: 73 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 28  sCreateEventExW(
8510: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41  NULL, NULL, CREA
8520: 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f  TE_EVENT_MANUAL_
8530: 52 45 53 45 54 2c 0a 20 20 20 20 20 20 20 20 20  RESET,.         
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 20 20 20 20 20 20 20 53 59 4e 43 48 52 4f 4e 49         SYNCHRONI
8560: 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ZE);.  }.  asser
8570: 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c  t( sleepObj!=NUL
8580: 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72  L );.  osWaitFor
8590: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 73  SingleObjectEx(s
85a0: 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65  leepObj, millise
85b0: 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23  conds, FALSE);.#
85c0: 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d  else.  osSleep(m
85d0: 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65  illiseconds);.#e
85e0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
85f0: 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a  turn true (non-z
8600: 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20 72  ero) if we are r
8610: 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e  unning under Win
8620: 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50  NT, Win2K, WinXP
8630: 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20  ,.** or WinCE.  
8640: 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65  Return false (ze
8650: 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57  ro) for Win95, W
8660: 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a  in98, or WinME..
8670: 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e  **.** Here is an
8680: 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73   interesting obs
8690: 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35  ervation:  Win95
86a0: 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e  , Win98, and Win
86b0: 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c  ME lack.** the L
86c0: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e  ockFileEx() API.
86d0: 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74 69    But we can sti
86e0: 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69  ll statically li
86f0: 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a  nk against that.
8700: 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61  ** API as long a
8710: 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20  s we don't call 
8720: 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20  it when running 
8730: 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20  Win95/98/ME.  A 
8740: 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20  call to.** this 
8750: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
8760: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
8770: 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39  the host is Win9
8780: 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69  5/98/ME or.** Wi
8790: 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61  nNT/2K/XP so tha
87a0: 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  t we will know w
87b0: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65  hether or not we
87c0: 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c   can safely call
87d0: 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  .** the LockFile
87e0: 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66  Ex() API..*/.#if
87f0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
8800: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
8810: 4e 52 54 0a 23 20 64 65 66 69 6e 65 20 69 73 4e  NRT.# define isN
8820: 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 21  T()  (1).#elif !
8830: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
8840: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23  IN32_HAS_WIDE).#
8850: 20 64 65 66 69 6e 65 20 69 73 4e 54 28 29 20 20   define isNT()  
8860: 28 30 29 0a 23 65 6c 73 65 0a 20 20 73 74 61 74  (0).#else.  stat
8870: 69 63 20 69 6e 74 20 69 73 4e 54 28 76 6f 69 64  ic int isNT(void
8880: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
8890: 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 30 20 29 7b  e3_os_type==0 ){
88a0: 0a 20 20 20 20 20 20 4f 53 56 45 52 53 49 4f 4e  .      OSVERSION
88b0: 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20  INFOA sInfo;.   
88c0: 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72     sInfo.dwOSVer
88d0: 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73  sionInfoSize = s
88e0: 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20  izeof(sInfo);.  
88f0: 20 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e      osGetVersion
8900: 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20  ExA(&sInfo);.   
8910: 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79     sqlite3_os_ty
8920: 70 65 20 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61  pe = sInfo.dwPla
8930: 74 66 6f 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41  tformId==VER_PLA
8940: 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f  TFORM_WIN32_NT ?
8950: 20 32 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20   2 : 1;.    }.  
8960: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
8970: 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b 0a 20 20 7d  _os_type==2;.  }
8980: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
8990: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
89a0: 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  LOC./*.** Alloca
89b0: 74 65 20 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d  te nBytes of mem
89c0: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ory..*/.static v
89d0: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
89e0: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20  c(int nBytes){. 
89f0: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20   HANDLE hHeap;. 
8a00: 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e   void *p;..  win
8a10: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
8a20: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
8a30: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
8a40: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
8a50: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
8a60: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
8a70: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
8a80: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
8a90: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
8aa0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
8ab0: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
8ac0: 72 74 20 28 20 6f 73 48 65 61 70 56 61 6c 69 64  rt ( osHeapValid
8ad0: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
8ae0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
8af0: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
8b00: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42  dif.  assert( nB
8b10: 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d  ytes>=0 );.  p =
8b20: 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65   osHeapAlloc(hHe
8b30: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
8b40: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49  _HEAP_FLAGS, (SI
8b50: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
8b60: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71  if( !p ){.    sq
8b70: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
8b80: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
8b90: 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20  to HeapAlloc %u 
8ba0: 62 79 74 65 73 20 28 25 64 29 2c 20 68 65 61 70  bytes (%d), heap
8bb0: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
8bc0: 20 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f 73        nBytes, os
8bd0: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
8be0: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
8bf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
8c00: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d  ../*.** Free mem
8c10: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ory..*/.static v
8c20: 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76  oid winMemFree(v
8c30: 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20  oid *pPrior){.  
8c40: 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20  HANDLE hHeap;.. 
8c50: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
8c60: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
8c70: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
8c80: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
8c90: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
8ca0: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
8cb0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
8cc0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
8cd0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
8ce0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
8cf0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
8d00: 61 73 73 65 72 74 20 28 20 6f 73 48 65 61 70 56  assert ( osHeapV
8d10: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
8d20: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
8d30: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20  _FLAGS, pPrior) 
8d40: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
8d50: 21 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e  !pPrior ) return
8d60: 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c  ; /* Passing NUL
8d70: 4c 20 74 6f 20 48 65 61 70 46 72 65 65 20 69 73  L to HeapFree is
8d80: 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20   undefined. */. 
8d90: 20 69 66 28 20 21 6f 73 48 65 61 70 46 72 65 65   if( !osHeapFree
8da0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
8db0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
8dc0: 20 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20   pPrior) ){.    
8dd0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
8de0: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
8df0: 64 20 74 6f 20 48 65 61 70 46 72 65 65 20 62 6c  d to HeapFree bl
8e00: 6f 63 6b 20 25 70 20 28 25 64 29 2c 20 68 65 61  ock %p (%d), hea
8e10: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
8e20: 20 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20 6f         pPrior, o
8e30: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
8e40: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
8e50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61    }.}../*.** Cha
8e60: 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  nge the size of 
8e70: 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f  an existing memo
8e80: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ry allocation.*/
8e90: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
8ea0: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64  nMemRealloc(void
8eb0: 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42   *pPrior, int nB
8ec0: 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20  ytes){.  HANDLE 
8ed0: 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70  hHeap;.  void *p
8ee0: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
8ef0: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
8f00: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
8f10: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
8f20: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
8f30: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
8f40: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
8f50: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
8f60: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
8f70: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
8f80: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
8f90: 29 0a 20 20 61 73 73 65 72 74 20 28 20 6f 73 48  ).  assert ( osH
8fa0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
8fb0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
8fc0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
8fd0: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
8fe0: 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d  assert( nBytes>=
8ff0: 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72 69  0 );.  if( !pPri
9000: 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73  or ){.    p = os
9010: 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c  HeapAlloc(hHeap,
9020: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
9030: 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f  AP_FLAGS, (SIZE_
9040: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c  T)nBytes);.  }el
9050: 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65  se{.    p = osHe
9060: 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c  apReAlloc(hHeap,
9070: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
9080: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
9090: 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73  , (SIZE_T)nBytes
90a0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 20  );.  }.  if( !p 
90b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
90c0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
90d0: 20 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20 25   "failed to %s %
90e0: 75 20 62 79 74 65 73 20 28 25 64 29 2c 20 68 65  u bytes (%d), he
90f0: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
9100: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20 3f          pPrior ?
9110: 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a   "HeapReAlloc" :
9120: 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42   "HeapAlloc", nB
9130: 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74 45  ytes, osGetLastE
9140: 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
9150: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68          (void*)h
9160: 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Heap);.  }.  ret
9170: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
9180: 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
9190: 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  of an outstandin
91a0: 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e  g allocation, in
91b0: 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
91c0: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
91d0: 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e  (void *p){.  HAN
91e0: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53 49 5a  DLE hHeap;.  SIZ
91f0: 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d  E_T n;..  winMem
9200: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
9210: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
9220: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
9230: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
9240: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
9250: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
9260: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
9270: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
9280: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
9290: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
92a0: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 20  IDATE).  assert 
92b0: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
92c0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
92d0: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
92e0: 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66   NULL) );.#endif
92f0: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
9300: 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65  rn 0;.  n = osHe
9310: 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53 51  apSize(hHeap, SQ
9320: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
9330: 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66 28  FLAGS, p);.  if(
9340: 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29   n==(SIZE_T)-1 )
9350: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
9360: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
9370: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 53  "failed to HeapS
9380: 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 64  ize block %p (%d
9390: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c 20               p, 
93b0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
93c0: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
93d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
93e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
93f0: 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75  )n;.}../*.** Rou
9400: 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74 20  nd up a request 
9410: 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74  size to the next
9420: 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f   valid allocatio
9430: 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
9440: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
9450: 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65  dup(int n){.  re
9460: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
9470: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73   Initialize this
9480: 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74   module..*/.stat
9490: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
94a0: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
94b0: 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20  ){.  winMemData 
94c0: 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28  *pWinMemData = (
94d0: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70  winMemData *)pAp
94e0: 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70  pData;..  if( !p
94f0: 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74  WinMemData ) ret
9500: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
9510: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
9520: 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 3d 3d  MemData->magic==
9530: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 20 29 3b 0a  WINMEM_MAGIC );.
9540: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
9550: 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f  WINRT && SQLITE_
9560: 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54  WIN32_HEAP_CREAT
9570: 45 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  E.  if( !pWinMem
9580: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
9590: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
95a0: 68 48 65 61 70 20 3d 20 6f 73 48 65 61 70 43 72  hHeap = osHeapCr
95b0: 65 61 74 65 28 53 51 4c 49 54 45 5f 57 49 4e 33  eate(SQLITE_WIN3
95c0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20  2_HEAP_FLAGS,.  
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95f0: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
9600: 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 2c  _HEAP_INIT_SIZE,
9610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9630: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
9640: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
9650: 45 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57 69  E);.    if( !pWi
9660: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
9670: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9680: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
9690: 4d 2c 0a 20 20 20 20 20 20 20 20 20 20 22 66 61  M,.          "fa
96a0: 69 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65 61  iled to HeapCrea
96b0: 74 65 20 28 25 64 29 2c 20 66 6c 61 67 73 3d 25  te (%d), flags=%
96c0: 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25 75 2c 20  u, initSize=%u, 
96d0: 6d 61 78 53 69 7a 65 3d 25 75 22 2c 0a 20 20 20  maxSize=%u",.   
96e0: 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74         osGetLast
96f0: 45 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f  Error(), SQLITE_
9700: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
9710: 2c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  ,.          SQLI
9720: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e  TE_WIN32_HEAP_IN
9730: 49 54 5f 53 49 5a 45 2c 20 53 51 4c 49 54 45 5f  IT_SIZE, SQLITE_
9740: 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53  WIN32_HEAP_MAX_S
9750: 49 5a 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  IZE);.      retu
9760: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
9770: 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d  .    }.    pWinM
9780: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d  emData->bOwned =
9790: 20 54 52 55 45 3b 0a 20 20 20 20 61 73 73 65 72   TRUE;.    asser
97a0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
97b0: 62 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65  bOwned );.  }.#e
97c0: 6c 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74  lse.  pWinMemDat
97d0: 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47 65 74  a->hHeap = osGet
97e0: 50 72 6f 63 65 73 73 48 65 61 70 28 29 3b 0a 20  ProcessHeap();. 
97f0: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
9800: 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20  a->hHeap ){.    
9810: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
9820: 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20  TE_NOMEM,.      
9830: 20 20 22 66 61 69 6c 65 64 20 74 6f 20 47 65 74    "failed to Get
9840: 50 72 6f 63 65 73 73 48 65 61 70 20 28 25 64 29  ProcessHeap (%d)
9850: 22 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  ", osGetLastErro
9860: 72 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  r());.    return
9870: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
9880: 20 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61   }.  pWinMemData
9890: 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45  ->bOwned = FALSE
98a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 57 69  ;.  assert( !pWi
98b0: 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64  nMemData->bOwned
98c0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   );.#endif.  ass
98d0: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
98e0: 2d 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20  ->hHeap!=0 );.  
98f0: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
9900: 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41  ata->hHeap!=INVA
9910: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
9920: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
9930: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
9940: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
9950: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
9960: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65  ).  assert( osHe
9970: 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d  apValidate(pWinM
9980: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53  emData->hHeap, S
9990: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
99a0: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
99b0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
99c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
99d0: 2a 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a  *.** Deinitializ
99e0: 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a  e this module..*
99f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
9a00: 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69  nMemShutdown(voi
9a10: 64 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20  d *pAppData){.  
9a20: 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e  winMemData *pWin
9a30: 4d 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65  MemData = (winMe
9a40: 6d 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61  mData *)pAppData
9a50: 3b 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65  ;..  if( !pWinMe
9a60: 6d 44 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a  mData ) return;.
9a70: 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74    if( pWinMemDat
9a80: 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20  a->hHeap ){.    
9a90: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
9aa0: 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41  ata->hHeap!=INVA
9ab0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
9ac0: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
9ad0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
9ae0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
9af0: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
9b00: 29 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73  ).    assert( os
9b10: 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69  HeapValidate(pWi
9b20: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c  nMemData->hHeap,
9b30: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
9b40: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
9b50: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
9b60: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62  ( pWinMemData->b
9b70: 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69  Owned ){.      i
9b80: 66 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f  f( !osHeapDestro
9b90: 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  y(pWinMemData->h
9ba0: 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20  Heap) ){.       
9bb0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
9bc0: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
9bd0: 65 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f  ed to HeapDestro
9be0: 79 20 28 25 64 29 2c 20 68 65 61 70 3d 25 70 22  y (%d), heap=%p"
9bf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
9c00: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
9c10: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70  rror(), (void*)p
9c20: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
9c30: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
9c40: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
9c50: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  Owned = FALSE;. 
9c60: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
9c70: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55  Data->hHeap = NU
9c80: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  LL;.  }.}../*.**
9c90: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f   Populate the lo
9ca0: 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61  w-level memory a
9cb0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  llocation functi
9cc0: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a  on pointers in.*
9cd0: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
9ce0: 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69  onfig.m with poi
9cf0: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75  nters to the rou
9d00: 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69  tines in this fi
9d10: 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d  le. The.** argum
9d20: 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65  ents specify the
9d30: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
9d40: 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a   to manage..**.*
9d50: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9d60: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
9d70: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
9d80: 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  ), and therefore
9d90: 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69  .** is not requi
9da0: 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  red to be thread
9db0: 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29  safe (it is not)
9dc0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
9dd0: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
9de0: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
9df0: 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  32(void){.  stat
9e00: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
9e10: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e  _mem_methods win
9e20: 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20  MemMethods = {. 
9e30: 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c     winMemMalloc,
9e40: 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c  .    winMemFree,
9e50: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c  .    winMemReall
9e60: 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69  oc,.    winMemSi
9e70: 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f  ze,.    winMemRo
9e80: 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65  undup,.    winMe
9e90: 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65  mInit,.    winMe
9ea0: 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26  mShutdown,.    &
9eb0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d  win_mem_data.  }
9ec0: 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d  ;.  return &winM
9ed0: 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f  emMethods;.}..vo
9ee0: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74  id sqlite3MemSet
9ef0: 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20  Default(void){. 
9f00: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
9f10: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
9f20: 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d  LLOC, sqlite3Mem
9f30: 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23  GetWin32());.}.#
9f40: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9f50: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
9f60: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
9f70: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
9f80: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
9f90: 64 65 20 28 55 54 46 2d 31 36 3f 29 2e 20 0a 2a  de (UTF-16?). .*
9fa0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
9fb0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
9fc0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
9fd0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a  ed from malloc..
9fe0: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  */.static LPWSTR
9ff0: 20 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63   utf8ToUnicode(c
a000: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
a010: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68  name){.  int nCh
a020: 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69  ar;.  LPWSTR zWi
a030: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  deFilename;..  n
a040: 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Char = osMultiBy
a050: 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
a060: 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  UTF8, 0, zFilena
a070: 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29  me, -1, NULL, 0)
a080: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
a090: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
a0a0: 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c  ;.  }.  zWideFil
a0b0: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  ename = sqlite3M
a0c0: 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61 72  allocZero( nChar
a0d0: 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c  *sizeof(zWideFil
a0e0: 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69  ename[0]) );.  i
a0f0: 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  f( zWideFilename
a100: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
a110: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72  n 0;.  }.  nChar
a120: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
a130: 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38  WideChar(CP_UTF8
a140: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
a150: 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  -1, zWideFilenam
a160: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28     nChar);.  if(
a190: 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20   nChar==0 ){.   
a1a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
a1b0: 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ideFilename);.  
a1c0: 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
a1d0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
a1e0: 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b  n zWideFilename;
a1f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
a200: 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  t Microsoft Unic
a210: 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53  ode to UTF-8.  S
a220: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
a230: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
a240: 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20   is.** obtained 
a250: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
a260: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
a270: 20 63 68 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f   char *unicodeTo
a280: 55 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69  Utf8(LPCWSTR zWi
a290: 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  deFilename){.  i
a2a0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72  nt nByte;.  char
a2b0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20   *zFilename;..  
a2c0: 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68  nByte = osWideCh
a2d0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50  arToMultiByte(CP
a2e0: 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46  _UTF8, 0, zWideF
a2f0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20  ilename, -1, 0, 
a300: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  0, 0, 0);.  if( 
a310: 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20  nByte == 0 ){.  
a320: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
a330: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71    zFilename = sq
a340: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
a350: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
a360: 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zFilename==0 ){.
a370: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a380: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69  }.  nByte = osWi
a390: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
a3a0: 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57  e(CP_UTF8, 0, zW
a3b0: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
a3c0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42 79 74   zFilename, nByt
a3d0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3f0: 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20     0, 0);.  if( 
a400: 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20  nByte == 0 ){.  
a410: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
a420: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
a430: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
a440: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  }.  return zFile
a450: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
a460: 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53 49 20 73  onvert an ANSI s
a470: 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f  tring to Microso
a480: 66 74 20 55 6e 69 63 6f 64 65 2c 20 62 61 73 65  ft Unicode, base
a490: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72  d on the.** curr
a4a0: 65 6e 74 20 63 6f 64 65 70 61 67 65 20 73 65 74  ent codepage set
a4b0: 74 69 6e 67 73 20 66 6f 72 20 66 69 6c 65 20 61  tings for file a
a4c0: 70 69 73 2e 0a 2a 2a 20 0a 2a 2a 20 53 70 61 63  pis..** .** Spac
a4d0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
a4e0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
a4f0: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
a500: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
a510: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53  ..*/.static LPWS
a520: 54 52 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65  TR mbcsToUnicode
a530: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
a540: 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e  lename){.  int n
a550: 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Byte;.  LPWSTR z
a560: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  MbcsFilename;.  
a570: 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 6f  int codepage = o
a580: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
a590: 28 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50  () ? CP_ACP : CP
a5a0: 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65  _OEMCP;..  nByte
a5b0: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
a5c0: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
a5d0: 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e, 0, zFilename,
a5e0: 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20   -1, NULL,.     
a5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a600: 20 20 20 20 20 20 20 20 20 20 20 30 29 2a 73 69             0)*si
a610: 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 69  zeof(WCHAR);.  i
a620: 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
a630: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
a640: 0a 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  .  zMbcsFilename
a650: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
a660: 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
a670: 6f 66 28 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  of(zMbcsFilename
a680: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d  [0]) );.  if( zM
a690: 62 63 73 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  bcsFilename==0 )
a6a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
a6b0: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
a6c0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
a6d0: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
a6e0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20   zFilename, -1, 
a6f0: 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 2c 0a 20  zMbcsFilename,. 
a700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
a720: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42 79  Byte);.  if( nBy
a730: 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  te==0 ){.    sql
a740: 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73 46  ite3_free(zMbcsF
a750: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 4d  ilename);.    zM
a760: 62 63 73 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b  bcsFilename = 0;
a770: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d  .  }.  return zM
a780: 62 63 73 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a  bcsFilename;.}..
a790: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 4d 69  /*.** Convert Mi
a7a0: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20  crosoft Unicode 
a7b0: 74 6f 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68  to multi-byte ch
a7c0: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c 20  aracter string, 
a7d0: 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20  based on the.** 
a7e0: 75 73 65 72 27 73 20 41 4e 53 49 20 63 6f 64 65  user's ANSI code
a7f0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  page..**.** Spac
a800: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
a810: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
a820: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
a830: 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  * sqlite3_malloc
a840: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
a850: 61 72 20 2a 75 6e 69 63 6f 64 65 54 6f 4d 62 63  ar *unicodeToMbc
a860: 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 46  s(LPCWSTR zWideF
a870: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
a880: 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a  nByte;.  char *z
a890: 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 69 6e 74 20  Filename;.  int 
a8a0: 63 6f 64 65 70 61 67 65 20 3d 20 6f 73 41 72 65  codepage = osAre
a8b0: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
a8c0: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
a8d0: 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f  CP;..  nByte = o
a8e0: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
a8f0: 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30  Byte(codepage, 0
a900: 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c  , zWideFilename,
a910: 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29   -1, 0, 0, 0, 0)
a920: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d  ;.  if( nByte ==
a930: 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e   0 ){.    return
a940: 20 30 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e   0;.  }.  zFilen
a950: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ame = sqlite3Mal
a960: 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29  locZero( nByte )
a970: 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  ;.  if( zFilenam
a980: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
a990: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  rn 0;.  }.  nByt
a9a0: 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f  e = osWideCharTo
a9b0: 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61  MultiByte(codepa
a9c0: 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69 6c 65  ge, 0, zWideFile
a9d0: 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e  name, -1, zFilen
a9e0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa00: 20 20 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30       nByte, 0, 0
aa10: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d  );.  if( nByte =
aa20: 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  = 0 ){.    sqlit
aa30: 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 6e 61 6d  e3_free(zFilenam
aa40: 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  e);.    zFilenam
aa50: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
aa60: 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  urn zFilename;.}
aa70: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
aa80: 6d 75 6c 74 69 62 79 74 65 20 63 68 61 72 61 63  multibyte charac
aa90: 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55 54  ter string to UT
aaa0: 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68  F-8.  Space to h
aab0: 6f 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72  old the.** retur
aac0: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
aad0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
aae0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
aaf0: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
ab00: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
ab10: 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  8(const char *zF
ab20: 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
ab30: 20 2a 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b   *zFilenameUtf8;
ab40: 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69  .  LPWSTR zTmpWi
ab50: 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20  de;..  zTmpWide 
ab60: 3d 20 6d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28  = mbcsToUnicode(
ab70: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
ab80: 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b  ( zTmpWide==0 ){
ab90: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
aba0: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 55 74   }.  zFilenameUt
abb0: 66 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74  f8 = unicodeToUt
abc0: 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  f8(zTmpWide);.  
abd0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d  sqlite3_free(zTm
abe0: 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  pWide);.  return
abf0: 20 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a   zFilenameUtf8;.
ac00: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
ac10: 20 55 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62   UTF-8 to multib
ac20: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
ac30: 72 69 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20  ring.  Space to 
ac40: 68 6f 6c 64 20 74 68 65 20 0a 2a 2a 20 72 65 74  hold the .** ret
ac50: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
ac60: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
ac70: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
ac80: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
ac90: 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d  _win32_utf8_to_m
aca0: 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  bcs(const char *
acb0: 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68  zFilename){.  ch
acc0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63  ar *zFilenameMbc
acd0: 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70  s;.  LPWSTR zTmp
ace0: 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64  Wide;..  zTmpWid
acf0: 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f 64  e = utf8ToUnicod
ad00: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
ad10: 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20  if( zTmpWide==0 
ad20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
ad30: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
ad40: 4d 62 63 73 20 3d 20 75 6e 69 63 6f 64 65 54 6f  Mbcs = unicodeTo
ad50: 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29 3b 0a  Mbcs(zTmpWide);.
ad60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
ad70: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75  TmpWide);.  retu
ad80: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73  rn zFilenameMbcs
ad90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
ada0: 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68  function sets th
adb0: 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
adc0: 20 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72   or the temporar
add0: 79 20 64 69 72 65 63 74 6f 72 79 20 62 61 73 65  y directory base
ade0: 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 72 6f 76  d on.** the prov
adf0: 69 64 65 64 20 61 72 67 75 6d 65 6e 74 73 2e 20  ided arguments. 
ae00: 20 54 68 65 20 74 79 70 65 20 61 72 67 75 6d 65   The type argume
ae10: 6e 74 20 6d 75 73 74 20 62 65 20 31 20 69 6e 20  nt must be 1 in 
ae20: 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68 65  order to set the
ae30: 0a 2a 2a 20 64 61 74 61 20 64 69 72 65 63 74 6f  .** data directo
ae40: 72 79 20 6f 72 20 32 20 69 6e 20 6f 72 64 65 72  ry or 2 in order
ae50: 20 74 6f 20 73 65 74 20 74 68 65 20 74 65 6d 70   to set the temp
ae60: 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e  orary directory.
ae70: 20 20 54 68 65 20 7a 56 61 6c 75 65 0a 2a 2a 20    The zValue.** 
ae80: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
ae90: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65  name of the dire
aea0: 63 74 6f 72 79 20 74 6f 20 75 73 65 2e 20 20 54  ctory to use.  T
aeb0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
aec0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c 49 54  will be.** SQLIT
aed0: 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
aee0: 75 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ul..*/.int sqlit
aef0: 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
af00: 65 63 74 6f 72 79 28 44 57 4f 52 44 20 74 79 70  ectory(DWORD typ
af10: 65 2c 20 4c 50 43 57 53 54 52 20 7a 56 61 6c 75  e, LPCWSTR zValu
af20: 65 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70 44  e){.  char **ppD
af30: 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 69  irectory = 0;.#i
af40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
af50: 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e 74  T_AUTOINIT.  int
af60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
af70: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
af80: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
af90: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 74  ;.#endif.  if( t
afa0: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
afb0: 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59  2_DATA_DIRECTORY
afc0: 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44  _TYPE ){.    ppD
afd0: 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69  irectory = &sqli
afe0: 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
aff0: 72 79 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ry;.  }else if( 
b000: 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e  type==SQLITE_WIN
b010: 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52  32_TEMP_DIRECTOR
b020: 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70  Y_TYPE ){.    pp
b030: 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c  Directory = &sql
b040: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
b050: 6f 72 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ory;.  }.  asser
b060: 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20  t( !ppDirectory 
b070: 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  || type==SQLITE_
b080: 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43  WIN32_DATA_DIREC
b090: 54 4f 52 59 5f 54 59 50 45 0a 20 20 20 20 20 20  TORY_TYPE.      
b0a0: 20 20 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c      || type==SQL
b0b0: 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44  ITE_WIN32_TEMP_D
b0c0: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20  IRECTORY_TYPE.  
b0d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 70  );.  assert( !pp
b0e0: 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 73 71 6c  Directory || sql
b0f0: 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54  ite3MemdebugHasT
b100: 79 70 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79  ype(*ppDirectory
b110: 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20  , MEMTYPE_HEAP) 
b120: 29 3b 0a 20 20 69 66 28 20 70 70 44 69 72 65 63  );.  if( ppDirec
b130: 74 6f 72 79 20 29 7b 0a 20 20 20 20 63 68 61 72  tory ){.    char
b140: 20 2a 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 30   *zValueUtf8 = 0
b150: 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65  ;.    if( zValue
b160: 20 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29 7b   && zValue[0] ){
b170: 0a 20 20 20 20 20 20 7a 56 61 6c 75 65 55 74 66  .      zValueUtf
b180: 38 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66  8 = unicodeToUtf
b190: 38 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  8(zValue);.     
b1a0: 20 69 66 20 28 20 7a 56 61 6c 75 65 55 74 66 38   if ( zValueUtf8
b1b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
b1c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
b1d0: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
b1e0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
b1f0: 65 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 29  ee(*ppDirectory)
b200: 3b 0a 20 20 20 20 2a 70 70 44 69 72 65 63 74 6f  ;.    *ppDirecto
b210: 72 79 20 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b  ry = zValueUtf8;
b220: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
b230: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
b240: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
b250: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72  ;.}../*.** The r
b260: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 67  eturn value of g
b270: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a  etLastErrorMsg.*
b280: 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65  * is zero if the
b290: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
b2a0: 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66 65  its in the buffe
b2b0: 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a  r, or non-zero.*
b2c0: 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66 20  * otherwise (if 
b2d0: 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73 20  the message was 
b2e0: 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73  truncated)..*/.s
b2f0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 4c 61 73  tatic int getLas
b300: 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20  tErrorMsg(DWORD 
b310: 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e  lastErrno, int n
b320: 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
b330: 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73  {.  /* FormatMes
b340: 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f  sage returns 0 o
b350: 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65  n failure.  Othe
b360: 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65  rwise it.  ** re
b370: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
b380: 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74   of TCHARs writt
b390: 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  en to the output
b3a0: 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78  .  ** buffer, ex
b3b0: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d  cluding the term
b3c0: 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61  inating null cha
b3d0: 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20  r..  */.  DWORD 
b3e0: 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61  dwLen = 0;.  cha
b3f0: 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20  r *zOut = 0;..  
b400: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 23 69  if( isNT() ){.#i
b410: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
b420: 54 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65 6d  T.    WCHAR zTem
b430: 70 57 69 64 65 5b 4d 41 58 5f 50 41 54 48 2b 31  pWide[MAX_PATH+1
b440: 5d 3b 20 2f 2a 20 4e 4f 54 45 3a 20 53 6f 6d 65  ]; /* NOTE: Some
b450: 77 68 61 74 20 61 72 62 69 74 72 61 72 79 2e 20  what arbitrary. 
b460: 2a 2f 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f  */.    dwLen = o
b470: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28  sFormatMessageW(
b480: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46  FORMAT_MESSAGE_F
b490: 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20  ROM_SYSTEM |.   
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4b0: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
b4c0: 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f  _MESSAGE_IGNORE_
b4d0: 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20  INSERTS,.       
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4f0: 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
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 6c 61 73 74 45 72 72           lastErr
b520: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
b530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b540: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20   zTempWide,.    
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 20 4d 41 58 5f 50 41 54           MAX_PAT
b590: 48 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  H,.             
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50  0);.#else.    LP
b5c0: 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d  WSTR zTempWide =
b5d0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e   NULL;.    dwLen
b5e0: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61   = osFormatMessa
b5f0: 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geW(FORMAT_MESSA
b600: 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46  GE_ALLOCATE_BUFF
b610: 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ER |.           
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b630: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
b640: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20  _FROM_SYSTEM |. 
b650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b660: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d              FORM
b670: 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52  AT_MESSAGE_IGNOR
b680: 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20  E_INSERTS,.     
b690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6a0: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20          NULL,.  
b6b0: 20 20 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 6c 61 73 74 45             lastE
b6d0: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6f0: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
b700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b710: 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54 65     (LPWSTR) &zTe
b720: 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20  mpWide,.        
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b740: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20       0,.        
b750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b760: 20 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a       0);.#endif.
b770: 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20      if( dwLen > 
b780: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c  0 ){.      /* al
b790: 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20  locate a buffer 
b7a0: 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55  and convert to U
b7b0: 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  TF8 */.      sql
b7c0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
b7d0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a  alloc();.      z
b7e0: 4f 75 74 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  Out = unicodeToU
b7f0: 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a  tf8(zTempWide);.
b800: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
b810: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
b820: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
b830: 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72  INRT.      /* fr
b840: 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
b850: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
b860: 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
b870: 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c  */.      osLocal
b880: 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b  Free(zTempWide);
b890: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
b8a0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
b8b0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
b8c0: 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
b8d0: 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20  *zTemp = NULL;. 
b8e0: 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72     dwLen = osFor
b8f0: 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d  matMessageA(FORM
b900: 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43  AT_MESSAGE_ALLOC
b910: 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20  ATE_BUFFER |.   
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
b940: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
b950: 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20  STEM |.         
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
b980: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54  GE_IGNORE_INSERT
b990: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9b0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
b9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b9d0: 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20     lastErrno,.  
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 20 30 2c 0a 20 20             0,.  
ba00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba10: 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54             (LPST
ba20: 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20  R) &zTemp,.     
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba40: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
ba70: 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b  if( dwLen > 0 ){
ba80: 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
ba90: 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20  te a buffer and 
baa0: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20  convert to UTF8 
bab0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
bac0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
bad0: 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20  c();.      zOut 
bae0: 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
baf0: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65  mbcs_to_utf8(zTe
bb00: 6d 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  mp);.      sqlit
bb10: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
bb20: 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72  c();.      /* fr
bb30: 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
bb40: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
bb50: 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
bb60: 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c  */.      osLocal
bb70: 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  Free(zTemp);.   
bb80: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
bb90: 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29  if( 0 == dwLen )
bba0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
bbb0: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
bbc0: 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 78  f, "OsError 0x%x
bbd0: 20 28 25 75 29 22 2c 20 6c 61 73 74 45 72 72 6e   (%u)", lastErrn
bbe0: 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20  o, lastErrno);. 
bbf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63   }else{.    /* c
bc00: 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66  opy a maximum of
bc10: 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f   nBuf chars to o
bc20: 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a  utput buffer */.
bc30: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
bc40: 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c  intf(nBuf, zBuf,
bc50: 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20   "%s", zOut);.  
bc60: 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54    /* free the UT
bc70: 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  F8 buffer */.   
bc80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
bc90: 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ut);.  }.  retur
bca0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a  n 0;.}../*.**.**
bcb0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d   This function -
bcc0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69   winLogErrorAtLi
bcd0: 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65  ne() - is only e
bce0: 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74  ver called via t
bcf0: 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c  he macro.** winL
bd00: 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a  ogError()..**.**
bd10: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
bd20: 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61   invoked after a
bd30: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
bd40: 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e  n an OS function
bd50: 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d  ..** It logs a m
bd60: 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c  essage using sql
bd70: 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61  ite3_log() conta
bd80: 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ining the curren
bd90: 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72  t value of.** er
bda0: 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 66  ror code and, if
bdb0: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
bdc0: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
bdd0: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 0a 2a  uivalent from .*
bde0: 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e  * FormatMessage.
bdf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
be00: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
be10: 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68   to the macro sh
be20: 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f  ould be the erro
be30: 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77  r code that.** w
be40: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
be50: 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20  to SQLite (e.g. 
be60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
be70: 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ETE, SQLITE_CANT
be80: 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74  OPEN). .** The t
be90: 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
bea0: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
beb0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
bec0: 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
bed0: 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64  at.** failed and
bee0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
bef0: 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68  file-system path
bf00: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65  , if any..*/.#de
bf10: 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72  fine winLogError
bf20: 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c  (a,b,c,d)   winL
bf30: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c  ogErrorAtLine(a,
bf40: 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a  b,c,d,__LINE__).
bf50: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f  static int winLo
bf60: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
bf70: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf90: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
bfa0: 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20  code */.  DWORD 
bfb0: 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20 20  lastErrno,      
bfc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
bfd0: 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f  32 last error */
bfe0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
bff0: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
c000: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
c010: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
c020: 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
c030: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
c040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
c050: 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
c060: 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
c070: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
c080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c090: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
c0a0: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
c0b0: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
c0c0: 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b  .){.  char zMsg[
c0d0: 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20  500];           
c0e0: 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72        /* Human r
c0f0: 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65  eadable error te
c100: 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  xt */.  int i;  
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c120: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
c130: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d  counter */..  zM
c140: 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 67 65 74  sg[0] = 0;.  get
c150: 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73  LastErrorMsg(las
c160: 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a  tErrno, sizeof(z
c170: 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61  Msg), zMsg);.  a
c180: 73 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d  ssert( errcode!=
c190: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69  SQLITE_OK );.  i
c1a0: 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50  f( zPath==0 ) zP
c1b0: 61 74 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28  ath = "";.  for(
c1c0: 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20  i=0; zMsg[i] && 
c1d0: 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26  zMsg[i]!='\r' &&
c1e0: 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20   zMsg[i]!='\n'; 
c1f0: 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d  i++){}.  zMsg[i]
c200: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
c210: 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20  log(errcode,.   
c220: 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a     "os_win.c:%d:
c230: 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20 25   (%d) %s(%s) - %
c240: 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c  s",.      iLine,
c250: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e   lastErrno, zFun
c260: 63 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20  c, zPath, zMsg. 
c270: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72   );..  return er
c280: 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rcode;.}../*.** 
c290: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  The number of ti
c2a0: 6d 65 73 20 74 68 61 74 20 61 20 52 65 61 64 46  mes that a ReadF
c2b0: 69 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c 65  ile(), WriteFile
c2c0: 28 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46 69  (), and DeleteFi
c2d0: 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  le().** will be 
c2e0: 72 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e  retried followin
c2f0: 67 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f  g a locking erro
c300: 72 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75  r - probably cau
c310: 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e 74 69 76  sed by .** antiv
c320: 69 72 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20  irus software.  
c330: 41 6c 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c  Also the initial
c340: 20 64 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68   delay before th
c350: 65 20 66 69 72 73 74 20 72 65 74 72 79 2e 0a 2a  e first retry..*
c360: 2a 20 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72  * The delay incr
c370: 65 61 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77  eases linearly w
c380: 69 74 68 20 65 61 63 68 20 72 65 74 72 79 2e 0a  ith each retry..
c390: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
c3a0: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
c3b0: 54 52 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  TRY.# define SQL
c3c0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
c3d0: 52 45 54 52 59 20 31 30 0a 23 65 6e 64 69 66 0a  RETRY 10.#endif.
c3e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
c3f0: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
c400: 5f 44 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20  _DELAY.# define 
c410: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
c420: 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 20 32  RR_RETRY_DELAY 2
c430: 35 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  5.#endif.static 
c440: 69 6e 74 20 77 69 6e 33 32 49 6f 65 72 72 52 65  int win32IoerrRe
c450: 74 72 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e  try = SQLITE_WIN
c460: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 3b 0a  32_IOERR_RETRY;.
c470: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32  static int win32
c480: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20  IoerrRetryDelay 
c490: 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  = SQLITE_WIN32_I
c4a0: 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59  OERR_RETRY_DELAY
c4b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65  ;../*.** If a Re
c4c0: 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74  adFile() or Writ
c4d0: 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63  eFile() error oc
c4e0: 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69  curs, invoke thi
c4f0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20  s routine.** to 
c500: 73 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64  see if it should
c510: 20 62 65 20 72 65 74 72 69 65 64 2e 20 20 52 65   be retried.  Re
c520: 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74  turn TRUE to ret
c530: 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ry.  Return FALS
c540: 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20  E.** to give up 
c550: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  with an error..*
c560: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 74  /.static int ret
c570: 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52  ryIoerr(int *pnR
c580: 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70 45 72  etry, DWORD *pEr
c590: 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20 65 20  ror){.  DWORD e 
c5a0: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
c5b0: 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65 74  ();.  if( *pnRet
c5c0: 72 79 3e 3d 77 69 6e 33 32 49 6f 65 72 72 52 65  ry>=win32IoerrRe
c5d0: 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  try ){.    if( p
c5e0: 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a  Error ){.      *
c5f0: 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20  pError = e;.    
c600: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
c610: 20 20 7d 0a 20 20 69 66 28 20 65 3d 3d 45 52 52    }.  if( e==ERR
c620: 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44  OR_ACCESS_DENIED
c630: 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52 52   ||.      e==ERR
c640: 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f  OR_LOCK_VIOLATIO
c650: 4e 20 7c 7c 0a 20 20 20 20 20 20 65 3d 3d 45 52  N ||.      e==ER
c660: 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c  ROR_SHARING_VIOL
c670: 41 54 49 4f 4e 20 29 7b 0a 20 20 20 20 73 71 6c  ATION ){.    sql
c680: 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
c690: 28 77 69 6e 33 32 49 6f 65 72 72 52 65 74 72 79  (win32IoerrRetry
c6a0: 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72  Delay*(1+*pnRetr
c6b0: 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65  y));.    ++*pnRe
c6c0: 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  try;.    return 
c6d0: 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 72  1;.  }.  if( pEr
c6e0: 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72  ror ){.    *pErr
c6f0: 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65  or = e;.  }.  re
c700: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
c710: 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72   Log a I/O error
c720: 20 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a   retry episode..
c730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
c740: 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74  ogIoerr(int nRet
c750: 72 79 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72  ry){.  if( nRetr
c760: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
c770: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 49 4f 45 52  _log(SQLITE_IOER
c780: 52 2c 20 0a 20 20 20 20 20 20 22 64 65 6c 61 79  R, .      "delay
c790: 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b  ed %dms for lock
c7a0: 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63  /sharing conflic
c7b0: 74 22 2c 0a 20 20 20 20 20 20 77 69 6e 33 32 49  t",.      win32I
c7c0: 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e  oerrRetryDelay*n
c7d0: 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29  Retry*(nRetry+1)
c7e0: 2f 32 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a  /2.    );.  }.}.
c7f0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
c800: 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  INCE./**********
c810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a  ***************.
c850: 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
c860: 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f  contains code fo
c870: 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f  r WinCE only..*/
c880: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
c890: 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54  LITE_MSVC_LOCALT
c8a0: 49 4d 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c  IME_API) || !SQL
c8b0: 49 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49  ITE_MSVC_LOCALTI
c8c0: 4d 45 5f 41 50 49 0a 2f 2a 0a 2a 2a 20 54 68 65  ME_API./*.** The
c8d0: 20 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69 6e   MSVC CRT on Win
c8e0: 64 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74 20  dows CE may not 
c8f0: 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65  have a localtime
c900: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f  () function.  So
c910: 0a 2a 2a 20 63 72 65 61 74 65 20 61 20 73 75 62  .** create a sub
c920: 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69 6e 63  stitute..*/.#inc
c930: 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74  lude <time.h>.st
c940: 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c  ruct tm *__cdecl
c950: 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74   localtime(const
c960: 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20   time_t *t).{.  
c970: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74 6d  static struct tm
c980: 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75   y;.  FILETIME u
c990: 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45  Tm, lTm;.  SYSTE
c9a0: 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c  MTIME pTm;.  sql
c9b0: 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a  ite3_int64 t64;.
c9c0: 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36    t64 = *t;.  t6
c9d0: 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34  4 = (t64 + 11644
c9e0: 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30 30  473600)*10000000
c9f0: 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74  ;.  uTm.dwLowDat
ca00: 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28  eTime = (DWORD)(
ca10: 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46  t64 & 0xFFFFFFFF
ca20: 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44  );.  uTm.dwHighD
ca30: 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29  ateTime= (DWORD)
ca40: 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f  (t64 >> 32);.  o
ca50: 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  sFileTimeToLocal
ca60: 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c  FileTime(&uTm,&l
ca70: 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d  Tm);.  osFileTim
ca80: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c  eToSystemTime(&l
ca90: 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d  Tm,&pTm);.  y.tm
caa0: 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61  _year = pTm.wYea
cab0: 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d  r - 1900;.  y.tm
cac0: 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74  _mon = pTm.wMont
cad0: 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64  h - 1;.  y.tm_wd
cae0: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57  ay = pTm.wDayOfW
caf0: 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79  eek;.  y.tm_mday
cb00: 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79   = pTm.wDay;.  y
cb10: 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77  .tm_hour = pTm.w
cb20: 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e  Hour;.  y.tm_min
cb30: 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a   = pTm.wMinute;.
cb40: 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d    y.tm_sec = pTm
cb50: 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75  .wSecond;.  retu
cb60: 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn &y;.}.#endif.
cb70: 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f  .#define HANDLE_
cb80: 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77  TO_WINFILE(a) (w
cb90: 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a  inFile*)&((char*
cba0: 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74  )a)[-(int)offset
cbb0: 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a  of(winFile,h)]..
cbc0: 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
cbd0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64  lock on the hand
cbe0: 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76  le h.*/.static v
cbf0: 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63  oid winceMutexAc
cc00: 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b  quire(HANDLE h){
cc10: 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b  .   DWORD dwErr;
cc20: 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77  .   do {.     dw
cc30: 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53  Err = osWaitForS
cc40: 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49  ingleObject(h, I
cc50: 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77  NFINITE);.   } w
cc60: 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57  hile (dwErr != W
cc70: 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20  AIT_OBJECT_0 && 
cc80: 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42  dwErr != WAIT_AB
cc90: 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a  ANDONED);.}./*.*
cca0: 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b  * Release a lock
ccb0: 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e   acquired by win
ccc0: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29  ceMutexAcquire()
ccd0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63  .*/.#define winc
cce0: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29  eMutexRelease(h)
ccf0: 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29   ReleaseMutex(h)
cd00: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
cd10: 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61  he mutex and sha
cd20: 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  red memory used 
cd30: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  for locking in t
cd40: 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  he file.** descr
cd50: 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73  iptor pFile.*/.s
cd60: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65 43  tatic int winceC
cd70: 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20  reateLock(const 
cd80: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
cd90: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29   winFile *pFile)
cda0: 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b  {.  LPWSTR zTok;
cdb0: 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b  .  LPWSTR zName;
cdc0: 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
cdd0: 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67  no;.  BOOL bLogg
cde0: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f  ed = FALSE;.  BO
cdf0: 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b  OL bInit = TRUE;
ce00: 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 75 74 66 38  ..  zName = utf8
ce10: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
ce20: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
ce30: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f  e==0 ){.    /* o
ce40: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
ce50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ce60: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
ce70: 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
ce80: 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ize the local lo
ce90: 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73  ckdata */.  mems
cea0: 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  et(&pFile->local
ceb0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c  , 0, sizeof(pFil
cec0: 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f  e->local));..  /
ced0: 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 61  * Replace the ba
cee0: 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74  ckslashes from t
cef0: 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  he filename and 
cf00: 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a  lowercase it.  *
cf10: 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75  * to derive a mu
cf20: 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a  tex name. */.  z
cf30: 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65  Tok = osCharLowe
cf40: 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  rW(zName);.  for
cf50: 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29   (;*zTok;zTok++)
cf60: 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20  {.    if (*zTok 
cf70: 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d  == '\\') *zTok =
cf80: 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   '_';.  }..  /* 
cf90: 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20  Create/open the 
cfa0: 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20  named mutex */. 
cfb0: 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
cfc0: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 28   osCreateMutexW(
cfd0: 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61  NULL, FALSE, zNa
cfe0: 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c  me);.  if (!pFil
cff0: 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20  e->hMutex){.    
d000: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d010: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
d020: 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  r();.    winLogE
d030: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
d040: 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  R, pFile->lastEr
d050: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
d060: 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
d070: 65 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61  eLock1", zFilena
d080: 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
d090: 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  _free(zName);.  
d0a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d0b0: 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  IOERR;.  }..  /*
d0c0: 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74   Acquire the mut
d0d0: 65 78 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e  ex before contin
d0e0: 75 69 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d  uing */.  winceM
d0f0: 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
d100: 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 0a 20  e->hMutex);.  . 
d110: 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 6e 61   /* Since the na
d120: 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d 75 74  mes of named mut
d130: 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72 65 73  exes, semaphores
d140: 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 73 20  , file mappings 
d150: 65 74 63 20 61 72 65 20 0a 20 20 2a 2a 20 63 61  etc are .  ** ca
d160: 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74 61  se-sensitive, ta
d170: 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20  ke advantage of 
d180: 74 68 61 74 20 62 79 20 75 70 70 65 72 63 61 73  that by uppercas
d190: 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e 61  ing the mutex na
d1a0: 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69 6e  me.  ** and usin
d1b0: 67 20 74 68 61 74 20 61 73 20 74 68 65 20 73 68  g that as the sh
d1c0: 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e 67  ared filemapping
d1d0: 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f 73   name..  */.  os
d1e0: 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d 65  CharUpperW(zName
d1f0: 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68 61  );.  pFile->hSha
d200: 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46 69  red = osCreateFi
d210: 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41 4c  leMappingW(INVAL
d220: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 2c  ID_HANDLE_VALUE,
d230: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
d260: 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30  AGE_READWRITE, 0
d270: 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
d280: 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ck),.           
d290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
d2b0: 6d 65 29 3b 20 20 0a 0a 20 20 2f 2a 20 53 65 74  me);  ..  /* Set
d2c0: 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64   a flag that ind
d2d0: 69 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65  icates we're the
d2e0: 20 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65   first to create
d2f0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69   the memory so i
d300: 74 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  t .  ** must be 
d310: 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64  zero-initialized
d320: 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20   */.  lastErrno 
d330: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
d340: 28 29 3b 0a 20 20 69 66 20 28 6c 61 73 74 45 72  ();.  if (lastEr
d350: 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52  rno == ERROR_ALR
d360: 45 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20  EADY_EXISTS){.  
d370: 20 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b    bInit = FALSE;
d380: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
d390: 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20  free(zName);..  
d3a0: 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65 65 64  /* If we succeed
d3b0: 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65  ed in making the
d3c0: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
d3d0: 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a  andle, map it. *
d3e0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  /.  if( pFile->h
d3f0: 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 70 46  Shared ){.    pF
d400: 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77  ile->shared = (w
d410: 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56  inceLock*)osMapV
d420: 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
d430: 3e 68 53 68 61 72 65 64 2c 20 0a 20 20 20 20 20  >hShared, .     
d440: 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41 50          FILE_MAP
d450: 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57  _READ|FILE_MAP_W
d460: 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65  RITE, 0, 0, size
d470: 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a  of(winceLock));.
d480: 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e      /* If mappin
d490: 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20  g failed, close 
d4a0: 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
d4b0: 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61  y handle and era
d4c0: 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 28  se it */.    if(
d4d0: 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20   !pFile->shared 
d4e0: 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
d4f0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
d500: 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
d510: 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
d520: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46  SQLITE_IOERR, pF
d530: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d550: 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f    "winceCreateLo
d560: 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ck2", zFilename)
d570: 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20  ;.      bLogged 
d580: 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 6f 73  = TRUE;.      os
d590: 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
d5a0: 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20  e->hShared);.   
d5b0: 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65     pFile->hShare
d5c0: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  d = NULL;.    }.
d5d0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61    }..  /* If sha
d5e0: 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64  red memory could
d5f0: 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c   not be created,
d600: 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
d610: 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a  mutex and fail *
d620: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  /.  if( pFile->h
d630: 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a  Shared==NULL ){.
d640: 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67 65 64      if( !bLogged
d650: 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
d660: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
d670: 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69  tErrno;.      wi
d680: 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
d690: 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
d6a0: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
d6c0: 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20  ceCreateLock3", 
d6d0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
d6e0: 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45    bLogged = TRUE
d6f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6e 63  ;.    }.    winc
d700: 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
d710: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
d720: 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
d730: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
d740: 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
d750: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65  x = NULL;.    re
d760: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
d770: 52 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49  R;.  }.  .  /* I
d780: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68  nitialize the sh
d790: 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77  ared memory if w
d7a0: 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f  e're supposed to
d7b0: 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20   */.  if( bInit 
d7c0: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46  ){.    memset(pF
d7d0: 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20  ile->shared, 0, 
d7e0: 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b  sizeof(winceLock
d7f0: 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65  ));.  }..  wince
d800: 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
d810: 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
d820: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d830: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f  .}../*.** Destro
d840: 79 20 74 68 65 20 70 61 72 74 20 6f 66 20 77 69  y the part of wi
d850: 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73  nFile that deals
d860: 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b   with wince lock
d870: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
d880: 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63   winceDestroyLoc
d890: 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
d8a0: 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  ){.  if (pFile->
d8b0: 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20  hMutex){.    /* 
d8c0: 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
d8d0: 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
d8e0: 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
d8f0: 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20  ->hMutex);..    
d900: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
d910: 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70   blocks should p
d920: 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20 69  robably assert i
d930: 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75  n debug mode, bu
d940: 74 20 74 68 65 79 0a 20 20 20 20 20 20 20 61 72  t they.       ar
d950: 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20  e to cleanup in 
d960: 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72  case any locks r
d970: 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a  emained open */.
d980: 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
d990: 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
d9a0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
d9b0: 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
d9c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
d9d0: 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
d9e0: 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70  served){.      p
d9f0: 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
da00: 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
da10: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
da20: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
da30: 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69  ding){.      pFi
da40: 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
da50: 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
da60: 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
da70: 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
da80: 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ive){.      pFil
da90: 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
daa0: 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
dab0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d     }..    /* De-
dac0: 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c  reference and cl
dad0: 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20  ose our copy of 
dae0: 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
daf0: 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  y handle */.    
db00: 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
db10: 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29  e(pFile->shared)
db20: 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  ;.    osCloseHan
db30: 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  dle(pFile->hShar
db40: 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e  ed);..    /* Don
db50: 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65 78  e with the mutex
db60: 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74   */.    winceMut
db70: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
db80: 3e 68 4d 75 74 65 78 29 3b 20 20 20 20 0a 20 20  >hMutex);    .  
db90: 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
dba0: 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
dbb0: 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
dbc0: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a  x = NULL;.  }.}.
dbd0: 0a 2f 2a 20 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65  ./* .** An imple
dbe0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
dbf0: 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20   LockFile() API 
dc00: 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43  of Windows for C
dc10: 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  E.*/.static BOOL
dc20: 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a   winceLockFile(.
dc30: 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
dc40: 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  e,.  DWORD dwFil
dc50: 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57  eOffsetLow,.  DW
dc60: 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
dc70: 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  High,.  DWORD nN
dc80: 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
dc90: 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  ckLow,.  DWORD n
dca0: 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
dcb0: 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e  ockHigh.){.  win
dcc0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41  File *pFile = HA
dcd0: 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28  NDLE_TO_WINFILE(
dce0: 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20  phFile);.  BOOL 
dcf0: 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b  bReturn = FALSE;
dd00: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
dd10: 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65  ETER(dwFileOffse
dd20: 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44  tHigh);.  UNUSED
dd30: 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62  _PARAMETER(nNumb
dd40: 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48  erOfBytesToLockH
dd50: 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46  igh);..  if (!pF
dd60: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74  ile->hMutex) ret
dd70: 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63  urn TRUE;.  winc
dd80: 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
dd90: 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
dda0: 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65   /* Wanting an e
ddb0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a  xclusive lock? *
ddc0: 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66  /.  if (dwFileOf
ddd0: 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
dde0: 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a 20  D)SHARED_FIRST. 
ddf0: 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
de00: 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
de10: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
de20: 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20  D_SIZE){.    if 
de30: 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
de40: 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26  nReaders == 0 &&
de50: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
de60: 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29  bExclusive == 0)
de70: 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  {.       pFile->
de80: 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
de90: 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ve = TRUE;.     
dea0: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
deb0: 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45  Exclusive = TRUE
dec0: 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75 72 6e  ;.       bReturn
ded0: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
dee0: 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
def0: 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20  read-only lock? 
df00: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
df10: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
df20: 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
df30: 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 20 20  IRST &&.        
df40: 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65     nNumberOfByte
df50: 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
df60: 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
df70: 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
df80: 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20  ive == 0){.     
df90: 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52   pFile->local.nR
dfa0: 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20  eaders ++;.     
dfb0: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
dfc0: 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29  l.nReaders == 1)
dfd0: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
dfe0: 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
dff0: 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s ++;.      }.  
e000: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
e010: 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
e020: 20 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69   /* Want a pendi
e030: 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ng lock? */.  el
e040: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
e050: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
e060: 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20  )PENDING_BYTE.  
e070: 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d           && nNum
e080: 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
e090: 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f  Low == 1){.    /
e0a0: 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20  * If no pending 
e0b0: 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63  lock has been ac
e0c0: 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71  quired, then acq
e0d0: 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  uire it */.    i
e0e0: 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
e0f0: 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29  ->bPending == 0)
e100: 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
e110: 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
e120: 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70   = TRUE;.      p
e130: 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
e140: 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20  ding = TRUE;.   
e150: 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
e160: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
e170: 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76  /* Want a reserv
e180: 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ed lock? */.  el
e190: 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
e1a0: 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
e1b0: 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20  )RESERVED_BYTE. 
e1c0: 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
e1d0: 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
e1e0: 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
e1f0: 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
e200: 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20  d->bReserved == 
e210: 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0) {.      pFile
e220: 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
e230: 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
e240: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
e250: 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b  Reserved = TRUE;
e260: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
e270: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
e280: 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
e290: 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
e2a0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  tex);.  return b
e2b0: 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Return;.}../*.**
e2c0: 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
e2d0: 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b  on of the Unlock
e2e0: 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64  File API of Wind
e2f0: 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74  ows for CE.*/.st
e300: 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55  atic BOOL winceU
e310: 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  nlockFile(.  LPH
e320: 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
e330: 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
e340: 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
e350: 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
e360: 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
e370: 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
e380: 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  ow,.  DWORD nNum
e390: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
e3a0: 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
e3b0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
e3c0: 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
e3d0: 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
e3e0: 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
e3f0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
e400: 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
e410: 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
e420: 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
e430: 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
e440: 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
e450: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
e460: 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
e470: 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
e480: 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
e490: 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
e4a0: 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20   reader lock or 
e4b0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
e4c0: 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c  k */.  if (dwFil
e4d0: 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
e4e0: 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
e4f0: 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77  T){.    /* Did w
e500: 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  e have an exclus
e510: 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20  ive lock? */.   
e520: 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
e530: 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
e540: 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
e550: 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
e560: 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
e570: 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20  SHARED_SIZE);.  
e580: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
e590: 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  .bExclusive = FA
e5a0: 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
e5b0: 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
e5c0: 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
e5d0: 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
e5e0: 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  UE;.    }..    /
e5f0: 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61  * Did we just ha
e600: 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  ve a reader lock
e610: 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  ? */.    else if
e620: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
e630: 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
e640: 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
e650: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
e660: 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
e670: 44 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  D_SIZE.         
e680: 20 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66      || nNumberOf
e690: 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
e6a0: 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46   == 1);.      pF
e6b0: 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
e6c0: 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66  ers --;.      if
e6d0: 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
e6e0: 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20  Readers == 0).  
e6f0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46      {.        pF
e700: 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
e710: 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20  aders --;.      
e720: 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  }.      bReturn 
e730: 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
e740: 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e  }..  /* Releasin
e750: 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  g a pending lock
e760: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
e770: 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
e780: 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47  = (DWORD)PENDING
e790: 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20  _BYTE.          
e7a0: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
e7b0: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
e7c0: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
e7d0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
e7e0: 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
e7f0: 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
e800: 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
e810: 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
e820: 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b  Pending = FALSE;
e830: 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
e840: 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
e850: 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20  .  /* Releasing 
e860: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
e870: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
e880: 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
e890: 20 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44   (DWORD)RESERVED
e8a0: 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20  _BYTE.          
e8b0: 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
e8c0: 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
e8d0: 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
e8e0: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
e8f0: 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ved) {.      pFi
e900: 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
e910: 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ved = FALSE;.   
e920: 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
e930: 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41  ->bReserved = FA
e940: 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  LSE;.      bRetu
e950: 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
e960: 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
e970: 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
e980: 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
e990: 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a  rn bReturn;.}./*
e9a0: 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  .** End of the s
e9b0: 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20  pecial code for 
e9c0: 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  wince.**********
e9d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e9e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ***/.#endif /* S
ea20: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a  QLITE_OS_WINCE *
ea30: 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20  /../*.** Lock a 
ea40: 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a  file region..*/.
ea50: 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c  static BOOL winL
ea60: 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
ea70: 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
ea80: 4f 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f  ORD flags,.  DWO
ea90: 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  RD offsetLow,.  
eaa0: 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68  DWORD offsetHigh
eab0: 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
eac0: 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  esLow,.  DWORD n
ead0: 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23  umBytesHigh.){.#
eae0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
eaf0: 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54  CE.  /*.  ** NOT
eb00: 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73  E: Windows CE is
eb10: 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
eb20: 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74  ntly here due it
eb30: 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69  s lack of the Wi
eb40: 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41  n32.  **       A
eb50: 50 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a  PI LockFile..  *
eb60: 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65  /.  return wince
eb70: 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c  LockFile(phFile,
eb80: 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
eb90: 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20  etHigh,.        
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
ebb0: 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
ebc0: 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65  ytesHigh);.#else
ebd0: 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
ebe0: 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20  .    OVERLAPPED 
ebf0: 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ovlp;.    memset
ec00: 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f  (&ovlp, 0, sizeo
ec10: 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a  f(OVERLAPPED));.
ec20: 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20      ovlp.Offset 
ec30: 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20  = offsetLow;.   
ec40: 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68   ovlp.OffsetHigh
ec50: 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20   = offsetHigh;. 
ec60: 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b     return osLock
ec70: 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20  FileEx(*phFile, 
ec80: 66 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74  flags, 0, numByt
ec90: 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
eca0: 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d  igh, &ovlp);.  }
ecb0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
ecc0: 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46   osLockFile(*phF
ecd0: 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20  ile, offsetLow, 
ece0: 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42  offsetHigh, numB
ecf0: 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20  ytesLow,.       
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
ed10: 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20  umBytesHigh);.  
ed20: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
ed30: 2a 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20  * Unlock a file 
ed40: 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74  region.. */.stat
ed50: 69 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63  ic BOOL winUnloc
ed60: 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c  kFile(.  LPHANDL
ed70: 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52  E phFile,.  DWOR
ed80: 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  D offsetLow,.  D
ed90: 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c  WORD offsetHigh,
eda0: 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
edb0: 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75  sLow,.  DWORD nu
edc0: 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69  mBytesHigh.){.#i
edd0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
ede0: 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  E.  /*.  ** NOTE
edf0: 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
ee00: 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
ee10: 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
ee20: 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
ee30: 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50  32.  **       AP
ee40: 49 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20  I UnlockFile..  
ee50: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63  */.  return winc
ee60: 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69  eUnlockFile(phFi
ee70: 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
ee80: 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20  ffsetHigh,.     
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c      numBytesLow,
eeb0: 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
eec0: 23 65 6c 73 65 0a 20 20 69 66 28 20 69 73 4e 54  #else.  if( isNT
eed0: 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
eee0: 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d  PPED ovlp;.    m
eef0: 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20  emset(&ovlp, 0, 
ef00: 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
ef10: 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  D));.    ovlp.Of
ef20: 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77  fset = offsetLow
ef30: 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
ef40: 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69  tHigh = offsetHi
ef50: 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  gh;.    return o
ef60: 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70  sUnlockFileEx(*p
ef70: 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74  hFile, 0, numByt
ef80: 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
ef90: 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d  igh, &ovlp);.  }
efa0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
efb0: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70   osUnlockFile(*p
efc0: 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77  hFile, offsetLow
efd0: 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75  , offsetHigh, nu
efe0: 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20  mBytesLow,.     
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f000: 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29     numBytesHigh)
f010: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
f020: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
f030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a  **************.*
f070: 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70  * The next group
f080: 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70   of routines imp
f090: 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d  lement the I/O m
f0a0: 65 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64  ethods specified
f0b0: 0a 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74  .** by the sqlit
f0c0: 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
f0d0: 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ject..**********
f0e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  ****/../*.** Som
f130: 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70  e Microsoft comp
f140: 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20  ilers lack this 
f150: 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23  definition..*/.#
f160: 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53  ifndef INVALID_S
f170: 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
f180: 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44  # define INVALID
f190: 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
f1a0: 52 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65  R ((DWORD)-1).#e
f1b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ndif../*.** Move
f1c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
f1d0: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c  ition of the fil
f1e0: 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  e handle passed 
f1f0: 61 73 20 74 68 65 20 66 69 72 73 74 20 0a 2a 2a  as the first .**
f200: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66   argument to off
f210: 73 65 74 20 69 4f 66 66 73 65 74 20 77 69 74 68  set iOffset with
f220: 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20  in the file. If 
f230: 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
f240: 72 6e 20 30 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rn 0. .** Otherw
f250: 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e  ise, set pFile->
f260: 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65  lastErrno and re
f270: 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a  turn non-zero..*
f280: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
f290: 6b 57 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65  kWinFile(winFile
f2a0: 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33   *pFile, sqlite3
f2b0: 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b  _int64 iOffset){
f2c0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
f2d0: 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70  WINRT.  LONG upp
f2e0: 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20  erBits;         
f2f0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20          /* Most 
f300: 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20  sig. 32 bits of 
f310: 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  new offset */.  
f320: 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20  LONG lowerBits; 
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32  /* Least sig. 32
f350: 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66   bits of new off
f360: 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64  set */.  DWORD d
f370: 77 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  wRet;           
f380: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
f390: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53 65  e returned by Se
f3a0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a  tFilePointer() *
f3b0: 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  /.  DWORD lastEr
f3c0: 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
f3d0: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
f3e0: 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74  urned by GetLast
f3f0: 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 75 70  Error() */..  up
f400: 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  perBits = (LONG)
f410: 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26  ((iOffset>>32) &
f420: 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20   0x7fffffff);.  
f430: 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e  lowerBits = (LON
f440: 47 29 28 69 4f 66 66 73 65 74 20 26 20 30 78 66  G)(iOffset & 0xf
f450: 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20  fffffff);..  /* 
f460: 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73  API oddity: If s
f470: 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69  uccessful, SetFi
f480: 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75  lePointer() retu
f490: 72 6e 73 20 61 20 64 77 6f 72 64 20 0a 20 20 2a  rns a dword .  *
f4a0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
f4b0: 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f   lower 32-bits o
f4c0: 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f  f the new file-o
f4d0: 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74  ffset. Or, if it
f4e0: 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20   fails,.  ** it 
f4f0: 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f  returns INVALID_
f500: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
f510: 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64  . However accord
f520: 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 20 0a 20 20  ing to MSDN, .  
f530: 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ** INVALID_SET_F
f540: 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20  ILE_POINTER may 
f550: 61 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20  also be a valid 
f560: 6e 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74  new offset. So t
f570: 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a  o determine .  *
f580: 2a 20 77 68 65 74 68 65 72 20 61 6e 20 65 72 72  * whether an err
f590: 6f 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20  or has actually 
f5a0: 6f 63 63 75 72 72 65 64 2c 20 69 74 20 69 73 20  occurred, it is 
f5b0: 61 6c 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74  also necessary t
f5c0: 6f 20 63 61 6c 6c 20 0a 20 20 2a 2a 20 47 65 74  o call .  ** Get
f5d0: 4c 61 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a  LastError()..  *
f5e0: 2f 0a 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65  /.  dwRet = osSe
f5f0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69  tFilePointer(pFi
f600: 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73  le->h, lowerBits
f610: 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49  , &upperBits, FI
f620: 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66  LE_BEGIN);..  if
f630: 28 20 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49  ( (dwRet==INVALI
f640: 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
f650: 45 52 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61  ER.      && ((la
f660: 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
f670: 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f  astError())!=NO_
f680: 45 52 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70  ERROR)) ){.    p
f690: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
f6a0: 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
f6b0: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
f6c0: 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20  ITE_IOERR_SEEK, 
f6d0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
f6e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ,.             "
f6f0: 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20 70 46  seekWinFile", pF
f700: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
f710: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
f720: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73    return 0;.#els
f730: 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65  e.  /*.  ** Same
f740: 20 61 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70   as above, excep
f750: 74 20 74 68 61 74 20 74 68 69 73 20 69 6d 70 6c  t that this impl
f760: 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73  ementation works
f770: 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f   for WinRT..  */
f780: 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45  ..  LARGE_INTEGE
f790: 52 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  R x;            
f7a0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
f7b0: 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ffset */.  BOOL 
f7c0: 62 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  bRet;           
f7d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
f7e0: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
f7f0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
f800: 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50  () */..  x.QuadP
f810: 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20  art = iOffset;. 
f820: 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c   bRet = osSetFil
f830: 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65  ePointerEx(pFile
f840: 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f  ->h, x, 0, FILE_
f850: 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62  BEGIN);..  if(!b
f860: 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  Ret){.    pFile-
f870: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
f880: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
f890: 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
f8a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
f8b0: 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
f8c0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
f8d0: 20 22 73 65 65 6b 57 69 6e 46 69 6c 65 22 2c 20   "seekWinFile", 
f8e0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
f8f0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
f900: 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ..  return 0;.#e
f910: 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  ndif.}../* Forwa
f920: 72 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  rd references to
f930: 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a   VFS methods */.
f940: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
f950: 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a  mapfile(winFile*
f960: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  );../*.** Close 
f970: 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74  a file..**.** It
f980: 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 68 61   is reported tha
f990: 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  t an attempt to 
f9a0: 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d  close a handle m
f9b0: 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ight sometimes.*
f9c0: 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73  * fail.  This is
f9d0: 20 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e   a very unreason
f9e0: 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74  able result, but
f9f0: 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f   Windows is noto
fa00: 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69  rious.** for bei
fa10: 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  ng unreasonable 
fa20: 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62  so I do not doub
fa30: 74 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  t that it might 
fa40: 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74  happen.  If.** t
fa50: 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20  he close fails, 
fa60: 77 65 20 70 61 75 73 65 20 66 6f 72 20 31 30 30  we pause for 100
fa70: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e   milliseconds an
fa80: 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73  d try again.  As
fa90: 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43  .** many as MX_C
faa0: 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74  LOSE_ATTEMPT att
fab0: 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74  empts to close t
fac0: 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61  he handle are ma
fad0: 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76  de before.** giv
fae0: 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75 72  ing up and retur
faf0: 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
fb00: 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f  /.#define MX_CLO
fb10: 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61  SE_ATTEMPT 3.sta
fb20: 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65  tic int winClose
fb30: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
fb40: 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e  d){.  int rc, cn
fb50: 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65  t = 0;.  winFile
fb60: 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
fb70: 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
fb80: 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69 66 6e  t( id!=0 );.#ifn
fb90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fba0: 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20 70 46  WAL.  assert( pF
fbb0: 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  ile->pShm==0 );.
fbc0: 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45  #endif.  OSTRACE
fbd0: 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  (("CLOSE %d\n", 
fbe0: 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 61 73  pFile->h));.  as
fbf0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d  sert( pFile->h!=
fc00: 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68  NULL && pFile->h
fc10: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
fc20: 5f 56 41 4c 55 45 20 29 3b 0a 0a 20 20 72 63 20  _VALUE );..  rc 
fc30: 3d 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70  = winUnmapfile(p
fc40: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 21  File);.  if( rc!
fc50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
fc60: 75 72 6e 20 72 63 3b 0a 0a 20 20 64 6f 7b 0a 20  urn rc;..  do{. 
fc70: 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48     rc = osCloseH
fc80: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b  andle(pFile->h);
fc90: 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65  .    /* Simulate
fca0: 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63  IOError( rc=0; c
fcb0: 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  nt=MX_CLOSE_ATTE
fcc0: 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68  MPT; ); */.  }wh
fcd0: 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b  ile( rc==0 && ++
fce0: 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41  cnt < MX_CLOSE_A
fcf0: 54 54 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74  TTEMPT && (sqlit
fd00: 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31  e3_win32_sleep(1
fd10: 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53  00), 1) );.#if S
fd20: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
fd30: 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c  define WINCE_DEL
fd40: 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33  ETION_ATTEMPTS 3
fd50: 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c  .  winceDestroyL
fd60: 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66  ock(pFile);.  if
fd70: 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  ( pFile->zDelete
fd80: 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69  OnClose ){.    i
fd90: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
fda0: 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20  while(.         
fdb0: 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28    osDeleteFileW(
fdc0: 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
fdd0: 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20  Close)==0.      
fde0: 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74    && osGetFileAt
fdf0: 74 72 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d  tributesW(pFile-
fe00: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
fe10: 21 3d 30 78 66 66 66 66 66 66 66 66 20 0a 20 20  !=0xffffffff .  
fe20: 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c        && cnt++ <
fe30: 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f   WINCE_DELETION_
fe40: 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a  ATTEMPTS.    ){.
fe50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
fe60: 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b  in32_sleep(100);
fe70: 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74    /* Wait a litt
fe80: 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  le before trying
fe90: 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a   again */.    }.
fea0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
feb0: 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
fec0: 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e  nClose);.  }.#en
fed0: 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
fee0: 43 4c 4f 53 45 20 25 64 20 25 73 5c 6e 22 2c 20  CLOSE %d %s\n", 
fef0: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22  pFile->h, rc ? "
ff00: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
ff10: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
ff20: 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c    pFile->h = NUL
ff30: 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75  L;.  }.  OpenCou
ff40: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74 75  nter(-1);.  retu
ff50: 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f  rn rc ? SQLITE_O
ff60: 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a 20  K.            : 
ff70: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
ff80: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20  TE_IOERR_CLOSE, 
ff90: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
ffa0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ffb0: 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
ffc0: 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  Close", pFile->z
ffd0: 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Path);.}../*.** 
ffe0: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
fff0: 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
10000 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
10010 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
10020 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
10030 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
10040 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
10050 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
10060 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
10070 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28  tic int winRead(
10080 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
10090 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *id,          /*
100a0 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72   File to read fr
100b0 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  om */.  void *pB
100c0 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
100d0 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74     /* Write cont
100e0 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75  ent into this bu
100f0 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d  ffer */.  int am
10100 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
10110 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10120 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20  f bytes to read 
10130 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
10140 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20  64 offset       
10150 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
10160 20 61 74 20 74 68 69 73 20 6f 66 66 73 65 74 20   at this offset 
10170 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54  */.){.#if !SQLIT
10180 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 4f 56 45  E_OS_WINCE.  OVE
10190 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70  RLAPPED overlapp
101a0 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
101b0 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 52  The offset for R
101c0 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64  eadFile. */.#end
101d0 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  if.  winFile *pF
101e0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
101f0 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68 61 6e  id;  /* file han
10200 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6e  dle */.  DWORD n
10210 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  Read;           
10220 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10230 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
10240 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 66  ally read from f
10250 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ile */.  int nRe
10260 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  try = 0;        
10270 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10280 65 72 20 6f 66 20 72 65 74 72 79 73 20 2a 2f 0a  er of retrys */.
10290 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
102a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
102b0 74 3e 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  t>0 );.  Simulat
102c0 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
102d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
102e0 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  D);.  OSTRACE(("
102f0 52 45 41 44 20 25 64 20 6c 6f 63 6b 3d 25 64 5c  READ %d lock=%d\
10300 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46  n", pFile->h, pF
10310 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
10320 0a 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  ..  /* Deal with
10330 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
10340 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73   read request as
10350 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
10360 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
10370 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
10380 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
10390 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
103a0 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
103b0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
103c0 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
103d0 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
103e0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
103f0 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
10400 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
10410 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
10420 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74   amt);.      ret
10430 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10450 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74  int nCopy = (int
10460 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  )(pFile->mmapSiz
10470 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  e - offset);.   
10480 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
10490 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
104a0 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
104b0 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  set], nCopy);.  
104c0 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38      pBuf = &((u8
104d0 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b   *)pBuf)[nCopy];
104e0 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43  .      amt -= nC
104f0 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  opy;.      offse
10500 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t += nCopy;.    
10510 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54  }.  }..#if SQLIT
10520 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28  E_OS_WINCE.  if(
10530 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69   seekWinFile(pFi
10540 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a 20  le, offset) ){. 
10550 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10560 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69  _FULL;.  }.  whi
10570 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28  le( !osReadFile(
10580 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
10590 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20  amt, &nRead, 0) 
105a0 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65  ){.#else.  memse
105b0 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30  t(&overlapped, 0
105c0 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50  , sizeof(OVERLAP
105d0 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70  PED));.  overlap
105e0 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f  ped.Offset = (LO
105f0 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66  NG)(offset & 0xf
10600 66 66 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72  fffffff);.  over
10610 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67  lapped.OffsetHig
10620 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  h = (LONG)((offs
10630 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
10640 66 66 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 20  ffff);.  while( 
10650 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c  !osReadFile(pFil
10660 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
10670 20 26 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c 61   &nRead, &overla
10680 70 70 65 64 29 20 26 26 0a 20 20 20 20 20 20 20  pped) &&.       
10690 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
106a0 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45  ()!=ERROR_HANDLE
106b0 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20  _EOF ){.#endif. 
106c0 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72     DWORD lastErr
106d0 6e 6f 3b 0a 20 20 20 20 69 66 28 20 72 65 74 72  no;.    if( retr
106e0 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20  yIoerr(&nRetry, 
106f0 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f  &lastErrno) ) co
10700 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c  ntinue;.    pFil
10710 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
10720 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 65  astErrno;.    re
10730 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
10740 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  (SQLITE_IOERR_RE
10750 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AD, pFile->lastE
10760 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
10770 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46     "winRead", pF
10780 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
10790 0a 20 20 6c 6f 67 49 6f 65 72 72 28 6e 52 65 74  .  logIoerr(nRet
107a0 72 79 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64  ry);.  if( nRead
107b0 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20  <(DWORD)amt ){. 
107c0 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72     /* Unread par
107d0 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
107e0 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69   must be zero-fi
107f0 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  lled */.    mems
10800 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
10810 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74  )[nRead], 0, amt
10820 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 72 65 74  -nRead);.    ret
10830 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
10840 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
10850 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
10860 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  E_OK;.}../*.** W
10870 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61  rite data from a
10880 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66   buffer into a f
10890 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
108a0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
108b0 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68  s.** or some oth
108c0 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e  er error code on
108d0 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
108e0 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65  tic int winWrite
108f0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
10900 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20   *id,           
10910 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77      /* File to w
10920 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63  rite into */.  c
10930 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
10940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10950 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62  * The bytes to b
10960 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  e written */.  i
10970 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10990 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
109a0 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  s to write */.  
109b0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
109c0 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  fset            
109d0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74  /* Offset into t
109e0 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e  he file to begin
109f0 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29   writing at */.)
10a00 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  {.  int rc = 0; 
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 65      /* True if e
10a30 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
10a40 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f  d, else false */
10a50 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
10a60 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
10a70 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c  ;  /* File handl
10a80 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72  e */.  int nRetr
10a90 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
10aa0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10ab0 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a   of retries */..
10ac0 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
10ad0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  );.  assert( pFi
10ae0 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
10af0 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
10b00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
10b10 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  E);.  SimulateDi
10b20 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75  skfullError(retu
10b30 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b  rn SQLITE_FULL);
10b40 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  ..  OSTRACE(("WR
10b50 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e  ITE %d lock=%d\n
10b60 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69  ", pFile->h, pFi
10b70 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
10b80 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
10b90 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
10ba0 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61 73  write request as
10bb0 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
10bc0 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
10bd0 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
10be0 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
10bf0 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
10c00 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
10c10 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
10c20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
10c30 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
10c40 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
10c50 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46  mcpy(&((u8 *)(pF
10c60 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
10c70 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  )[offset], pBuf,
10c80 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74   amt);.      ret
10c90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10ca0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10cb0 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74  int nCopy = (int
10cc0 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  )(pFile->mmapSiz
10cd0 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  e - offset);.   
10ce0 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20     memcpy(&((u8 
10cf0 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
10d00 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
10d10 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  pBuf, nCopy);.  
10d20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38      pBuf = &((u8
10d30 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b   *)pBuf)[nCopy];
10d40 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43  .      amt -= nC
10d50 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  opy;.      offse
10d60 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t += nCopy;.    
10d70 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54  }.  }..#if SQLIT
10d80 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 72 63 20  E_OS_WINCE.  rc 
10d90 3d 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46  = seekWinFile(pF
10da0 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ile, offset);.  
10db0 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65 6c  if( rc==0 ){.#el
10dc0 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23 69  se.  {.#endif.#i
10dd0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
10de0 43 45 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  CE.    OVERLAPPE
10df0 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20  D overlapped;   
10e00 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73       /* The offs
10e10 65 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65  et for WriteFile
10e20 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  . */.#endif.    
10e30 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a  u8 *aRem = (u8 *
10e40 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a  )pBuf;        /*
10e50 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20   Data yet to be 
10e60 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
10e70 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20  nt nRem = amt;  
10e80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10e90 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
10ea0 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
10eb0 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e  n */.    DWORD n
10ec0 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
10ed0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
10ee0 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20  written by each 
10ef0 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c  WriteFile() call
10f00 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61   */.    DWORD la
10f10 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
10f20 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72  OR;   /* Value r
10f30 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
10f40 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69  stError() */..#i
10f50 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
10f60 43 45 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  CE.    memset(&o
10f70 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69  verlapped, 0, si
10f80 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
10f90 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65  );.    overlappe
10fa0 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47  d.Offset = (LONG
10fb0 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  )(offset & 0xfff
10fc0 66 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65 72  fffff);.    over
10fd0 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67  lapped.OffsetHig
10fe0 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  h = (LONG)((offs
10ff0 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
11000 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ffff);.#endif.. 
11010 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30     while( nRem>0
11020 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
11030 53 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 69 66  S_WINCE.      if
11040 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70  ( !osWriteFile(p
11050 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e  File->h, aRem, n
11060 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29  Rem, &nWrite, 0)
11070 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   ){.#else.      
11080 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65  if( !osWriteFile
11090 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c  (pFile->h, aRem,
110a0 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20   nRem, &nWrite, 
110b0 26 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a  &overlapped) ){.
110c0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
110d0 66 28 20 72 65 74 72 79 49 6f 65 72 72 28 26 6e  f( retryIoerr(&n
110e0 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e  Retry, &lastErrn
110f0 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  o) ) continue;. 
11100 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
11110 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
11120 72 74 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c  rt( nWrite==0 ||
11130 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52 44 29   nWrite<=(DWORD)
11140 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20 20 69 66  nRem );.      if
11150 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e  ( nWrite==0 || n
11160 57 72 69 74 65 3e 28 44 57 4f 52 44 29 6e 52 65  Write>(DWORD)nRe
11170 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  m ){.        las
11180 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
11190 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
111a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
111b0 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  }.#if !SQLITE_OS
111c0 5f 57 49 4e 43 45 0a 20 20 20 20 20 20 6f 66 66  _WINCE.      off
111d0 73 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20  set += nWrite;. 
111e0 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e       overlapped.
111f0 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28  Offset = (LONG)(
11200 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66  offset & 0xfffff
11210 66 66 66 29 3b 0a 20 20 20 20 20 20 6f 76 65 72  fff);.      over
11220 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67  lapped.OffsetHig
11230 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73  h = (LONG)((offs
11240 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
11250 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ffff);.#endif.  
11260 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69      aRem += nWri
11270 74 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d  te;.      nRem -
11280 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a  = nWrite;.    }.
11290 20 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29      if( nRem>0 )
112a0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
112b0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
112c0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
112d0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
112e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69   if( rc ){.    i
112f0 66 28 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61  f(   ( pFile->la
11300 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48  stErrno==ERROR_H
11310 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20  ANDLE_DISK_FULL 
11320 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46  ).       || ( pF
11330 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d  ile->lastErrno==
11340 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20  ERROR_DISK_FULL 
11350 29 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  )){.      return
11360 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
11370 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 77    }.    return w
11380 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
11390 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70  E_IOERR_WRITE, p
113a0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
113b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77  .             "w
113c0 69 6e 57 72 69 74 65 22 2c 20 70 46 69 6c 65 2d  inWrite", pFile-
113d0 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65  >zPath);.  }else
113e0 7b 0a 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 6e  {.    logIoerr(n
113f0 52 65 74 72 79 29 3b 0a 20 20 7d 0a 20 20 72 65  Retry);.  }.  re
11400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11410 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
11420 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
11430 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
11440 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
11450 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c   winTruncate(sql
11460 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73  ite3_file *id, s
11470 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
11480 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  te){.  winFile *
11490 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
114a0 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68  *)id;  /* File h
114b0 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  andle object */.
114c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
114d0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
114e0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
114f0 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69   for this functi
11500 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61  on */.  DWORD la
11510 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65  stErrno;..  asse
11520 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
11530 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41  OSTRACE(("TRUNCA
11540 54 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 70  TE %d %lld\n", p
11550 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 29  File->h, nByte))
11560 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
11570 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
11580 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
11590 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
115a0 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
115b0 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
115c0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
115d0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
115e0 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  * file so that i
115f0 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
11600 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
11610 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20  of chunks (i.e. 
11620 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
11630 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20  file size after 
11640 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61  the operation ma
11650 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  y be larger than
11660 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
11670 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a   ** size)..  */.
11680 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
11690 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42  hunk>0 ){.    nB
116a0 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
116b0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
116c0 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
116d0 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
116e0 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  hunk;.  }..  /* 
116f0 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72  SetEndOfFile() r
11700 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
11710 77 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c  when successful,
11720 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74   or zero when it
11730 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28   fails. */.  if(
11740 20 73 65 65 6b 57 69 6e 46 69 6c 65 28 70 46 69   seekWinFile(pFi
11750 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20  le, nByte) ){.  
11760 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
11770 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
11780 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d  TRUNCATE, pFile-
11790 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
117a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117b0 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31 22 2c   "winTruncate1",
117c0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
117d0 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f    }else if( 0==o
117e0 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46  sSetEndOfFile(pF
117f0 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20 20 20 20  ile->h) &&.     
11800 20 20 20 20 20 20 20 28 28 6c 61 73 74 45 72 72         ((lastErr
11810 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
11820 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 55 53  ror())!=ERROR_US
11830 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c 45 29 20  ER_MAPPED_FILE) 
11840 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
11850 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
11860 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  rno;.    rc = wi
11870 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
11880 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
11890 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
118a0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
118b0 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e          "winTrun
118c0 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a  cate2", pFile->z
118d0 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Path);.  }..  /*
118e0 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
118f0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20   truncated to a 
11900 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61  size smaller tha
11910 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a  n the currently.
11920 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
11930 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
11940 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
11950 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
11960 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20  QLite will.  ** 
11970 75 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77  use read() and w
11980 72 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73  rite() to access
11990 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69   data beyond thi
119a0 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77  s point from now
119b0 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   on..  */.  if( 
119c0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
119d0 6e 20 26 26 20 6e 42 79 74 65 3c 70 46 69 6c 65  n && nByte<pFile
119e0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
119f0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
11a00 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 0a  e = nByte;.  }..
11a10 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e    OSTRACE(("TRUN
11a20 43 41 54 45 20 25 64 20 25 6c 6c 64 20 25 73 5c  CATE %d %lld %s\
11a30 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42  n", pFile->h, nB
11a40 79 74 65 2c 20 72 63 20 3f 20 22 66 61 69 6c 65  yte, rc ? "faile
11a50 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72  d" : "ok"));.  r
11a60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
11a70 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
11a80 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20  /*.** Count the 
11a90 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79  number of fullsy
11aa0 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73  ncs and normal s
11ab0 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75  yncs.  This is u
11ac0 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74  sed to test.** t
11ad0 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75  hat syncs and fu
11ae0 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75  llsyncs are occu
11af0 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68  ring at the righ
11b00 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t times..*/.int 
11b10 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
11b20 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69  nt = 0;.int sqli
11b30 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75  te3_fullsync_cou
11b40 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
11b50 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
11b60 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
11b70 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
11b80 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
11b90 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63   disk..*/.static
11ba0 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c   int winSync(sql
11bb0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
11bc0 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64  nt flags){.#ifnd
11bd0 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
11be0 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64  C.  /*.  ** Used
11bf0 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54   only when SQLIT
11c00 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74  E_NO_SYNC is not
11c10 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a   defined..   */.
11c20 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69    BOOL rc;.#endi
11c30 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
11c40 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e  DEBUG) || !defin
11c50 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ed(SQLITE_NO_SYN
11c60 43 29 20 7c 7c 20 5c 0a 20 20 20 20 28 64 65 66  C) || \.    (def
11c70 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
11c80 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
11c90 49 54 45 5f 44 45 42 55 47 29 29 0a 20 20 2f 2a  ITE_DEBUG)).  /*
11ca0 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20  .  ** Used when 
11cb0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
11cc0 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e  s not defined an
11cd0 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 28  d by the assert(
11ce0 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53  ) and/or.  ** OS
11cf0 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a  TRACE() macros..
11d00 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20     */.  winFile 
11d10 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
11d20 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55  e*)id;.#else.  U
11d30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
11d40 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  id);.#endif..  a
11d50 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
11d60 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
11d70 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
11d80 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
11d90 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
11da0 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
11db0 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
11dc0 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
11dd0 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
11de0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
11df0 4c 0a 20 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  L.  );..  OSTRAC
11e00 45 28 28 22 53 59 4e 43 20 25 64 20 6c 6f 63 6b  E(("SYNC %d lock
11e10 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
11e20 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
11e30 65 29 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20  e));..  /* Unix 
11e40 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65  cannot, but some
11e50 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74   systems may ret
11e60 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
11e70 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a  from here. This.
11e80 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20    ** line is to 
11e90 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20  test that doing 
11ea0 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  so does not caus
11eb0 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a  e any problems..
11ec0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44    */.  SimulateD
11ed0 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65  iskfullError( re
11ee0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
11ef0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
11f00 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55 53 45  ITE_TEST.  UNUSE
11f10 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67  D_PARAMETER(flag
11f20 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  s);.#else.  if( 
11f30 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
11f40 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29  LITE_SYNC_FULL )
11f50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75  {.    sqlite3_fu
11f60 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
11f70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 79    }.  sqlite3_sy
11f80 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
11f90 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
11fa0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
11fb0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
11fc0 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
11fd0 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
11fe0 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
11ff0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
12000 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12010 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 6f  ;.#else.  rc = o
12020 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72  sFlushFileBuffer
12030 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53  s(pFile->h);.  S
12040 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
12050 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69 66  rc=FALSE );.  if
12060 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
12070 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12080 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
12090 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
120a0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
120b0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
120c0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
120d0 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65  ERR_FSYNC, pFile
120e0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
120f0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 79            "winSy
12100 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  nc", pFile->zPat
12110 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  h);.  }.#endif.}
12120 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
12130 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
12140 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
12150 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
12160 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  int winFileSize(
12170 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
12180 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
12190 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46 69  *pSize){.  winFi
121a0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
121b0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20  File*)id;.  int 
121c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
121d0 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
121e0 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
121f0 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
12200 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29  ITE_IOERR_FSTAT)
12210 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
12220 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20 46 49  WINRT.  {.    FI
12230 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49 4e 46 4f  LE_STANDARD_INFO
12240 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 6f   info;.    if( o
12250 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  sGetFileInformat
12260 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 28 70 46  ionByHandleEx(pF
12270 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53 74 61 6e  ile->h, FileStan
12280 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20 20 20 20  dardInfo,.      
12290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
122b0 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
122c0 6f 29 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 53  o)) ){.      *pS
122d0 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66  ize = info.EndOf
122e0 46 69 6c 65 2e 51 75 61 64 50 61 72 74 3b 0a 20  File.QuadPart;. 
122f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12300 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12310 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
12320 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r();.      rc = 
12330 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
12340 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20  TE_IOERR_FSTAT, 
12350 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
12360 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12370 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c           "winFil
12380 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  eSize", pFile->z
12390 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
123a0 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44  .#else.  {.    D
123b0 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 3b 0a  WORD upperBits;.
123c0 20 20 20 20 44 57 4f 52 44 20 6c 6f 77 65 72 42      DWORD lowerB
123d0 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c  its;.    DWORD l
123e0 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c  astErrno;..    l
123f0 6f 77 65 72 42 69 74 73 20 3d 20 6f 73 47 65 74  owerBits = osGet
12400 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e  FileSize(pFile->
12410 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a  h, &upperBits);.
12420 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28      *pSize = (((
12430 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 75 70  sqlite3_int64)up
12440 70 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20  perBits)<<32) + 
12450 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 69  lowerBits;.    i
12460 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20  f(   (lowerBits 
12470 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  == INVALID_FILE_
12480 53 49 5a 45 29 0a 20 20 20 20 20 20 20 26 26 20  SIZE).       && 
12490 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
124a0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
124b0 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20  =NO_ERROR) ){.  
124c0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
124d0 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
124e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
124f0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
12500 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69  IOERR_FSTAT, pFi
12510 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
12520 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
12530 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65  FileSize", pFile
12540 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
12550 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
12560 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
12570 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
12580 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e  MMEDIATELY is un
12590 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20  defined on some 
125a0 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e  Windows systems.
125b0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b  .*/.#ifndef LOCK
125c0 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
125d0 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c  ATELY.# define L
125e0 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
125f0 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69  EDIATELY 1.#endi
12600 66 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46  f..#ifndef LOCKF
12610 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ILE_EXCLUSIVE_LO
12620 43 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b  CK.# define LOCK
12630 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c  FILE_EXCLUSIVE_L
12640 4f 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OCK 2.#endif../*
12650 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 6c 79  .** Historically
12660 2c 20 53 51 4c 69 74 65 20 68 61 73 20 75 73 65  , SQLite has use
12670 64 20 62 6f 74 68 20 74 68 65 20 4c 6f 63 6b 46  d both the LockF
12680 69 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65  ile and LockFile
12690 45 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a  Ex functions..**
126a0 20 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b 46 69   When the LockFi
126b0 6c 65 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  le function was 
126c0 75 73 65 64 2c 20 69 74 20 77 61 73 20 61 6c 77  used, it was alw
126d0 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 20  ays expected to 
126e0 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  fail.** immediat
126f0 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ely if the lock 
12700 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f 62 74  could not be obt
12710 61 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20 69 74  ained.  Also, it
12720 20 61 6c 77 61 79 73 20 65 78 70 65 63 74 65 64   always expected
12730 20 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20 61 6e   to.** obtain an
12740 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
12750 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 61 72    These flags ar
12760 65 20 75 73 65 64 20 77 69 74 68 20 74 68 65 20  e used with the 
12770 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74  LockFileEx funct
12780 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66 6c 65  ion.** and refle
12790 63 74 20 74 68 6f 73 65 20 65 78 70 65 63 74 61  ct those expecta
127a0 74 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f 72 65  tions; therefore
127b0 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20 6e 6f  , they should no
127c0 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f  t be changed..*/
127d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
127e0 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 0a 23  LOCKFILE_FLAGS.#
127f0 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c   define SQLITE_L
12800 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20 20 20  OCKFILE_FLAGS   
12810 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49  (LOCKFILE_FAIL_I
12820 4d 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c 0a 20  MMEDIATELY | \. 
12830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12850 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
12860 49 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69 66  IVE_LOCK).#endif
12870 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e 74 6c  ../*.** Currentl
12880 79 2c 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  y, SQLite never 
12890 63 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b 46 69  calls the LockFi
128a0 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 20 77 69  leEx function wi
128b0 74 68 6f 75 74 20 77 61 6e 74 69 6e 67 20 74 68  thout wanting th
128c0 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 61 69  e.** call to fai
128d0 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66  l immediately if
128e0 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
128f0 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f   be obtained..*/
12900 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12910 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53  LOCKFILEEX_FLAGS
12920 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
12930 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47  _LOCKFILEEX_FLAG
12940 53 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  S (LOCKFILE_FAIL
12950 5f 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a 23 65  _IMMEDIATELY).#e
12960 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  ndif../*.** Acqu
12970 69 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63  ire a reader loc
12980 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20  k..** Different 
12990 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65  API routines are
129a0 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e   called dependin
129b0 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
129c0 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57  not this.** is W
129d0 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a  in9x or WinNT..*
129e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
129f0 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
12a00 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
12a10 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  res;.  if( isNT(
12a20 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
12a30 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a 0a  OS_WINCE.    /*.
12a40 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e      ** NOTE: Win
12a50 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
12a60 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
12a70 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
12a80 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
12a90 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c    **       API L
12aa0 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20 2a  ockFileEx..    *
12ab0 2f 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 63  /.    res = winc
12ac0 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  eLockFile(&pFile
12ad0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
12ae0 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6c  T, 0, 1, 0);.#el
12af0 73 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  se.    res = win
12b00 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
12b10 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
12b20 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48 41  ILEEX_FLAGS, SHA
12b30 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20  RED_FIRST, 0,.  
12b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b50 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
12b60 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a   0);.#endif.  }.
12b70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
12b80 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65  N32_HAS_ANSI.  e
12b90 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b  lse{.    int lk;
12ba0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
12bb0 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c  domness(sizeof(l
12bc0 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46  k), &lk);.    pF
12bd0 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
12be0 79 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c  yte = (short)((l
12bf0 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25  k & 0x7fffffff)%
12c00 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
12c10 29 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  ));.    res = wi
12c20 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
12c30 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
12c40 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20  FILE_FLAGS,.    
12c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c60 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70    SHARED_FIRST+p
12c70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
12c80 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  Byte, 0, 1, 0);.
12c90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
12ca0 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20   res == 0 ){.   
12cb0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
12cc0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
12cd0 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20  or();.    /* No 
12ce0 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61  need to log a fa
12cf0 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f  ilure to lock */
12d00 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
12d10 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  s;.}../*.** Undo
12d20 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73   a readlock.*/.s
12d30 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b  tatic int unlock
12d40 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
12d50 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
12d60 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  res;.  DWORD las
12d70 74 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 69 73  tErrno;.  if( is
12d80 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20  NT() ){.    res 
12d90 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28  = winUnlockFile(
12da0 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
12db0 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52  D_FIRST, 0, SHAR
12dc0 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d  ED_SIZE, 0);.  }
12dd0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
12de0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
12df0 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20  else{.    res = 
12e00 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
12e10 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
12e20 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61  FIRST+pFile->sha
12e30 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20  redLockByte, 0, 
12e40 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  1, 0);.  }.#endi
12e50 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26  f.  if( res==0 &
12e60 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20  & ((lastErrno = 
12e70 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
12e80 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43  )!=ERROR_NOT_LOC
12e90 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  KED) ){.    pFil
12ea0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
12eb0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
12ec0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
12ed0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70  _IOERR_UNLOCK, p
12ee0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
12ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 75  .             "u
12f00 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20  nlockReadLock", 
12f10 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
12f20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b   }.  return res;
12f30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
12f40 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
12f50 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
12f60 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63  by parameter loc
12f70 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  ktype - one.** o
12f80 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
12f90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
12fa0 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
12fb0 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
12fc0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
12fd0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
12fe0 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
12ff0 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
13000 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
13010 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
13020 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
13030 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
13040 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
13050 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
13060 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
13070 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
13080 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
13090 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
130a0 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
130b0 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
130c0 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
130d0 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
130e0 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
130f0 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
13100 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
13110 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
13120 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
13130 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
13140 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
13150 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
13160 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
13170 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
13180 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
13190 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
131a0 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
131b0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
131c0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
131d0 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
131e0 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
131f0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
13200 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
13210 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f  ck.  The winUnlo
13220 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ck() routine.** 
13230 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73  erases all locks
13240 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74   at once and ret
13250 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74  urns us immediat
13260 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c  ely to locking l
13270 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73  evel 0..** It is
13280 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
13290 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   lower the locki
132a0 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65  ng level one ste
132b0 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f  p at a time.  Yo
132c0 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72  u.** must go str
132d0 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67  aight to locking
132e0 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61   level 0..*/.sta
132f0 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28  tic int winLock(
13300 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13310 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
13320 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13330 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74  TE_OK;    /* Ret
13340 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
13350 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69  broutines */.  i
13360 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
13370 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
13380 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63  of a Windows loc
13390 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  k call */.  int 
133a0 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20  newLocktype;    
133b0 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d     /* Set pFile-
133c0 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69  >locktype to thi
133d0 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65  s value before e
133e0 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  xiting */.  int 
133f0 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
13400 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65   0;/* True if we
13410 20 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44   acquired a PEND
13420 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69  ING lock this ti
13430 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20  me */.  winFile 
13440 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
13450 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c  e*)id;.  DWORD l
13460 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52  astErrno = NO_ER
13470 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ROR;..  assert( 
13480 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41  id!=0 );.  OSTRA
13490 43 45 28 28 22 4c 4f 43 4b 20 25 64 20 25 64 20  CE(("LOCK %d %d 
134a0 77 61 73 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20  was %d(%d)\n",. 
134b0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
134c0 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 70 46  >h, locktype, pF
134d0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
134e0 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
134f0 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  Byte));..  /* If
13500 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
13510 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
13520 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
13530 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
13540 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f  .  ** OsFile, do
13550 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20   nothing. Don't 
13560 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b  use the end_lock
13570 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a  : exit path, as.
13580 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e    ** sqlite3OsEn
13590 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
135a0 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
135b0 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
135c0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c  ile->locktype>=l
135d0 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
135e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
135f0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
13600 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
13610 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
13620 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rect.  */.  asse
13630 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
13640 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ype!=NO_LOCK || 
13650 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
13660 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
13670 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e  t( locktype!=PEN
13680 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
13690 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
136a0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
136b0 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  | pFile->locktyp
136c0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
136d0 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65  ;..  /* Lock the
136e0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79   PENDING_LOCK by
136f0 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  te if we need to
13700 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   acquire a PENDI
13710 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20  NG lock or.  ** 
13720 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20  a SHARED lock.  
13730 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69 72  If we are acquir
13740 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ing a SHARED loc
13750 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74 69  k, the acquisiti
13760 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50  on of.  ** the P
13770 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65  ENDING_LOCK byte
13780 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20   is temporary.. 
13790 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70   */.  newLocktyp
137a0 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  e = pFile->lockt
137b0 79 70 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46  ype;.  if(   (pF
137c0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
137d0 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20  O_LOCK).     || 
137e0 28 20 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45  (   (locktype==E
137f0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20  XCLUSIVE_LOCK). 
13800 20 20 20 20 20 20 20 20 26 26 20 28 70 46 69 6c          && (pFil
13810 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  e->locktype==RES
13820 45 52 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  ERVED_LOCK)).  )
13830 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
13840 33 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e  3;.    while( cn
13850 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20  t-->0 && (res = 
13860 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
13870 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
13880 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20  CKFILE_FLAGS,.  
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138b0 20 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42         PENDING_B
138c0 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d  YTE, 0, 1, 0))==
138d0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72  0 ){.      /* Tr
138e0 79 20 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74  y 3 times to get
138f0 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63   the pending loc
13900 6b 2e 20 20 54 68 69 73 20 69 73 20 6e 65 65 64  k.  This is need
13910 65 64 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20  ed to work.     
13920 20 2a 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c   ** around probl
13930 65 6d 73 20 63 61 75 73 65 64 20 62 79 20 69 6e  ems caused by in
13940 64 65 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e  dexing and/or an
13950 74 69 2d 76 69 72 75 73 20 73 6f 66 74 77 61 72  ti-virus softwar
13960 65 20 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69  e on.      ** Wi
13970 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 20  ndows systems.. 
13980 20 20 20 20 20 2a 2a 20 49 66 20 79 6f 75 20 61       ** If you a
13990 72 65 20 75 73 69 6e 67 20 74 68 69 73 20 63 6f  re using this co
139a0 64 65 20 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f  de as a model fo
139b0 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20 56 46  r alternative VF
139c0 53 65 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20  Ses, do not.    
139d0 20 20 2a 2a 20 63 6f 70 79 20 74 68 69 73 20 72    ** copy this r
139e0 65 74 72 79 20 6c 6f 67 69 63 2e 20 20 49 74 20  etry logic.  It 
139f0 69 73 20 61 20 68 61 63 6b 20 69 6e 74 65 6e 64  is a hack intend
13a00 65 64 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f  ed for Windows o
13a10 6e 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nly..      */.  
13a20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 63 6f      OSTRACE(("co
13a30 75 6c 64 20 6e 6f 74 20 67 65 74 20 61 20 50 45  uld not get a PE
13a40 4e 44 49 4e 47 20 6c 6f 63 6b 2e 20 63 6e 74 3d  NDING lock. cnt=
13a50 25 64 5c 6e 22 2c 20 63 6e 74 29 29 3b 0a 20 20  %d\n", cnt));.  
13a60 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 73 71      if( cnt ) sq
13a70 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
13a80 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p(1);.    }.    
13a90 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
13aa0 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21 72   res;.    if( !r
13ab0 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74  es ){.      last
13ac0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
13ad0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
13ae0 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
13af0 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a  e a shared lock.
13b00 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
13b10 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
13b20 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
13b30 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
13b40 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
13b50 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 67 65 74  );.    res = get
13b60 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
13b70 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
13b80 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
13b90 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
13ba0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
13bb0 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
13bc0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
13bd0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
13be0 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
13bf0 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ED lock.  */.  i
13c00 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  f( locktype==RES
13c10 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65  ERVED_LOCK && re
13c20 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
13c30 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
13c40 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
13c50 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f  .    res = winLo
13c60 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
13c70 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
13c80 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45  E_FLAGS, RESERVE
13c90 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
13ca0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
13cb0 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
13cc0 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  pe = RESERVED_LO
13cd0 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
13ce0 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
13cf0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
13d00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
13d10 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e  /* Acquire a PEN
13d20 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  DING lock.  */. 
13d30 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
13d40 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
13d50 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c   res ){.    newL
13d60 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
13d70 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50  G_LOCK;.    gotP
13d80 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a  endingLock = 0;.
13d90 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
13da0 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
13db0 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
13dc0 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
13dd0 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  VE_LOCK && res )
13de0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
13df0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53  ile->locktype>=S
13e00 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
13e10 20 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65    res = unlockRe
13e20 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
13e30 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 72     OSTRACE(("unr
13e40 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c  eadlock = %d\n",
13e50 20 72 65 73 29 29 3b 0a 20 20 20 20 72 65 73 20   res));.    res 
13e60 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
13e70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
13e80 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20  LOCKFILE_FLAGS, 
13e90 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
13ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13eb0 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
13ec0 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ZE, 0);.    if( 
13ed0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
13ee0 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55  Locktype = EXCLU
13ef0 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  SIVE_LOCK;.    }
13f00 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
13f10 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
13f20 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
13f30 4f 53 54 52 41 43 45 28 28 22 65 72 72 6f 72 2d  OSTRACE(("error-
13f40 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c 20 6c 61  code = %d\n", la
13f50 73 74 45 72 72 6e 6f 29 29 3b 0a 20 20 20 20 20  stErrno));.     
13f60 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69   getReadLock(pFi
13f70 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  le);.    }.  }..
13f80 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68    /* If we are h
13f90 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47  olding a PENDING
13fa0 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74   lock that ought
13fb0 20 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c   to be released,
13fc0 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61   then.  ** relea
13fd0 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  se it now..  */.
13fe0 20 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67    if( gotPending
13ff0 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65  Lock && locktype
14000 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
14010 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
14020 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45  le(&pFile->h, PE
14030 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
14040 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
14050 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65  Update the state
14060 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73   of the lock has
14070 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c   held in the fil
14080 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65  e descriptor the
14090 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68  n.  ** return th
140a0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65  e appropriate re
140b0 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  sult code..  */.
140c0 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
140d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
140e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53  .  }else{.    OS
140f0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 46 41 49  TRACE(("LOCK FAI
14100 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f  LED %d trying fo
14110 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c  r %d but got %d\
14120 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
14130 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 74 79 70           locktyp
14140 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29  e, newLocktype))
14150 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  ;.    pFile->las
14160 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
14170 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  no;.    rc = SQL
14180 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20  ITE_BUSY;.  }.  
14190 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
141a0 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70  = (u8)newLocktyp
141b0 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
141c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
141d0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
141e0 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
141f0 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
14200 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
14210 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
14220 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
14230 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
14240 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74  ock is held, ret
14250 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c  urn.** non-zero,
14260 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f 2e   otherwise zero.
14270 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
14280 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  inCheckReservedL
14290 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
142a0 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
142b0 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ut){.  int rc;. 
142c0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
142d0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
142e0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
142f0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
14300 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
14310 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20  ERVEDLOCK; );.. 
14320 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
14330 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
14340 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45  ocktype>=RESERVE
14350 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63  D_LOCK ){.    rc
14360 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43   = 1;.    OSTRAC
14370 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
14380 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e   %d %d (local)\n
14390 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29  ", pFile->h, rc)
143a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
143b0 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  rc = winLockFile
143c0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
143d0 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
143e0 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  S, RESERVED_BYTE
143f0 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
14400 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
14410 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
14420 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45  File->h, RESERVE
14430 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
14440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
14450 20 21 72 63 3b 0a 20 20 20 20 4f 53 54 52 41 43   !rc;.    OSTRAC
14460 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
14470 20 25 64 20 25 64 20 28 72 65 6d 6f 74 65 29 5c   %d %d (remote)\
14480 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
14490 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ));.  }.  *pResO
144a0 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72  ut = rc;.  retur
144b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
144c0 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
144d0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
144e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
144f0 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e   id to locktype.
14500 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75    locktype.** mu
14510 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
14520 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
14530 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
14540 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
14550 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
14560 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
14570 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
14580 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
14590 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
145a0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
145b0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  no-op..**.** It 
145c0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
145d0 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
145e0 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20   to fail if the 
145f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
14600 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20  ** is NO_LOCK.  
14610 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
14620 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44  gument is SHARED
14630 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20  _LOCK then this 
14640 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74  routine.** might
14650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
14660 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  OERR;.*/.static 
14670 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73 71  int winUnlock(sq
14680 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
14690 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
146a0 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69 6e   int type;.  win
146b0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
146c0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  inFile*)id;.  in
146d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
146e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
146f0 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
14700 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52  ( locktype<=SHAR
14710 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53 54  ED_LOCK );.  OST
14720 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 64  RACE(("UNLOCK %d
14730 20 74 6f 20 25 64 20 77 61 73 20 25 64 28 25 64   to %d was %d(%d
14740 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
14750 6c 6f 63 6b 74 79 70 65 2c 0a 20 20 20 20 20 20  locktype,.      
14760 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
14770 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72  ype, pFile->shar
14780 65 64 4c 6f 63 6b 42 79 74 65 29 29 3b 0a 20 20  edLockByte));.  
14790 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  type = pFile->lo
147a0 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74 79  cktype;.  if( ty
147b0 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  pe>=EXCLUSIVE_LO
147c0 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
147d0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
147e0 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
147f0 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
14800 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63   0);.    if( loc
14810 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
14820 43 4b 20 26 26 20 21 67 65 74 52 65 61 64 4c 6f  CK && !getReadLo
14830 63 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ck(pFile) ){.   
14840 20 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c     /* This shoul
14850 64 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20  d never happen. 
14860 20 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79   We should alway
14870 73 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20  s be able to.   
14880 20 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20     ** reacquire 
14890 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f  the read lock */
148a0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
148b0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
148c0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47  OERR_UNLOCK, osG
148d0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
148f0 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65  inUnlock", pFile
14900 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
14910 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
14920 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
14930 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
14940 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45  le(&pFile->h, RE
14950 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
14960 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  1, 0);.  }.  if(
14970 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
14980 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52  CK && type>=SHAR
14990 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75  ED_LOCK ){.    u
149a0 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46  nlockReadLock(pF
149b0 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ile);.  }.  if( 
149c0 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type>=PENDING_LO
149d0 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
149e0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
149f0 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
14a00 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
14a10 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14a20 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b   = (u8)locktype;
14a30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14a40 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20  ./*.** If *pArg 
14a50 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e  is inititially n
14a60 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69  egative then thi
14a70 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53  s is a query.  S
14a80 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31  et *pArg to.** 1
14a90 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20   or 0 depending 
14aa0 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
14ab0 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46  t bit mask of pF
14ac0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69  ile->ctrlFlags i
14ad0 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  s set..**.** If 
14ae0 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c  *pArg is 0 or 1,
14af0 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73   then clear or s
14b00 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20  et the mask bit 
14b10 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
14b20 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ags..*/.static v
14b30 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77  oid winModeBit(w
14b40 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  inFile *pFile, u
14b50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73  nsigned char mas
14b60 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20  k, int *pArg){. 
14b70 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a   if( *pArg<0 ){.
14b80 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69      *pArg = (pFi
14b90 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
14ba0 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73  mask)!=0;.  }els
14bb0 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30  e if( (*pArg)==0
14bc0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
14bd0 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73  trlFlags &= ~mas
14be0 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
14bf0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
14c00 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a   |= mask;.  }.}.
14c10 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
14c20 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69  aration */.stati
14c30 63 20 69 6e 74 20 67 65 74 54 65 6d 70 6e 61 6d  c int getTempnam
14c40 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  e(int nBuf, char
14c50 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20   *zBuf);../*.** 
14c60 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71 75 65 72  Control and quer
14c70 79 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  y of the open fi
14c80 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
14c90 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c 65  atic int winFile
14ca0 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
14cb0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
14cc0 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
14cd0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
14ce0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
14cf0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
14d00 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
14d10 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
14d20 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
14d30 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  pArg = pFile->lo
14d40 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 72 65  cktype;.      re
14d50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14d60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
14d70 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
14d80 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
14d90 29 70 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69  )pArg = (int)pFi
14da0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
14db0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
14dc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
14dd0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
14de0 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b  TL_CHUNK_SIZE: {
14df0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a  .      pFile->sz
14e00 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29  Chunk = *(int *)
14e10 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75  pArg;.      retu
14e20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
14e30 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
14e40 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
14e50 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  INT: {.      if(
14e60 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e   pFile->szChunk>
14e70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
14e80 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a  ite3_int64 oldSz
14e90 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  ;.        int rc
14ea0 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 69   = winFileSize(i
14eb0 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20  d, &oldSz);.    
14ec0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14ed0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14ee0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
14ef0 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74   newSz = *(sqlit
14f00 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a  e3_int64*)pArg;.
14f10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 65            if( ne
14f20 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20  wSz>oldSz ){.   
14f30 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74           Simulat
14f40 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
14f50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
14f60 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28  c = winTruncate(
14f70 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20  id, newSz);.    
14f80 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
14f90 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
14fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
14fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14fc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
14fd0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
14fe0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
14ff0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
15000 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57  _FCNTL_PERSIST_W
15010 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d  AL: {.      winM
15020 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49  odeBit(pFile, WI
15030 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  NFILE_PERSIST_WA
15040 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  L, (int*)pArg);.
15050 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15060 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
15070 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
15080 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  NTL_POWERSAFE_OV
15090 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  ERWRITE: {.     
150a0 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
150b0 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c  e, WINFILE_PSOW,
150c0 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
150d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
150e0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
150f0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
15100 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
15110 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
15120 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
15130 74 66 28 22 77 69 6e 33 32 22 29 3b 0a 20 20 20  tf("win32");.   
15140 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15150 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
15160 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
15170 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a  _WIN32_AV_RETRY:
15180 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 20   {.      int *a 
15190 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20  = (int*)pArg;.  
151a0 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20 29      if( a[0]>0 )
151b0 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 33 32 49  {.        win32I
151c0 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d  oerrRetry = a[0]
151d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
151e0 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69         a[0] = wi
151f0 6e 33 32 49 6f 65 72 72 52 65 74 72 79 3b 0a 20  n32IoerrRetry;. 
15200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15210 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20   a[1]>0 ){.     
15220 20 20 20 77 69 6e 33 32 49 6f 65 72 72 52 65 74     win32IoerrRet
15230 72 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a  ryDelay = a[1];.
15240 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15250 20 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e 33       a[1] = win3
15260 32 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  2IoerrRetryDelay
15270 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15280 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15290 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
152a0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
152b0 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20  MPFILENAME: {.  
152c0 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65      char *zTFile
152d0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
152e0 5a 65 72 6f 28 20 70 46 69 6c 65 2d 3e 70 56 66  Zero( pFile->pVf
152f0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b  s->mxPathname );
15300 0a 20 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c  .      if( zTFil
15310 65 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 74  e ){.        get
15320 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e  Tempname(pFile->
15330 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
15340 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20  , zTFile);.     
15350 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
15360 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20   = zTFile;.     
15370 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
15380 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
15390 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
153a0 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49  _FCNTL_MMAP_LIMI
153b0 54 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  T: {.      pFile
153c0 2d 3e 6d 6d 61 70 4c 69 6d 69 74 20 3d 20 2a 28  ->mmapLimit = *(
153d0 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  i64*)pArg;.     
153e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
153f0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  K;.    }.  }.  r
15400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54  eturn SQLITE_NOT
15410 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  FOUND;.}../*.** 
15420 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f  Return the secto
15430 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  r size in bytes 
15440 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  of the underlyin
15450 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66  g block device f
15460 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66  or.** the specif
15470 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69  ied file. This i
15480 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20  s almost always 
15490 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d  512 bytes, but m
154a0 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20  ay be.** larger 
154b0 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73  for some devices
154c0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ..**.** SQLite c
154d0 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73  ode assumes this
154e0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74   function cannot
154f0 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61   fail. It also a
15500 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69  ssumes that.** i
15510 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20  f two files are 
15520 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73  created in the s
15530 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ame file-system 
15540 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a  directory (i.e..
15550 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e  ** a database an
15560 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69  d its journal fi
15570 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63  le) that the sec
15580 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65  tor size will be
15590 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72   the.** same for
155a0 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63   both..*/.static
155b0 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69   int winSectorSi
155c0 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
155d0 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64  *id){.  (void)id
155e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
155f0 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
15600 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _SIZE;.}../*.** 
15610 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20  Return a vector 
15620 6f 66 20 64 65 76 69 63 65 20 63 68 61 72 61 63  of device charac
15630 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74  teristics..*/.st
15640 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69  atic int winDevi
15650 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
15660 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
15670 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  id){.  winFile *
15680 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  p = (winFile*)id
15690 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
156a0 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41  E_IOCAP_UNDELETA
156b0 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a  BLE_WHEN_OPEN |.
156c0 20 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74           ((p->ct
156d0 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c  rlFlags & WINFIL
156e0 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49  E_PSOW)?SQLITE_I
156f0 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
15700 56 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a  VERWRITE:0);.}..
15710 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15720 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 20 0a 2a 2a 20  MIT_WAL../* .** 
15730 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c  Windows will onl
15740 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65  y let you create
15750 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69   file view mappi
15760 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61  ngs.** on alloca
15770 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c  tion size granul
15780 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73  arity boundaries
15790 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69  ..** During sqli
157a0 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65  te3_os_init() we
157b0 20 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49   do a GetSystemI
157c0 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20  nfo().** to get 
157d0 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20  the granularity 
157e0 73 69 7a 65 2e 0a 2a 2f 0a 53 59 53 54 45 4d 5f  size..*/.SYSTEM_
157f0 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b  INFO winSysInfo;
15800 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
15810 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61  unctions to obta
15820 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73  in and relinquis
15830 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  h the global mut
15840 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61  ex. The.** globa
15850 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20  l mutex is used 
15860 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 77  to protect the w
15870 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63  inLockInfo objec
15880 74 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 74  ts used by .** t
15890 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66  his file, all of
158a0 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 68   which may be sh
158b0 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65  ared by multiple
158c0 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20   threads..**.** 
158d0 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d  Function winShmM
158e0 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
158f0 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
15900 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
15910 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
15920 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
15930 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
15940 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
15950 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
15960 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
15970 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53  .g..**.**   winS
15980 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a  hmEnterMutex().*
15990 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 77 69  *     assert( wi
159a0 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
159b0 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65  );.**   winShmLe
159c0 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74  aveMutex().*/.st
159d0 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
159e0 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29  EnterMutex(void)
159f0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
15a00 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d  x_enter(sqlite3M
15a10 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
15a20 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
15a30 53 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63  STER));.}.static
15a40 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76   void winShmLeav
15a50 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  eMutex(void){.  
15a60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
15a70 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ave(sqlite3Mutex
15a80 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
15a90 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
15aa0 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c  ));.}.#ifdef SQL
15ab0 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
15ac0 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78   int winShmMutex
15ad0 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72  Held(void) {.  r
15ae0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75  eturn sqlite3_mu
15af0 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33  tex_held(sqlite3
15b00 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
15b10 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
15b20 41 53 54 45 52 29 29 3b 0a 7d 0a 23 65 6e 64 69  ASTER));.}.#endi
15b30 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  f../*.** Object 
15b40 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
15b50 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20  t a single file 
15b60 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70  opened and mmapp
15b70 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a  ed to provide.**
15b80 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
15b90 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74   When multiple t
15ba0 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72  hreads all refer
15bb0 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a  ence the same.**
15bc0 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61   log-summary, ea
15bd0 63 68 20 74 68 72 65 61 64 20 68 61 73 20 69 74  ch thread has it
15be0 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62  s own winFile ob
15bf0 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61  ject, but they a
15c00 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  ll.** point to a
15c10 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65   single instance
15c20 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e   of this object.
15c30 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
15c40 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75  , each.** log-su
15c50 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20  mmary is opened 
15c60 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72  only once per pr
15c70 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e  ocess..**.** win
15c80 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  ShmMutexHeld() m
15c90 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e  ust be true when
15ca0 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73   creating or des
15cb0 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20  troying.** this 
15cc0 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20  object or while 
15cd0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
15ce0 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
15cf0 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20   fields:.**.**  
15d00 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20      nRef.**     
15d10 20 70 4e 65 78 74 20 0a 2a 2a 0a 2a 2a 20 54 68   pNext .**.** Th
15d20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
15d30 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ds are read-only
15d40 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63   after the objec
15d50 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a  t is created:.**
15d60 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a   .**      fid.**
15d70 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a        zFilename.
15d80 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69 6e  **.** Either win
15d90 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75  ShmNode.mutex mu
15da0 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77 69  st be held or wi
15db0 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  nShmNode.nRef==0
15dc0 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75   and.** winShmMu
15dd0 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75  texHeld() is tru
15de0 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f  e when reading o
15df0 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74  r writing any ot
15e00 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20  her field.** in 
15e10 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
15e20 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  **.*/.struct win
15e30 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69  ShmNode {.  sqli
15e40 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
15e50 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
15e60 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
15e70 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
15e80 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
15e90 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
15ea0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77   the file */.  w
15eb0 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20  inFile hFile;   
15ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
15ed0 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69  e handle from wi
15ee0 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20  nOpen */..  int 
15ef0 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  szRegion;       
15f00 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
15f10 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
15f20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
15f30 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20   nRegion;       
15f40 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
15f50 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f  of array apRegio
15f60 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 68  n */.  struct Sh
15f70 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41  mRegion {.    HA
15f80 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20  NDLE hMap;      
15f90 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68         /* File h
15fa0 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61 74  andle from Creat
15fb0 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a  eFileMapping */.
15fc0 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a      void *pMap;.
15fd0 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20    } *aRegion;.  
15fe0 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
15ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
16000 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20  e Windows errno 
16010 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f  from the last I/
16020 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e  O error */..  in
16030 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
16040 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16050 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a  er of winShm obj
16060 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
16070 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68   this */.  winSh
16080 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
16090 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e        /* All win
160a0 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
160b0 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
160c0 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e    winShmNode *pN
160d0 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ext;         /* 
160e0 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20  Next in list of 
160f0 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  all winShmNode o
16100 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 64 65 66  bjects */.#ifdef
16110 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
16120 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20  u8 nextShmId;   
16130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
16140 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77 69 6e  xt available win
16150 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a  Shm.id value */.
16160 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
16170 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61 79 20   A global array 
16180 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64  of all winShmNod
16190 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a  e objects..**.**
161a0 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74 65 78   The winShmMutex
161b0 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74  Held() must be t
161c0 72 75 65 20 77 68 69 6c 65 20 72 65 61 64 69 6e  rue while readin
161d0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 69  g or writing thi
161e0 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  s list..*/.stati
161f0 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 77 69  c winShmNode *wi
16200 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 30  nShmNodeList = 0
16210 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75  ;../*.** Structu
16220 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  re used internal
16230 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20 74  ly by this VFS t
16240 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74 61  o record the sta
16250 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e  te of an.** open
16260 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63   shared memory c
16270 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  onnection..**.**
16280 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
16290 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69 61  ields are initia
162a0 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
162b0 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
162c0 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61  d and.** are rea
162d0 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74 65  d-only thereafte
162e0 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69 6e 53  r:.**.**    winS
162f0 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20  hm.pShmNode.**  
16300 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a    winShm.id.**.*
16310 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c  * All other fiel
16320 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  ds are read/writ
16330 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d 2e 70  e.  The winShm.p
16340 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 6d  ShmNode->mutex m
16350 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
16360 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61  hile accessing a
16370 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69  ny read/write fi
16380 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  elds..*/.struct 
16390 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e 53 68  winShm {.  winSh
163a0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
163b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
163c0 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  erlying winShmNo
163d0 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 77  de object */.  w
163e0 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20  inShm *pNext;   
163f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
16400 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20 74 68  t winShm with th
16410 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e 6f 64  e same winShmNod
16420 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74  e */.  u8 hasMut
16430 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
16440 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c    /* True if hol
16450 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68 6d 4e  ding the winShmN
16460 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75  ode mutex */.  u
16470 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  16 sharedMask;  
16480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
16490 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
164a0 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20  s held */.  u16 
164b0 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20  exclMask;       
164c0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
164d0 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
164e0 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 64 65 66  s held */.#ifdef
164f0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
16500 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20  u8 id;          
16510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64             /* Id
16520 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
16530 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e  ion with its win
16540 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69  ShmNode */.#endi
16550 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  f.};../*.** Cons
16560 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
16570 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
16580 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20  e WIN_SHM_BASE  
16590 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
165a0 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
165b0 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20    /* first lock 
165c0 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  byte */.#define 
165d0 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28  WIN_SHM_DMS    (
165e0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c  WIN_SHM_BASE+SQL
165f0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20  ITE_SHM_NLOCK)  
16600 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63  /* deadman switc
16610 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  h */../*.** Appl
16620 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  y advisory locks
16630 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73   for all n bytes
16640 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66   beginning at of
16650 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f  st..*/.#define _
16660 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65  SHM_UNLCK  1.#de
16670 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20  fine _SHM_RDLCK 
16680 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f   2.#define _SHM_
16690 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20  WRLCK  3.static 
166a0 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  int winShmSystem
166b0 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f  Lock(.  winShmNo
166c0 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a  de *pFile,    /*
166d0 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20   Apply locks to 
166e0 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64  this open shared
166f0 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
16700 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70  */.  int lockTyp
16710 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53  e,         /* _S
16720 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52  HM_UNLCK, _SHM_R
16730 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52  DLCK, or _SHM_WR
16740 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
16750 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
16760 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * Offset to firs
16770 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63  t byte to be loc
16780 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a  ked/unlocked */.
16790 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20    int nByte     
167a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
167b0 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
167c0 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a  ck or unlock */.
167d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
167e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
167f0 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c  sult code form L
16800 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  ock/UnlockFileEx
16810 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  () */..  /* Acce
16820 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d  ss to the winShm
16830 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
16840 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
16850 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
16860 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16870 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d  ex_held(pFile->m
16880 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e  utex) || pFile->
16890 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
168a0 20 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65   Release/Acquire
168b0 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
168c0 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  l lock */.  if( 
168d0 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55  lockType==_SHM_U
168e0 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  NLCK ){.    rc =
168f0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
16900 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
16910 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20  ofst, 0, nByte, 
16920 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
16930 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
16940 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
16950 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f  eters */.    DWO
16960 52 44 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43  RD dwFlags = LOC
16970 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
16980 49 41 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20  IATELY;.    if( 
16990 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d  lockType == _SHM
169a0 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73  _WRLCK ) dwFlags
169b0 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43   |= LOCKFILE_EXC
169c0 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20  LUSIVE_LOCK;.   
169d0 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c   rc = winLockFil
169e0 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  e(&pFile->hFile.
169f0 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74  h, dwFlags, ofst
16a00 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  , 0, nByte, 0);.
16a10 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 21    }.  .  if( rc!
16a20 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  = 0 ){.    rc = 
16a30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
16a40 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
16a50 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65  astErrno =  osGe
16a60 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
16a70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
16a80 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  SY;.  }..  OSTRA
16a90 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 25 64  CE(("SHM-LOCK %d
16aa0 20 25 73 20 25 73 20 30 78 25 30 38 6c 78 5c 6e   %s %s 0x%08lx\n
16ab0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 70  ", .           p
16ac0 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  File->hFile.h,. 
16ad0 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
16ae0 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
16af0 20 22 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 20   "failed",.     
16b00 20 20 20 20 20 20 6c 6f 63 6b 54 79 70 65 3d 3d        lockType==
16b10 5f 53 48 4d 5f 55 4e 4c 43 4b 20 3f 20 22 55 6e  _SHM_UNLCK ? "Un
16b20 6c 6f 63 6b 46 69 6c 65 45 78 22 20 3a 20 22 4c  lockFileEx" : "L
16b30 6f 63 6b 46 69 6c 65 45 78 22 2c 0a 20 20 20 20  ockFileEx",.    
16b40 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
16b50 73 74 45 72 72 6e 6f 29 29 3b 0a 0a 20 20 72 65  stErrno));..  re
16b60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46  turn rc;.}../* F
16b70 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
16b80 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73  s to VFS methods
16b90 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77   */.static int w
16ba0 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  inOpen(sqlite3_v
16bb0 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  fs*,const char*,
16bc0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e  sqlite3_file*,in
16bd0 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20  t,int*);.static 
16be0 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71  int winDelete(sq
16bf0 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73  lite3_vfs *,cons
16c00 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f  t char*,int);../
16c10 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77  *.** Purge the w
16c20 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  inShmNodeList li
16c30 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
16c40 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64  s with winShmNod
16c50 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a  e.nRef==0..**.**
16c60 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56   This is not a V
16c70 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
16c80 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61   method; it is a
16c90 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f   utility functio
16ca0 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56  n called.** by V
16cb0 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  FS shared-memory
16cc0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61   methods..*/.sta
16cd0 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50  tic void winShmP
16ce0 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73  urge(sqlite3_vfs
16cf0 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65   *pVfs, int dele
16d00 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68  teFlag){.  winSh
16d10 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69  mNode **pp;.  wi
16d20 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 42  nShmNode *p;.  B
16d30 4f 4f 4c 20 62 52 63 3b 0a 20 20 61 73 73 65 72  OOL bRc;.  asser
16d40 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  t( winShmMutexHe
16d50 6c 64 28 29 20 29 3b 0a 20 20 70 70 20 3d 20 26  ld() );.  pp = &
16d60 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a  winShmNodeList;.
16d70 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a 70    while( (p = *p
16d80 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  p)!=0 ){.    if(
16d90 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20   p->nRef==0 ){. 
16da0 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
16db0 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29    if( p->mutex )
16dc0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
16dd0 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20  ree(p->mutex);. 
16de0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
16df0 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29  p->nRegion; i++)
16e00 7b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20  {.        bRc = 
16e10 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
16e20 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
16e30 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  pMap);.        O
16e40 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
16e50 47 45 20 70 69 64 2d 25 64 20 75 6e 6d 61 70 20  GE pid-%d unmap 
16e60 72 65 67 69 6f 6e 3d 25 64 20 25 73 5c 6e 22 2c  region=%d %s\n",
16e70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16e80 20 20 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72    (int)osGetCurr
16e90 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
16ea0 69 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  i,.             
16eb0 20 20 20 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a      bRc ? "ok" :
16ec0 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
16ed0 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f       bRc = osClo
16ee0 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67  seHandle(p->aReg
16ef0 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20  ion[i].hMap);.  
16f00 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
16f10 53 48 4d 2d 50 55 52 47 45 20 70 69 64 2d 25 64  SHM-PURGE pid-%d
16f20 20 63 6c 6f 73 65 20 72 65 67 69 6f 6e 3d 25 64   close region=%d
16f30 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %s\n",.        
16f40 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 6f 73           (int)os
16f50 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
16f60 73 49 64 28 29 2c 20 69 2c 0a 20 20 20 20 20 20  sId(), i,.      
16f70 20 20 20 20 20 20 20 20 20 20 20 62 52 63 20 3f             bRc ?
16f80 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
16f90 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
16fa0 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e 68    if( p->hFile.h
16fb0 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46 69  !=NULL && p->hFi
16fc0 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  le.h!=INVALID_HA
16fd0 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
16fe0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
16ff0 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
17000 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73 65          winClose
17010 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
17020 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20 20  )&p->hFile);.   
17030 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
17040 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
17050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
17060 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a 20   deleteFlag ){. 
17070 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
17080 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
17090 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
170a0 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
170b0 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  c();.        win
170c0 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d 3e  Delete(pVfs, p->
170d0 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20  zFilename, 0);. 
170e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
170f0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
17100 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74  .        Simulat
17110 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
17120 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17130 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
17140 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
17150 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29 3b  ree(p->aRegion);
17160 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
17170 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c 73  ree(p);.    }els
17180 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26 70  e{.      pp = &p
17190 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
171a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e   }.}../*.** Open
171b0 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
171c0 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74  ry area associat
171d0 65 64 20 77 69 74 68 20 64 61 74 61 62 61 73 65  ed with database
171e0 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a 0a   file pDbFd..**.
171f0 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** When opening 
17200 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d  a new shared-mem
17210 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20  ory file, if no 
17220 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20  other instances 
17230 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20  of that.** file 
17240 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  are currently op
17250 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63  en, in this proc
17260 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20  ess or in other 
17270 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a  processes, then.
17280 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74  ** the file must
17290 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
172a0 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20   zero length or 
172b0 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20  have its header 
172c0 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  cleared..*/.stat
172d0 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53 68  ic int winOpenSh
172e0 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46 69  aredMemory(winFi
172f0 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74  le *pDbFd){.  st
17300 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b 20  ruct winShm *p; 
17310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17320 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
17330 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
17340 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53  */.  struct winS
17350 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
17360 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 75   = 0;   /* The u
17370 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
17380 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
17390 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
173b0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
173c0 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
173d0 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20 20  Node *pNew;     
173e0 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
173f0 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d 4e  llocated winShmN
17400 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ode */.  int nNa
17410 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
17420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
17430 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e 20  ize of zName in 
17440 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65  bytes */..  asse
17450 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d  rt( pDbFd->pShm=
17460 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74 20  =0 );    /* Not 
17470 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 65  previously opene
17480 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  d */..  /* Alloc
17490 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
174a0 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73 68  e new sqlite3_sh
174b0 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f 20  m object.  Also 
174c0 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20 20  speculatively.  
174d0 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  ** allocate spac
174e0 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e 53  e for a new winS
174f0 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65 6e  hmNode and filen
17500 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20  ame..  */.  p = 
17510 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
17520 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  o( sizeof(*p) );
17530 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
17540 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
17550 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65  R_NOMEM;.  nName
17560 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
17570 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  30(pDbFd->zPath)
17580 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
17590 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
175a0 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20  zeof(*pShmNode) 
175b0 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a  + nName + 17 );.
175c0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
175d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
175e0 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
175f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
17600 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  MEM;.  }.  pNew-
17610 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
17620 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
17630 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
17640 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d  (nName+15, pNew-
17650 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  >zFilename, "%s-
17660 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  shm", pDbFd->zPa
17670 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69  th);.  sqlite3Fi
17680 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d  leSuffix3(pDbFd-
17690 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46  >zPath, pNew->zF
176a0 69 6c 65 6e 61 6d 65 29 3b 20 0a 0a 20 20 2f 2a  ilename); ..  /*
176b0 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20   Look to see if 
176c0 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 69 73  there is an exis
176d0 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ting winShmNode 
176e0 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
176f0 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74  ..  ** If no mat
17700 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  ching winShmNode
17710 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
17720 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  s, create a new 
17730 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53  one..  */.  winS
17740 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  hmEnterMutex();.
17750 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d    for(pShmNode =
17760 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b   winShmNodeList;
17770 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e   pShmNode; pShmN
17780 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e  ode=pShmNode->pN
17790 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44  ext){.    /* TBD
177a0 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70   need to come up
177b0 20 77 69 74 68 20 62 65 74 74 65 72 20 6d 61 74   with better mat
177c0 63 68 20 68 65 72 65 2e 20 20 50 65 72 68 61 70  ch here.  Perhap
177d0 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c  s.    ** use FIL
177e0 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e  E_ID_BOTH_DIR_IN
177f0 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20  FO Structure..  
17800 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
17810 69 74 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d  ite3StrICmp(pShm
17820 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
17830 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
17840 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
17850 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  }.  if( pShmNode
17860 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
17870 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65  free(pNew);.  }e
17880 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  lse{.    pShmNod
17890 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e  e = pNew;.    pN
178a0 65 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69  ew = 0;.    ((wi
178b0 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64  nFile*)(&pShmNod
178c0 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20  e->hFile))->h = 
178d0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
178e0 41 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  ALUE;.    pShmNo
178f0 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53  de->pNext = winS
17900 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20  hmNodeList;.    
17910 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d  winShmNodeList =
17920 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20   pShmNode;..    
17930 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
17940 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
17950 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
17960 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66  EX_FAST);.    if
17970 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
17980 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  x==0 ){.      rc
17990 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
179a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
179b0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
179c0 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20      }..    rc = 
179d0 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d 3e 70  winOpen(pDbFd->p
179e0 56 66 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Vfs,.           
179f0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
17a00 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20  zFilename,      
17a10 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
17a20 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d  f the file (UTF-
17a30 38 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  8) */.          
17a40 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
17a50 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  file*)&pShmNode-
17a60 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46 69 6c 65  >hFile,  /* File
17a70 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
17a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a90 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
17aa0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
17ab0 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
17ac0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 0a 20  E_OPEN_CREATE,. 
17ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ae0 30 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  0);.    if( SQLI
17af0 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20  TE_OK!=rc ){.   
17b00 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
17b10 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
17b20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
17b30 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63   if another proc
17b40 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
17b50 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74  he dead-man swit
17b60 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f  ch..    ** If no
17b70 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  t, truncate the 
17b80 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
17b90 67 74 68 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20  gth. .    */.   
17ba0 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73 74 65   if( winShmSyste
17bb0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
17bc0 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f  _SHM_WRLCK, WIN_
17bd0 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c  SHM_DMS, 1)==SQL
17be0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17bf0 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
17c00 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
17c10 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
17c20 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  e, 0);.      if(
17c30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17c40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
17c50 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
17c60 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c  E_IOERR_SHMOPEN,
17c70 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
17c80 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
17c90 20 20 20 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22      "winOpenShm"
17ca0 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
17cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17cc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
17cd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 69  E_OK ){.      wi
17ce0 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
17cf0 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e  ShmNode, _SHM_UN
17d00 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
17d10 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , 1);.      rc =
17d20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
17d30 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
17d40 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f  _RDLCK, WIN_SHM_
17d50 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  DMS, 1);.    }. 
17d60 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
17d70 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
17d80 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68   }..  /* Make th
17d90 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e  e new connection
17da0 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20   a child of the 
17db0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
17dc0 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
17dd0 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53  hmNode;.#ifdef S
17de0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
17df0 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
17e00 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
17e10 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
17e20 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
17e30 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e  >pShm = p;.  win
17e40 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  ShmLeaveMutex();
17e50 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72  ..  /* The refer
17e60 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53  ence count on pS
17e70 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61  hmNode has alrea
17e80 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e  dy been incremen
17e90 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74  ted under.  ** t
17ea0 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20  he cover of the 
17eb0 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
17ec0 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
17ed0 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
17ee0 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
17ef0 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63  ct winShm) objec
17f00 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64  t to the pShmNod
17f10 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  e has been set. 
17f20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  All that is.  **
17f30 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20 74   left to do is t
17f40 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f  o link the new o
17f50 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20 6c  bject into the l
17f60 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72 74  inked list start
17f70 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d  ing.  ** at pShm
17f80 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54 68  Node->pFirst. Th
17f90 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65 20  is must be done 
17fa0 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68  while holding th
17fb0 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e pShmNode->mute
17fc0 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20  x .  ** mutex.. 
17fd0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
17fe0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
17ff0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d  de->mutex);.  p-
18000 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64  >pNext = pShmNod
18010 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68  e->pFirst;.  pSh
18020 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20  mNode->pFirst = 
18030 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  p;.  sqlite3_mut
18040 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
18050 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
18060 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
18070 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f    /* Jump here o
18080 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73  n any error */.s
18090 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77  hm_open_err:.  w
180a0 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
180b0 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
180c0 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  NLCK, WIN_SHM_DM
180d0 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50  S, 1);.  winShmP
180e0 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
180f0 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68  , 0);      /* Th
18100 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
18110 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
18120 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
18130 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  free(p);.  sqlit
18140 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
18150 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
18160 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
18170 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
18180 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
18190 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
181a0 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
181b0 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61  rlying .** stora
181c0 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67  ge if deleteFlag
181d0 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61   is true..*/.sta
181e0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e  tic int winShmUn
181f0 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  map(.  sqlite3_f
18200 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
18210 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
18220 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
18230 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c  ory */.  int del
18240 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20  eteFlag         
18250 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66      /* Delete af
18260 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74  ter closing if t
18270 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  rue */.){.  winF
18280 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
18290 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
182a0 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lding shared-mem
182b0 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ory */.  winShm 
182c0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p;            /
182d0 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
182e0 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f   to be closed */
182f0 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
18300 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20  ShmNode; /* The 
18310 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
18320 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
18330 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20  .  winShm **pp; 
18340 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
18350 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
18360 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
18370 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28   */..  pDbFd = (
18380 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  winFile*)fd;.  p
18390 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
183a0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
183b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
183c0 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
183d0 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52  ShmNode;..  /* R
183e0 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
183f0 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
18400 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
18410 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
18420 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
18430 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
18440 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
18450 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
18460 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
18470 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
18480 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
18490 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
184a0 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
184b0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
184c0 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
184d0 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
184e0 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
184f0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
18500 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
18510 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
18520 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
18530 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
18540 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
18550 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
18560 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
18570 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
18580 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65  rMutex();.  asse
18590 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  rt( pShmNode->nR
185a0 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f  ef>0 );.  pShmNo
185b0 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  de->nRef--;.  if
185c0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
185d0 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68  ==0 ){.    winSh
185e0 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56  mPurge(pDbFd->pV
185f0 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b  fs, deleteFlag);
18600 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61  .  }.  winShmLea
18610 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65  veMutex();..  re
18620 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18630 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
18640 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66  the lock state f
18650 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f  or a shared-memo
18660 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73  ry segment..*/.s
18670 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
18680 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  Lock(.  sqlite3_
18690 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
186a0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
186b0 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
186c0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
186d0 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
186e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
186f0 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61   First lock to a
18700 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
18710 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  e */.  int n,   
18720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18730 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
18740 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20  ocks to acquire 
18750 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
18760 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
18770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
18780 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
18790 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77  e lock */.){.  w
187a0 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  inFile *pDbFd = 
187b0 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20  (winFile*)fd;   
187c0 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
187d0 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  on holding share
187e0 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69  d memory */.  wi
187f0 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d  nShm *p = pDbFd-
18800 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  >pShm;          
18810 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
18820 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c  d memory being l
18830 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68  ocked */.  winSh
18840 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20  m *pX;          
18850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18860 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
18870 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
18880 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
18890 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  e *pShmNode = p-
188a0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  >pShmNode;.  int
188b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
188c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188d0 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
188e0 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b  e */.  u16 mask;
188f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18910 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
18920 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   take or release
18930 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f   */..  assert( o
18940 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
18950 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
18960 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
18970 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
18980 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
18990 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
189a0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
189b0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
189c0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
189d0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
189e0 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
189f0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
18a00 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
18a10 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
18a20 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
18a30 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
18a40 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
18a50 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
18a60 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
18a70 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
18a80 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
18a90 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20  )!=0 );..  mask 
18aa0 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66  = (u16)((1U<<(of
18ab0 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66  st+n)) - (1U<<of
18ac0 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  st));.  assert( 
18ad0 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c  n>1 || mask==(1<
18ae0 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69  <ofst) );.  sqli
18af0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
18b00 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
18b10 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
18b20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
18b30 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  K ){.    u16 all
18b40 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73  Mask = 0; /* Mas
18b50 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  k of locks held 
18b60 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a  by siblings */..
18b70 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e      /* See if an
18b80 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20  y siblings hold 
18b90 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a  this same lock *
18ba0 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
18bb0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
18bc0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
18bd0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  {.      if( pX==
18be0 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
18bf0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d      assert( (pX-
18c00 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e  >exclMask & (p->
18c10 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72  exclMask|p->shar
18c20 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20  edMask))==0 );. 
18c30 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20       allMask |= 
18c40 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
18c50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
18c60 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d  lock the system-
18c70 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  level locks */. 
18c80 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61     if( (mask & a
18c90 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  llMask)==0 ){.  
18ca0 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
18cb0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
18cc0 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20  de, _SHM_UNLCK, 
18cd0 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
18ce0 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
18cf0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
18d00 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
18d10 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
18d20 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
18d30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18d40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
18d50 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
18d60 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
18d70 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
18d80 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20  .    } .  }else 
18d90 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
18da0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
18db0 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
18dc0 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
18dd0 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
18de0 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
18df0 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
18e00 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
18e10 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
18e20 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
18e30 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
18e40 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
18e50 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
18e60 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
18e70 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
18e80 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
18e90 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
18ea0 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
18eb0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
18ec0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
18ed0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
18ee0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
18ef0 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
18f00 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
18f10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
18f20 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
18f30 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
18f40 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
18f50 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
18f60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
18f70 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
18f80 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
18f90 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
18fa0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
18fb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
18fc0 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
18fd0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
18fe0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
18ff0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
19000 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
19010 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
19020 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
19030 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
19040 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19050 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
19060 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
19070 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
19080 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
19090 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
190a0 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
190b0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
190c0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
190d0 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
190e0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
190f0 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
19100 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
19110 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
19120 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
19130 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
19140 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
19150 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
19160 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
19170 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
19180 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
19190 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
191a0 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
191b0 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
191c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
191d0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
191e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
191f0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
19200 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75  /* Get the exclu
19210 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68  sive locks at th
19220 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20  e system level. 
19230 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73   Then if success
19240 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ful.    ** also 
19250 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
19260 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
19270 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a  ng locked..    *
19280 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
19290 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
192a0 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
192b0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
192c0 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73   _SHM_WRLCK, ofs
192d0 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
192e0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
192f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19300 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
19310 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  p->sharedMask & 
19320 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  mask)==0 );.    
19330 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
19340 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  |= mask;.      }
19350 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
19360 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
19370 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
19380 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
19390 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64  HM-LOCK shmid-%d
193a0 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33  , pid-%d got %03
193b0 78 2c 25 30 33 78 20 25 73 5c 6e 22 2c 0a 20 20  x,%03x %s\n",.  
193c0 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20           p->id, 
193d0 28 69 6e 74 29 6f 73 47 65 74 43 75 72 72 65 6e  (int)osGetCurren
193e0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 2d  tProcessId(), p-
193f0 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
19400 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20  exclMask,.      
19410 20 20 20 20 20 72 63 20 3f 20 22 66 61 69 6c 65       rc ? "faile
19420 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 20 20 72  d" : "ok"));.  r
19430 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19440 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d  ** Implement a m
19450 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72  emory barrier or
19460 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e   memory fence on
19470 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
19480 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64   .**.** All load
19490 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67  s and stores beg
194a0 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61  un before the ba
194b0 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c  rrier must compl
194c0 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ete before.** an
194d0 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20  y load or store 
194e0 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20  begun after the 
194f0 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74  barrier..*/.stat
19500 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61  ic void winShmBa
19510 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
19520 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
19530 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
19540 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
19550 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
19560 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
19570 52 28 66 64 29 3b 0a 20 20 2f 2a 20 4d 65 6d 6f  R(fd);.  /* Memo
19580 72 79 42 61 72 72 69 65 72 28 29 3b 20 2f 2f 20  ryBarrier(); // 
19590 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 2d 2d  does not work --
195a0 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 77 68 79   do not know why
195b0 20 6e 6f 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d   not */.  winShm
195c0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
195d0 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
195e0 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ();.}../*.** Thi
195f0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
19600 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
19610 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69   pointer to regi
19620 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68  on iRegion of th
19630 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  e .** shared-mem
19640 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
19650 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
19660 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64   file fd. Shared
19670 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
19680 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64  .** are numbered
19690 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a   starting from z
196a0 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64  ero. Each shared
196b0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69  -memory region i
196c0 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62  s szRegion .** b
196d0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
196e0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
196f0 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
19700 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
19710 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74  d and *pp is set
19720 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
19730 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
19740 65 20 69 73 57 72 69 74 65 20 70 61 72 61 6d 65  e isWrite parame
19750 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65  ter is 0 and the
19760 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
19770 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69  d-memory.** regi
19780 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  on has not been 
19790 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e  allocated (by an
197a0 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64  y client, includ
197b0 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20  ing one running 
197c0 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65  in a.** separate
197d0 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20   process), then 
197e0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
197f0 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
19800 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a   returned. If .*
19810 2a 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e  * isWrite is non
19820 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65  -zero and the re
19830 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
19840 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
19850 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65   not yet .** bee
19860 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
19870 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  is allocated by 
19880 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
19890 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72  *.** If the shar
198a0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
198b0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
198c0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69  n allocated or i
198d0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
198e0 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64  * this call as d
198f0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20  escribed above, 
19900 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65  then it is mappe
19910 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
19920 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73  esses .** addres
19930 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69  s space (if it i
19940 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20  s not already), 
19950 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f  *pp is set to po
19960 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65  int to the mappe
19970 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64  d .** memory and
19980 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
19990 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
199a0 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20  nt winShmMap(.  
199b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
199c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
199d0 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f  /* Handle open o
199e0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
199f0 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e  */.  int iRegion
19a00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19a10 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74       /* Region t
19a20 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20  o retrieve */.  
19a30 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20  int szRegion,   
19a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a50 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f  /* Size of regio
19a60 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72  ns */.  int isWr
19a70 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
19a80 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
19a90 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69  to extend file i
19aa0 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
19ab0 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a   void volatile *
19ac0 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20  *pp             
19ad0 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20   /* OUT: Mapped 
19ae0 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77  memory */.){.  w
19af0 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  inFile *pDbFd = 
19b00 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20  (winFile*)fd;.  
19b10 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  winShm *p = pDbF
19b20 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68  d->pShm;.  winSh
19b30 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
19b40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19b50 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70  TE_OK;..  if( !p
19b60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
19b70 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
19b80 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28  (pDbFd);.    if(
19b90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19ba0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19bb0 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
19bc0 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20  .  }.  pShmNode 
19bd0 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
19be0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
19bf0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
19c00 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
19c10 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d  ( szRegion==pShm
19c20 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c  Node->szRegion |
19c30 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  | pShmNode->nReg
19c40 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  ion==0 );..  if(
19c50 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
19c60 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20  on<=iRegion ){. 
19c70 20 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67     struct ShmReg
19c80 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20 20 20 20  ion *apNew;     
19c90 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 52 65        /* New aRe
19ca0 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  gion[] array */.
19cb0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
19cc0 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65  (iRegion+1)*szRe
19cd0 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  gion;  /* Minimu
19ce0 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20  m required file 
19cf0 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  size */.    sqli
19d00 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20  te3_int64 sz;   
19d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19d20 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  * Current size o
19d30 66 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  f wal-index file
19d40 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64   */..    pShmNod
19d50 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a  e->szRegion = sz
19d60 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20  Region;..    /* 
19d70 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
19d80 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
19d90 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
19da0 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
19db0 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65  pace..    ** Che
19dc0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
19dd0 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
19de0 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20  ed (i.e. if the 
19df0 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69  wal-index file i
19e00 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65  s.    ** large e
19e10 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e  nough to contain
19e20 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
19e30 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20  egion)..    */. 
19e40 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53     rc = winFileS
19e50 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ize((sqlite3_fil
19e60 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  e *)&pShmNode->h
19e70 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20  File, &sz);.    
19e80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19e90 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
19ea0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
19eb0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
19ec0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
19ed0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
19ee0 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c     "winShmMap1",
19ef0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
19f00 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
19f10 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
19f20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20     if( sz<nByte 
19f30 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
19f40 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
19f50 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74   region does not
19f60 20 65 78 69 73 74 2e 20 49 66 20 69 73 57 72 69   exist. If isWri
19f70 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20  te is set to.   
19f80 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74     ** zero, exit
19f90 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c   early. *pp will
19fa0 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
19fb0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
19fc0 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a  turned..      **
19fd0 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e  .      ** Altern
19fe0 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72  atively, if isWr
19ff0 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ite is non-zero,
1a000 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 29   use ftruncate()
1a010 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20   to allocate.   
1a020 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73     ** the reques
1a030 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
1a040 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1a050 20 20 69 66 28 20 21 69 73 57 72 69 74 65 20 29    if( !isWrite )
1a060 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
1a070 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  t;.      rc = wi
1a080 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74  nTruncate((sqlit
1a090 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e  e3_file *)&pShmN
1a0a0 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74  ode->hFile, nByt
1a0b0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
1a0c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a0d0 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
1a0e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1a0f0 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73  OERR_SHMSIZE, os
1a100 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a120 20 22 77 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70   "winShmMap2", p
1a130 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1a140 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1a150 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
1a160 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
1a170 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  p the requested 
1a180 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e  memory region in
1a190 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
1a1a0 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
1a1b0 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20   */.    apNew = 
1a1c0 28 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f  (struct ShmRegio
1a1d0 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  n *)sqlite3_real
1a1e0 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68  loc(.        pSh
1a1f0 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20  mNode->aRegion, 
1a200 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65  (iRegion+1)*size
1a210 6f 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20  of(apNew[0]).   
1a220 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e   );.    if( !apN
1a230 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ew ){.      rc =
1a240 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1a250 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
1a260 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
1a270 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d   }.    pShmNode-
1a280 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77  >aRegion = apNew
1a290 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53  ;..    while( pS
1a2a0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
1a2b0 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
1a2c0 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20    HANDLE hMap = 
1a2d0 4e 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a  NULL;         /*
1a2e0 20 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61   file-mapping ha
1a2f0 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f  ndle */.      vo
1a300 69 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20  id *pMap = 0;   
1a310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70            /* Map
1a320 70 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ped memory regio
1a330 6e 20 2a 2f 0a 20 20 20 20 20 0a 23 69 66 20 53  n */.     .#if S
1a340 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
1a350 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
1a360 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
1a370 72 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d  romApp(pShmNode-
1a380 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20  >hFile.h,.      
1a390 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52      NULL, PAGE_R
1a3a0 45 41 44 57 52 49 54 45 2c 20 6e 42 79 74 65 2c  EADWRITE, nByte,
1a3b0 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23   NULL.      );.#
1a3c0 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
1a3d0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
1a3e0 44 45 29 0a 20 20 20 20 20 20 68 4d 61 70 20 3d  DE).      hMap =
1a3f0 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
1a400 70 69 6e 67 57 28 70 53 68 6d 4e 6f 64 65 2d 3e  pingW(pShmNode->
1a410 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20 20 20 20  hFile.h, .      
1a420 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52      NULL, PAGE_R
1a430 45 41 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79  EADWRITE, 0, nBy
1a440 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29  te, NULL.      )
1a450 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1a460 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1a470 5f 41 4e 53 49 29 0a 20 20 20 20 20 20 68 4d 61  _ANSI).      hMa
1a480 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
1a490 4d 61 70 70 69 6e 67 41 28 70 53 68 6d 4e 6f 64  MappingA(pShmNod
1a4a0 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 0a 20 20 20  e->hFile.h, .   
1a4b0 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41 47         NULL, PAG
1a4c0 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c 20  E_READWRITE, 0, 
1a4d0 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
1a4e0 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20    );.#endif.    
1a4f0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1a500 4d 41 50 20 70 69 64 2d 25 64 20 63 72 65 61 74  MAP pid-%d creat
1a510 65 20 72 65 67 69 6f 6e 3d 25 64 20 6e 62 79 74  e region=%d nbyt
1a520 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
1a530 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
1a540 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1a550 65 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64  essId(), pShmNod
1a560 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74  e->nRegion, nByt
1a570 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
1a580 20 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20    hMap ? "ok" : 
1a590 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
1a5a0 20 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20    if( hMap ){.  
1a5b0 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65        int iOffse
1a5c0 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  t = pShmNode->nR
1a5d0 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a  egion*szRegion;.
1a5e0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
1a5f0 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73  setShift = iOffs
1a600 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e  et % winSysInfo.
1a610 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
1a620 75 6c 61 72 69 74 79 3b 0a 23 69 66 20 53 51 4c  ularity;.#if SQL
1a630 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
1a640 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61       pMap = osMa
1a650 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
1a660 70 70 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41  pp(hMap, FILE_MA
1a670 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d  P_WRITE | FILE_M
1a680 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20  AP_READ,.       
1a690 20 20 20 20 20 69 4f 66 66 73 65 74 20 2d 20 69       iOffset - i
1a6a0 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52  OffsetShift, szR
1a6b0 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53  egion + iOffsetS
1a6c0 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a  hift.        );.
1a6d0 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d  #else.        pM
1a6e0 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ap = osMapViewOf
1a6f0 46 69 6c 65 28 68 4d 61 70 2c 20 46 49 4c 45 5f  File(hMap, FILE_
1a700 4d 41 50 5f 57 52 49 54 45 20 7c 20 46 49 4c 45  MAP_WRITE | FILE
1a710 5f 4d 41 50 5f 52 45 41 44 2c 0a 20 20 20 20 20  _MAP_READ,.     
1a720 20 20 20 20 20 20 20 30 2c 20 69 4f 66 66 73 65         0, iOffse
1a730 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74  t - iOffsetShift
1a740 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66  , szRegion + iOf
1a750 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20  fsetShift.      
1a760 20 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20    );.#endif.    
1a770 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48      OSTRACE(("SH
1a780 4d 2d 4d 41 50 20 70 69 64 2d 25 64 20 6d 61 70  M-MAP pid-%d map
1a790 20 72 65 67 69 6f 6e 3d 25 64 20 6f 66 66 73 65   region=%d offse
1a7a0 74 3d 25 64 20 73 69 7a 65 3d 25 64 20 25 73 5c  t=%d size=%d %s\
1a7b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1a7c0 20 20 20 20 20 28 69 6e 74 29 6f 73 47 65 74 43       (int)osGetC
1a7d0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1a7e0 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  ), pShmNode->nRe
1a7f0 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20  gion, iOffset,. 
1a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a810 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f  szRegion, pMap ?
1a820 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
1a830 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
1a840 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20    if( !pMap ){. 
1a850 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
1a860 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
1a870 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1a880 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
1a890 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1a8a0 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68  OERR_SHMMAP, pSh
1a8b0 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  mNode->lastErrno
1a8c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a8d0 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33 22 2c     "winShmMap3",
1a8e0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1a8f0 20 20 20 20 20 20 20 20 69 66 28 20 68 4d 61 70          if( hMap
1a900 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65   ) osCloseHandle
1a910 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20  (hMap);.        
1a920 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1a930 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1a940 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
1a950 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
1a960 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70 4d 61  gion].pMap = pMa
1a970 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  p;.      pShmNod
1a980 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  e->aRegion[pShmN
1a990 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 68 4d  ode->nRegion].hM
1a9a0 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20 20 20  ap = hMap;.     
1a9b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1a9c0 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  on++;.    }.  }.
1a9d0 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20  .shmpage_out:.  
1a9e0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
1a9f0 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b  egion>iRegion ){
1aa00 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74  .    int iOffset
1aa10 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52 65 67   = iRegion*szReg
1aa20 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  ion;.    int iOf
1aa30 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66  fsetShift = iOff
1aa40 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  set % winSysInfo
1aa50 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61  .dwAllocationGra
1aa60 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20 63 68  nularity;.    ch
1aa70 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20 2a 29  ar *p = (char *)
1aa80 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
1aa90 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 3b  n[iRegion].pMap;
1aaa0 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f 69 64  .    *pp = (void
1aab0 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53 68 69   *)&p[iOffsetShi
1aac0 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ft];.  }else{.  
1aad0 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
1aae0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1aaf0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1ab00 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1ab10 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 20 64  rc;.}..#else.# d
1ab20 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61 70 20  efine winShmMap 
1ab30 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77      0.# define w
1ab40 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23  inShmLock    0.#
1ab50 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 42 61   define winShmBa
1ab60 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65  rrier 0.# define
1ab70 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20 20 30   winShmUnmap   0
1ab80 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
1ab90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1aba0 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  AL */../*.** Cle
1abb0 61 6e 73 20 75 70 20 74 68 65 20 6d 61 70 70 65  ans up the mappe
1abc0 64 20 72 65 67 69 6f 6e 20 6f 66 20 74 68 65 20  d region of the 
1abd0 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c 20  specified file, 
1abe0 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74 61 74 69  if any..*/.stati
1abf0 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69  c int winUnmapfi
1ac00 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  le(winFile *pFil
1ac10 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46  e){.  assert( pF
1ac20 69 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ile!=0 );.  if( 
1ac30 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1ac40 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73  n ){.    if( !os
1ac50 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
1ac60 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1ac70 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  n) ){.      pFil
1ac80 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
1ac90 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
1aca0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
1acb0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
1acc0 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69  _IOERR_MMAP, pFi
1acd0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
1ace0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acf0 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61          "winUnma
1ad00 70 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  p1", pFile->zPat
1ad10 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  h);.    }.    pF
1ad20 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
1ad30 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
1ad40 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20  mmapSize = 0;.  
1ad50 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 4f 72 69    pFile->mmapOri
1ad60 67 73 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  gsize = 0;.  }. 
1ad70 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70   if( pFile->hMap
1ad80 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  !=NULL ){.    if
1ad90 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65  ( !osCloseHandle
1ada0 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b  (pFile->hMap) ){
1adb0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
1adc0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1add0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1ade0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
1adf0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1ae00 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c  R_MMAP, pFile->l
1ae10 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
1ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae30 20 20 20 22 77 69 6e 55 6e 6d 61 70 32 22 2c 20     "winUnmap2", 
1ae40 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1ae50 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
1ae60 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  hMap = NULL;.  }
1ae70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ae80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  _OK;.}../*.** Me
1ae90 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61  mory map or rema
1aea0 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  p the file opene
1aeb0 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69  d by file-descri
1aec0 70 74 6f 72 20 70 46 64 20 28 69 66 20 74 68 65  ptor pFd (if the
1aed0 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65   file.** is alre
1aee0 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20  ady mapped, the 
1aef0 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
1af00 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
1af10 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66  the new). Or, if
1af20 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65 61   .** there alrea
1af30 64 79 20 65 78 69 73 74 73 20 61 20 6d 61 70 70  dy exists a mapp
1af40 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ing for this fil
1af50 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
1af60 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74   still .** outst
1af70 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29 20  anding xFetch() 
1af80 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74  references to it
1af90 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1afa0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
1afb0 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
1afc0 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  Byte is non-nega
1afd0 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  tive, then it is
1afe0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
1aff0 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d  ize of .** the m
1b000 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65  apping to create
1b010 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
1b020 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68  nByte is less th
1b030 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
1b040 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  e .** requested 
1b050 73 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65  size is the size
1b060 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
1b070 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c  disk. The actual
1b080 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
1b090 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20  created mapping 
1b0a0 69 73 20 65 69 74 68 65 72 20 74 68 65 20 72 65  is either the re
1b0b0 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20  quested size or 
1b0c0 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67  the value config
1b0d0 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53  ured .** using S
1b0e0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
1b0f0 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68 65 76 65  _LIMIT, whicheve
1b100 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a  r is smaller..**
1b110 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1b120 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
1b130 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76  error occurs (ev
1b140 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e  en if the mappin
1b150 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72  g is not.** recr
1b160 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75 6c  eated as a resul
1b170 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  t of outstanding
1b180 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20   references) or 
1b190 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a  an SQLite error.
1b1a0 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  ** code otherwis
1b1b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1b1c0 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46   winMapfile(winF
1b1d0 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69 74 65  ile *pFd, sqlite
1b1e0 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a  3_int64 nByte){.
1b1f0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1b200 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20  nMap = nByte;.  
1b210 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1b220 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46  t( nMap>=0 || pF
1b230 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  d->nFetchOut==0 
1b240 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46  );.  if( pFd->nF
1b250 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75  etchOut>0 ) retu
1b260 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
1b270 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20   if( nMap<0 ){. 
1b280 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53     rc = winFileS
1b290 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ize((sqlite3_fil
1b2a0 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b 0a  e*)pFd, &nMap);.
1b2b0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1b2c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b2d0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
1b2e0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
1b2f0 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 4c 69 6d  Map>pFd->mmapLim
1b300 69 74 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d  it ){.    nMap =
1b310 20 70 46 64 2d 3e 6d 6d 61 70 4c 69 6d 69 74 3b   pFd->mmapLimit;
1b320 0a 20 20 7d 0a 20 20 6e 4d 61 70 20 26 3d 20 7e  .  }.  nMap &= ~
1b330 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28  (sqlite3_int64)(
1b340 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67  winSysInfo.dwPag
1b350 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 0a 20 20  eSize - 1);. .  
1b360 69 66 28 20 6e 4d 61 70 3d 3d 30 20 26 26 20 70  if( nMap==0 && p
1b370 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  Fd->mmapSize>0 )
1b380 7b 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69  {.    winUnmapfi
1b390 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 20 20 69  le(pFd);.  }.  i
1b3a0 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d  f( nMap!=pFd->mm
1b3b0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 76 6f  apSize ){.    vo
1b3c0 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  id *pNew = 0;.  
1b3d0 20 20 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20    DWORD protect 
1b3e0 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59 3b  = PAGE_READONLY;
1b3f0 0a 20 20 20 20 44 57 4f 52 44 20 66 6c 61 67 73  .    DWORD flags
1b400 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44   = FILE_MAP_READ
1b410 3b 0a 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66  ;..    winUnmapf
1b420 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 69 66  ile(pFd);.    if
1b430 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67  ( (pFd->ctrlFlag
1b440 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e  s & WINFILE_RDON
1b450 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)==0 ){.      
1b460 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52  protect = PAGE_R
1b470 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20  EADWRITE;.      
1b480 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41  flags |= FILE_MA
1b490 50 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23  P_WRITE;.    }.#
1b4a0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
1b4b0 52 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  RT.    pFd->hMap
1b4c0 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d   = osCreateFileM
1b4d0 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 46  appingFromApp(pF
1b4e0 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
1b4f0 65 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29  ect, nMap, NULL)
1b500 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1b510 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
1b520 5f 57 49 44 45 29 0a 20 20 20 20 70 46 64 2d 3e  _WIDE).    pFd->
1b530 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1b540 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 46 64 2d  ileMappingW(pFd-
1b550 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63  >h, NULL, protec
1b560 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
1b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b580 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70     (DWORD)((nMap
1b590 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66  >>32) & 0xffffff
1b5a0 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ff),.           
1b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b5c0 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61       (DWORD)(nMa
1b5d0 70 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c  p & 0xffffffff),
1b5e0 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65   NULL);.#elif de
1b5f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1b600 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20  32_HAS_ANSI).   
1b610 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43   pFd->hMap = osC
1b620 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
1b630 41 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20  A(pFd->h, NULL, 
1b640 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20  protect,.       
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b660 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29           (DWORD)
1b670 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78  ((nMap>>32) & 0x
1b680 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20  ffffffff),.     
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6a0 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
1b6b0 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66  D)(nMap & 0xffff
1b6c0 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65  ffff), NULL);.#e
1b6d0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 64  ndif.    if( pFd
1b6e0 2d 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a  ->hMap==NULL ){.
1b6f0 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45        pFd->lastE
1b700 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
1b710 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72  Error();.      r
1b720 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1b730 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
1b740 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e  P, pFd->lastErrn
1b750 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1b760 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61            "winMa
1b770 70 66 69 6c 65 22 2c 20 70 46 64 2d 3e 7a 50 61  pfile", pFd->zPa
1b780 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f  th);.      /* Lo
1b790 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74  g the error, but
1b7a0 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c   continue normal
1b7b0 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67   operation using
1b7c0 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f   xRead/xWrite */
1b7d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1b7e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1b7f0 20 20 20 61 73 73 65 72 74 28 20 28 6e 4e 65 77     assert( (nNew
1b800 52 6e 64 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  Rnd % winSysInfo
1b810 2e 64 77 50 61 67 65 53 69 7a 65 29 3d 3d 30 20  .dwPageSize)==0 
1b820 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
1b830 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 20  _WINRT.    pNew 
1b840 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
1b850 65 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d  eFromApp(pFd->hM
1b860 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 6e 4d  ap, flags, 0, nM
1b870 61 70 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70  ap);.#else.    p
1b880 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f  New = osMapViewO
1b890 66 46 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70 2c  fFile(pFd->hMap,
1b8a0 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28 53   flags, 0, 0, (S
1b8b0 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6e  IZE_T)nMap);.#en
1b8c0 64 69 66 0a 20 20 20 20 69 66 28 20 70 4e 65 77  dif.    if( pNew
1b8d0 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  ==NULL ){.      
1b8e0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
1b8f0 64 2d 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  d->hMap);.      
1b900 70 46 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c  pFd->hMap = NULL
1b910 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73  ;.      pFd->las
1b920 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
1b930 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
1b940 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1b950 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
1b960 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  pFd->lastErrno,.
1b970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b980 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 22 2c 20    "winMapfile", 
1b990 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  pFd->zPath);.   
1b9a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b9b0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  _OK;.    }.    p
1b9c0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  Fd->pMapRegion =
1b9d0 20 70 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e   pNew;.    pFd->
1b9e0 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b  mmapSize = nMap;
1b9f0 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 4f 72  .    pFd->mmapOr
1ba00 69 67 73 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20  igsize = nMap;. 
1ba10 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
1ba20 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1ba30 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65   If possible, re
1ba40 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1ba50 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66  o a mapping of f
1ba60 69 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20  ile fd starting 
1ba70 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66  at offset.** iOf
1ba80 66 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d  f. The mapping m
1ba90 75 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72  ust be valid for
1baa0 20 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62   at least nAmt b
1bab0 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ytes..**.** If s
1bac0 75 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61  uch a pointer ca
1bad0 6e 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73  n be obtained, s
1bae0 74 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61  tore it in *pp a
1baf0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
1bb00 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f  _OK..** Or, if o
1bb10 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f  ne cannot but no
1bb20 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
1bb30 65 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20  et *pp to 0 and 
1bb40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bb50 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66  ..** Finally, if
1bb60 20 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f   an error does o
1bb70 63 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20  ccur, return an 
1bb80 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1bb90 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20  e. The final.** 
1bba0 76 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20  value of *pp is 
1bbb0 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
1bbc0 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
1bbd0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
1bbe0 6f 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69  oes return a poi
1bbf0 6e 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72  nter, the caller
1bc00 20 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79   must eventually
1bc10 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65   .** release the
1bc20 20 72 65 66 65 72 65 6e 63 65 20 62 79 20 63 61   reference by ca
1bc30 6c 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63  lling unixUnfetc
1bc40 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  h()..*/.static i
1bc50 6e 74 20 77 69 6e 46 65 74 63 68 28 73 71 6c 69  nt winFetch(sqli
1bc60 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
1bc70 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74  4 iOff, int nAmt
1bc80 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 20 20  , void **pp){.  
1bc90 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  winFile *pFd = (
1bca0 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f  winFile*)fd;   /
1bcb0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1bcc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1bcd0 2f 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 20 20  /.  *pp = 0;..  
1bce0 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 4c 69 6d  if( pFd->mmapLim
1bcf0 69 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  it>0 ){.    if( 
1bd00 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d  pFd->pMapRegion=
1bd10 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
1bd20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28  rc = winMapfile(
1bd30 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  pFd, -1);.      
1bd40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1bd50 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1bd60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64     }.    if( pFd
1bd70 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f  ->mmapSize >= iO
1bd80 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20  ff+nAmt ){.     
1bd90 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70   *pp = &((u8 *)p
1bda0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
1bdb0 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64  iOff];.      pFd
1bdc0 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20  ->nFetchOut++;. 
1bdd0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1bde0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1bdf0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  /*.** If the thi
1be00 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  rd argument is n
1be10 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
1be20 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65  is function rele
1be30 61 73 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72  ases a .** refer
1be40 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79  ence obtained by
1be50 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
1be60 20 74 6f 20 75 6e 69 78 46 65 74 63 68 28 29 2e   to unixFetch().
1be70 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   The second.** a
1be80 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
1be90 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1bea0 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
1beb0 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f   as the correspo
1bec0 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e  nding.** argumen
1bed0 74 20 74 68 61 74 20 77 61 73 20 70 61 73 73 65  t that was passe
1bee0 64 20 74 6f 20 74 68 65 20 75 6e 69 78 46 65 74  d to the unixFet
1bef0 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  ch() invocation.
1bf00 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74   .**.** Or, if t
1bf10 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
1bf20 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
1bf30 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1bf40 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a   being called .*
1bf50 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20  * to inform the 
1bf60 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20  VFS layer that, 
1bf70 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53  according to POS
1bf80 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67  IX, any existing
1bf90 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79   mapping .** may
1bfa0 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20   now be invalid 
1bfb0 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e  and should be un
1bfc0 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mapped..*/.stati
1bfd0 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63 68  c int winUnfetch
1bfe0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
1bff0 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69  d, i64 iOff, voi
1c000 64 20 2a 70 29 7b 0a 20 20 77 69 6e 46 69 6c 65  d *p){.  winFile
1c010 20 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65   *pFd = (winFile
1c020 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75  *)fd;   /* The u
1c030 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
1c040 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a  se file */..  /*
1c050 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20   If p==0 (unmap 
1c060 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29  the entire file)
1c070 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
1c080 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69   be no outstandi
1c090 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20  ng .  ** xFetch 
1c0a0 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20  references. Or, 
1c0b0 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67  if p!=0 (meaning
1c0c0 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68   it is an xFetch
1c0d0 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a   reference),.  *
1c0e0 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  * then there mus
1c0f0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
1c100 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20  e outstanding.  
1c110 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d  */.  assert( (p=
1c120 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63  =0)==(pFd->nFetc
1c130 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  hOut==0) );..  /
1c140 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75  * If p!=0, it mu
1c150 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66  st match the iOf
1c160 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73  f value. */.  as
1c170 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d  sert( p==0 || p=
1c180 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d  =&((u8 *)pFd->pM
1c190 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20  apRegion)[iOff] 
1c1a0 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  );..  if( p ){. 
1c1b0 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
1c1c0 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t--;.  }else{.  
1c1d0 20 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20    /* FIXME:  If 
1c1e0 57 69 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c  Windows truly al
1c1f0 77 61 79 73 20 70 72 65 76 65 6e 74 73 20 74 72  ways prevents tr
1c200 75 6e 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65  uncating or dele
1c210 74 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69  ting a.    ** fi
1c220 6c 65 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69  le while a mappi
1c230 6e 67 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e  ng is held, then
1c240 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77   the following w
1c250 69 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61  inUnmapfile() ca
1c260 6c 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e  ll.    ** is unn
1c270 65 63 65 73 73 61 72 79 20 63 61 6e 20 63 61 6e  ecessary can can
1c280 20 62 65 20 6f 6d 69 74 74 65 64 20 2d 20 70 6f   be omitted - po
1c290 74 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f 76  tentially improv
1c2a0 69 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72 66 6f  ing.    ** perfo
1c2b0 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20  rmance.  */.    
1c2c0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  winUnmapfile(pFd
1c2d0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
1c2e0 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
1c2f0 3e 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  >=0 );.  return 
1c300 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1c310 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
1c320 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1c330 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
1c340 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
1c350 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1c360 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
1c370 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
1c380 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1c390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c3a0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1c3b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c3c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c3d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1c3f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63  ../*.** This vec
1c400 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
1c410 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
1c420 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
1c430 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  an.** sqlite3_fi
1c440 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f  le for win32..*/
1c450 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
1c460 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
1c470 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b   winIoMethod = {
1c480 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
1c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4a0 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
1c4b0 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20  /.  winClose,   
1c4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4d0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
1c4e0 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20  .  winRead,     
1c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c500 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20     /* xRead */. 
1c510 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20   winWrite,      
1c520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c530 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20   /* xWrite */.  
1c540 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20  winTruncate,    
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c560 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a  /* xTruncate */.
1c570 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20    winSync,      
1c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c590 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
1c5a0 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  winFileSize,    
1c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5c0 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a  /* xFileSize */.
1c5d0 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20    winLock,      
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5f0 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20    /* xLock */.  
1c600 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  winUnlock,      
1c610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c620 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20  /* xUnlock */.  
1c630 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
1c640 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1c650 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
1c660 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69  dLock */.  winFi
1c670 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
1c680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
1c690 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20  ileControl */.  
1c6a0 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  winSectorSize,  
1c6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c6c0 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
1c6d0 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61  /.  winDeviceCha
1c6e0 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 20  racteristics,   
1c6f0 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68      /* xDeviceCh
1c700 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
1c710 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20  .  winShmMap,   
1c720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c730 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
1c740 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20  .  winShmLock,  
1c750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c760 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
1c770 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65  /.  winShmBarrie
1c780 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
1c790 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
1c7a0 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e  er */.  winShmUn
1c7b0 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  map,            
1c7c0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
1c7d0 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74  nmap */.  winFet
1c7e0 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
1c7f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
1c800 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65  tch */.  winUnfe
1c810 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20  tch             
1c820 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66           /* xUnf
1c830 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a  etch */.};../***
1c840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c880 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1c890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c8a0 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
1c8b0 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
1c8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c8d0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
1c8e0 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
1c8f0 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
1c900 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
1c910 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
1c920 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
1c930 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .*/../*.** Conve
1c940 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e  rt a UTF-8 filen
1c950 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65  ame into whateve
1c960 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72  r form the under
1c970 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  lying.** operati
1c980 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20  ng system wants 
1c990 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53  filenames in.  S
1c9a0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
1c9b0 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62   result.** is ob
1c9c0 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
1c9d0 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  oc and must be f
1c9e0 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
1c9f0 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e  ing.** function.
1ca00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ca10 2a 63 6f 6e 76 65 72 74 55 74 66 38 46 69 6c 65  *convertUtf8File
1ca20 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
1ca30 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76  *zFilename){.  v
1ca40 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
1ca50 3d 20 30 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  = 0;.  if( isNT(
1ca60 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72  ) ){.    zConver
1ca70 74 65 64 20 3d 20 75 74 66 38 54 6f 55 6e 69 63  ted = utf8ToUnic
1ca80 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
1ca90 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1caa0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1cab0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f  .  else{.    zCo
1cac0 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65  nverted = sqlite
1cad0 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
1cae0 6d 62 63 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  mbcs(zFilename);
1caf0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
1cb00 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e   caller will han
1cb10 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  dle out of memor
1cb20 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43  y */.  return zC
1cb30 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a  onverted;.}../*.
1cb40 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
1cb50 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
1cb60 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
1cb70 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
1cb80 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20  h to.** hold at 
1cb90 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1cba0 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a   characters..*/.
1cbb0 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 54 65  static int getTe
1cbc0 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
1cbd0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
1cbe0 73 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61  static char zCha
1cbf0 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64  rs[] =.    "abcd
1cc00 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74  efghijklmnopqrst
1cc10 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43  uvwxyz".    "ABC
1cc20 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53  DEFGHIJKLMNOPQRS
1cc30 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31  TUVWXYZ".    "01
1cc40 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73 69 7a  23456789";.  siz
1cc50 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  e_t i, j;.  int 
1cc60 6e 54 65 6d 70 50 61 74 68 3b 0a 20 20 63 68 61  nTempPath;.  cha
1cc70 72 20 7a 54 65 6d 70 50 61 74 68 5b 4d 41 58 5f  r zTempPath[MAX_
1cc80 50 41 54 48 2b 32 5d 3b 0a 0a 20 20 2f 2a 20 49  PATH+2];..  /* I
1cc90 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
1cca0 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
1ccb0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
1ccc0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
1ccd0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
1cce0 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
1ccf0 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
1cd00 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
1cd10 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
1cd20 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
1cd30 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
1cd40 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
1cd50 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
1cd60 6d 65 6d 73 65 74 28 7a 54 65 6d 70 50 61 74 68  memset(zTempPath
1cd70 2c 20 30 2c 20 4d 41 58 5f 50 41 54 48 2b 32 29  , 0, MAX_PATH+2)
1cd80 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
1cd90 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
1cda0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
1cdb0 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
1cdc0 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20  -30, zTempPath, 
1cdd0 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 74 65  "%s", sqlite3_te
1cde0 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20  mp_directory);. 
1cdf0 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f   }.#if !SQLITE_O
1ce00 53 5f 57 49 4e 52 54 0a 20 20 65 6c 73 65 20 69  S_WINRT.  else i
1ce10 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20  f( isNT() ){.   
1ce20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20   char *zMulti;. 
1ce30 20 20 20 57 43 48 41 52 20 7a 57 69 64 65 50 61     WCHAR zWidePa
1ce40 74 68 5b 4d 41 58 5f 50 41 54 48 5d 3b 0a 20 20  th[MAX_PATH];.  
1ce50 20 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57    osGetTempPathW
1ce60 28 4d 41 58 5f 50 41 54 48 2d 33 30 2c 20 7a 57  (MAX_PATH-30, zW
1ce70 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7a 4d  idePath);.    zM
1ce80 75 6c 74 69 20 3d 20 75 6e 69 63 6f 64 65 54 6f  ulti = unicodeTo
1ce90 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b  Utf8(zWidePath);
1cea0 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20  .    if( zMulti 
1ceb0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1cec0 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
1ced0 54 48 2d 33 30 2c 20 7a 54 65 6d 70 50 61 74 68  TH-30, zTempPath
1cee0 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b  , "%s", zMulti);
1cef0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1cf00 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20  ree(zMulti);.   
1cf10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1cf20 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1cf30 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
1cf40 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1cf50 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
1cf60 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72    else{.    char
1cf70 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61   *zUtf8;.    cha
1cf80 72 20 7a 4d 62 63 73 50 61 74 68 5b 4d 41 58 5f  r zMbcsPath[MAX_
1cf90 50 41 54 48 5d 3b 0a 20 20 20 20 6f 73 47 65 74  PATH];.    osGet
1cfa0 54 65 6d 70 50 61 74 68 41 28 4d 41 58 5f 50 41  TempPathA(MAX_PA
1cfb0 54 48 2d 33 30 2c 20 7a 4d 62 63 73 50 61 74 68  TH-30, zMbcsPath
1cfc0 29 3b 0a 20 20 20 20 7a 55 74 66 38 20 3d 20 73  );.    zUtf8 = s
1cfd0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
1cfe0 73 5f 74 6f 5f 75 74 66 38 28 7a 4d 62 63 73 50  s_to_utf8(zMbcsP
1cff0 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 55  ath);.    if( zU
1d000 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  tf8 ){.      sql
1d010 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
1d020 58 5f 50 41 54 48 2d 33 30 2c 20 7a 54 65 6d 70  X_PATH-30, zTemp
1d030 50 61 74 68 2c 20 22 25 73 22 2c 20 7a 55 74 66  Path, "%s", zUtf
1d040 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
1d050 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20  3_free(zUtf8);. 
1d060 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d080 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ERR_NOMEM;.    }
1d090 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64  .  }.#endif.#end
1d0a0 69 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  if..  /* Check t
1d0b0 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
1d0c0 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
1d0d0 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
1d0e0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
1d0f0 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
1d100 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
1d110 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
1d120 0a 20 20 6e 54 65 6d 70 50 61 74 68 20 3d 20 73  .  nTempPath = s
1d130 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1d140 54 65 6d 70 50 61 74 68 29 3b 0a 0a 20 20 69 66  TempPath);..  if
1d150 28 20 28 6e 54 65 6d 70 50 61 74 68 20 2b 20 73  ( (nTempPath + s
1d160 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53  qlite3Strlen30(S
1d170 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
1d180 50 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d  PREFIX) + 18) >=
1d190 20 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74   nBuf ){.    ret
1d1a0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1d1b0 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 6e  ;.  }..  for(i=n
1d1c0 54 65 6d 70 50 61 74 68 3b 20 69 3e 30 20 26 26  TempPath; i>0 &&
1d1d0 20 7a 54 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d   zTempPath[i-1]=
1d1e0 3d 27 5c 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  ='\\'; i--){}.  
1d1f0 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30  zTempPath[i] = 0
1d200 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
1d210 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a  rintf(nBuf-18, z
1d220 42 75 66 2c 20 28 6e 54 65 6d 70 50 61 74 68 20  Buf, (nTempPath 
1d230 3e 20 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20  > 0) ?.         
1d240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
1d250 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f  s\\"SQLITE_TEMP_
1d260 46 49 4c 45 5f 50 52 45 46 49 58 20 3a 20 53 51  FILE_PREFIX : SQ
1d270 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
1d280 52 45 46 49 58 2c 0a 20 20 20 20 20 20 20 20 20  REFIX,.         
1d290 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 50            zTempP
1d2a0 61 74 68 29 3b 0a 20 20 6a 20 3d 20 73 71 6c 69  ath);.  j = sqli
1d2b0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
1d2c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  );.  sqlite3_ran
1d2d0 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75  domness(15, &zBu
1d2e0 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  f[j]);.  for(i=0
1d2f0 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
1d300 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  ){.    zBuf[j] =
1d310 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
1d320 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
1d330 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
1d340 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
1d350 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b  }.  zBuf[j] = 0;
1d360 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30  .  zBuf[j+1] = 0
1d370 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  ;..  OSTRACE(("T
1d380 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a 20 25 73  EMP FILENAME: %s
1d390 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72  \n", zBuf));.  r
1d3a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d3b0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   .}../*.** Retur
1d3c0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61  n TRUE if the na
1d3d0 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65 61 6c  med file is real
1d3e0 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20  ly a directory. 
1d3f0 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
1d400 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 68  .** it is someth
1d410 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ing other than a
1d420 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 69   directory, or i
1d430 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  f there is any k
1d440 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a  ind of memory.**
1d450 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c   allocation fail
1d460 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
1d470 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73  nt winIsDir(cons
1d480 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74  t void *zConvert
1d490 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74  ed){.  DWORD att
1d4a0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  r;.  int rc = 0;
1d4b0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
1d4c0 6e 6f 3b 0a 0a 20 20 69 66 28 20 69 73 4e 54 28  no;..  if( isNT(
1d4d0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  ) ){.    int cnt
1d4e0 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f   = 0;.    WIN32_
1d4f0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
1d500 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
1d510 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
1d520 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
1d530 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
1d540 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f   while( !(rc = o
1d550 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
1d560 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a  esExW((LPCWSTR)z
1d570 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
1d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d590 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45          GetFileE
1d5a0 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20  xInfoStandard,. 
1d5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5c0 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74              &sAt
1d5d0 74 72 44 61 74 61 29 29 20 26 26 20 72 65 74 72  trData)) && retr
1d5e0 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
1d5f0 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20  stErrno) ){}.   
1d600 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
1d610 20 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49    return 0; /* I
1d620 6e 76 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a  nvalid name? */.
1d630 20 20 20 20 7d 0a 20 20 20 20 61 74 74 72 20 3d      }.    attr =
1d640 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
1d650 65 41 74 74 72 69 62 75 74 65 73 3b 0a 23 69 66  eAttributes;.#if
1d660 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
1d670 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ==0.  }else{.   
1d680 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
1d690 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68  eAttributesA((ch
1d6a0 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
1d6b0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
1d6c0 74 75 72 6e 20 28 61 74 74 72 21 3d 49 4e 56 41  turn (attr!=INVA
1d6d0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
1d6e0 54 45 53 29 20 26 26 20 28 61 74 74 72 26 46 49  TES) && (attr&FI
1d6f0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
1d700 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ECTORY);.}../*.*
1d710 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a  * Open a file..*
1d720 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1d730 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
1d740 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
1d750 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f    /* Not used */
1d760 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1d770 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
1d780 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1d790 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
1d7a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1d7b0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1d7c0 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c 65   the SQLite file
1d7d0 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a   handle here */.
1d7e0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1d800 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73 20 2a  pen mode flags *
1d810 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
1d820 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
1d830 20 53 74 61 74 75 73 20 72 65 74 75 72 6e 20 66   Status return f
1d840 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e  lags */.){.  HAN
1d850 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44 20 6c  DLE h;.  DWORD l
1d860 61 73 74 45 72 72 6e 6f 3b 0a 20 20 44 57 4f 52  astErrno;.  DWOR
1d870 44 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73  D dwDesiredAcces
1d880 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61  s;.  DWORD dwSha
1d890 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20  reMode;.  DWORD 
1d8a0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
1d8b0 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64  ition;.  DWORD d
1d8c0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
1d8d0 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c  tes = 0;.#if SQL
1d8e0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
1d8f0 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23  nt isTemp = 0;.#
1d900 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20  endif.  winFile 
1d910 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
1d920 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a  e*)id;.  void *z
1d930 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20  Converted;      
1d940 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e          /* Filen
1d950 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69  ame in OS encodi
1d960 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ng */.  const ch
1d970 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20  ar *zUtf8Name = 
1d980 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61  zName; /* Filena
1d990 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f  me in UTF-8 enco
1d9a0 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ding */.  int cn
1d9b0 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  t = 0;..  /* If 
1d9c0 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69  argument zPath i
1d9d0 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
1d9e0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1d9f0 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f  is required to o
1da00 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f  pen.  ** a tempo
1da10 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74  rary file. Use t
1da20 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74  his buffer to st
1da30 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  ore the file nam
1da40 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61  e in..  */.  cha
1da50 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50  r zTmpname[MAX_P
1da60 41 54 48 2b 32 5d 3b 20 20 20 20 20 2f 2a 20 42  ATH+2];     /* B
1da70 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 63 72  uffer used to cr
1da80 65 61 74 65 20 74 65 6d 70 20 66 69 6c 65 6e 61  eate temp filena
1da90 6d 65 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20  me */..  int rc 
1daa0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1dab0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
1dac0 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
1dad0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1dae0 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54  NDEBUG) || SQLIT
1daf0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74  E_OS_WINCE.  int
1db00 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
1db10 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFFFFFF00;  /* T
1db20 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
1db30 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  pen */.#endif.. 
1db40 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
1db50 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
1db60 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1db70 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
1db80 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
1db90 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
1dba0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
1dbb0 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
1dbc0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
1dbd0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
1dbe0 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
1dbf0 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
1dc00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1dc10 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
1dc20 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
1dc30 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
1dc40 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69  _READWRITE);..#i
1dc50 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
1dc60 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  nt isOpenJournal
1dc70 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
1dc80 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
1dc90 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
1dca0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
1dcb0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
1dcc0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
1dcd0 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
1dce0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1dcf0 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69  _WAL.  ));.#endi
1dd00 66 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  f..  /* Check th
1dd10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74  e following stat
1dd20 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a  ements are true:
1dd30 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61   .  **.  **   (a
1dd40 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  ) Exactly one of
1dd50 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61   the READWRITE a
1dd60 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67  nd READONLY flag
1dd70 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61  s must be set, a
1dd80 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69  nd .  **   (b) i
1dd90 66 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c  f CREATE is set,
1dda0 20 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20   then READWRITE 
1ddb0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
1ddc0 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29  , and.  **   (c)
1ddd0 20 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73   if EXCLUSIVE is
1dde0 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
1ddf0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
1de00 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69  et..  **   (d) i
1de10 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  f DELETEONCLOSE 
1de20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
1de30 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
1de40 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73   set..  */.  ass
1de50 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d  ert((isReadonly=
1de60 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
1de70 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64  e==0) && (isRead
1de80 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f  Write || isReado
1de90 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28  nly));.  assert(
1dea0 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69  isCreate==0 || i
1deb0 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61  sReadWrite);.  a
1dec0 73 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76  ssert(isExclusiv
1ded0 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65  e==0 || isCreate
1dee0 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65  );.  assert(isDe
1def0 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  lete==0 || isCre
1df00 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ate);..  /* The 
1df10 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f  main DB, main jo
1df20 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20  urnal, WAL file 
1df30 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  and master journ
1df40 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20  al are never .  
1df50 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
1df60 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72   deleted. Nor ar
1df70 65 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70  e they ever temp
1df80 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f  orary files.  */
1df90 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
1dfa0 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
1dfb0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
1dfc0 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
1dfd0 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
1dfe0 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
1dff0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
1e000 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1e010 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
1e020 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
1e030 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
1e040 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
1e050 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61  R_JOURNAL );.  a
1e060 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
1e070 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
1e080 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
1e090 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41  N_WAL );..  /* A
1e0a0 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75  ssert that the u
1e0b0 70 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73  pper layer has s
1e0c0 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66  et one of the "f
1e0d0 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e  ile-type" flags.
1e0e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54   */.  assert( eT
1e0f0 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
1e100 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c  _MAIN_DB      ||
1e110 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1e120 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20  PEN_TEMP_DB .   
1e130 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
1e140 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
1e150 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d  OURNAL || eType=
1e160 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
1e170 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  P_JOURNAL .     
1e180 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
1e190 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
1e1a0 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53  AL   || eType==S
1e1b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
1e1c0 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
1e1d0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
1e1e0 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
1e1f0 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53  T_DB || eType==S
1e200 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
1e210 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
1e220 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 6d 65 6d  File!=0 );.  mem
1e230 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
1e240 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 29 3b 0a  zeof(winFile));.
1e250 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56    pFile->h = INV
1e260 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
1e270 45 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  E;..#if SQLITE_O
1e280 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 21 73  S_WINRT.  if( !s
1e290 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
1e2a0 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c  ctory ){.    sql
1e2b0 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
1e2c0 45 52 52 4f 52 2c 0a 20 20 20 20 20 20 20 20 22  ERROR,.        "
1e2d0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
1e2e0 65 63 74 6f 72 79 20 76 61 72 69 61 62 6c 65 20  ectory variable 
1e2f0 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 66 6f  should be set fo
1e300 72 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a 23  r WinRT");.  }.#
1e310 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74  endif..  /* If t
1e320 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1e330 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
1e340 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e  ion is NULL, gen
1e350 65 72 61 74 65 20 61 20 0a 20 20 2a 2a 20 74 65  erate a .  ** te
1e360 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
1e370 65 20 74 6f 20 75 73 65 20 0a 20 20 2a 2f 0a 20  e to use .  */. 
1e380 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20   if( !zUtf8Name 
1e390 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 69 73  ){.    assert(is
1e3a0 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65  Delete && !isOpe
1e3b0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 6d  nJournal);.    m
1e3c0 65 6d 73 65 74 28 7a 54 6d 70 6e 61 6d 65 2c 20  emset(zTmpname, 
1e3d0 30 2c 20 4d 41 58 5f 50 41 54 48 2b 32 29 3b 0a  0, MAX_PATH+2);.
1e3e0 20 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70      rc = getTemp
1e3f0 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 2b 32 2c  name(MAX_PATH+2,
1e400 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20   zTmpname);.    
1e410 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e420 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1e430 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1e440 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70  zUtf8Name = zTmp
1e450 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  name;.  }..  /* 
1e460 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
1e470 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65  es are double-ze
1e480 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66  ro terminated if
1e490 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20   they are not.  
1e4a0 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72  ** URIs with par
1e4b0 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c  ameters.  Hence,
1e4c0 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73   they can always
1e4d0 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a   be passed into.
1e4e0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69    ** sqlite3_uri
1e4f0 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20  _parameter()..  
1e500 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65 54  */.  assert( (eT
1e510 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
1e520 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c  _MAIN_DB) || (fl
1e530 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
1e540 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20  N_URI) ||.      
1e550 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 74 72 6c    zUtf8Name[strl
1e560 65 6e 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d  en(zUtf8Name)+1]
1e570 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e  ==0 );..  /* Con
1e580 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d  vert the filenam
1e590 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20  e to the system 
1e5a0 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a  encoding. */.  z
1e5b0 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f 6e 76  Converted = conv
1e5c0 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  ertUtf8Filename(
1e5d0 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66  zUtf8Name);.  if
1e5e0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
1e5f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1e600 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1e610 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e  ;.  }..  if( win
1e620 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64  IsDir(zConverted
1e630 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
1e640 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
1e650 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1e660 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53  LITE_CANTOPEN_IS
1e670 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  DIR;.  }..  if( 
1e680 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20  isReadWrite ){. 
1e690 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
1e6a0 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41  ss = GENERIC_REA
1e6b0 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54  D | GENERIC_WRIT
1e6c0 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
1e6d0 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20  dwDesiredAccess 
1e6e0 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a  = GENERIC_READ;.
1e6f0 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45    }..  /* SQLITE
1e700 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
1e710 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20  is used to make 
1e720 73 75 72 65 20 74 68 61 74 20 61 20 6e 65 77 20  sure that a new 
1e730 66 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 63 72  file is .  ** cr
1e740 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f  eated. SQLite do
1e750 65 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20  esn't use it to 
1e760 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75 73  indicate "exclus
1e770 69 76 65 20 61 63 63 65 73 73 22 20 0a 20 20 2a  ive access" .  *
1e780 2a 20 61 73 20 69 74 20 69 73 20 75 73 75 61 6c  * as it is usual
1e790 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20  ly understood.. 
1e7a0 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c   */.  if( isExcl
1e7b0 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20  usive ){.    /* 
1e7c0 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 66 69  Creates a new fi
1e7d0 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64  le, only if it d
1e7e0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
1e7f0 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a  exist. */.    /*
1e800 20 49 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   If the file exi
1e810 73 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a  sts, it fails. *
1e820 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
1e830 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52  Disposition = CR
1e840 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73  EATE_NEW;.  }els
1e850 65 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29  e if( isCreate )
1e860 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78  {.    /* Open ex
1e870 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20  isting file, or 
1e880 63 72 65 61 74 65 20 69 66 20 69 74 20 64 6f 65  create if it doe
1e890 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20  sn't exist */.  
1e8a0 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
1e8b0 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41  osition = OPEN_A
1e8c0 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LWAYS;.  }else{.
1e8d0 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66      /* Opens a f
1e8e0 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20  ile, only if it 
1e8f0 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64  exists. */.    d
1e900 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
1e910 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53  tion = OPEN_EXIS
1e920 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53  TING;.  }..  dwS
1e930 68 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f  hareMode = FILE_
1e940 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c  SHARE_READ | FIL
1e950 45 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a  E_SHARE_WRITE;..
1e960 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
1e970 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
1e980 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67  WINCE.    dwFlag
1e990 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
1e9a0 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
1e9b0 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65  HIDDEN;.    isTe
1e9c0 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20  mp = 1;.#else.  
1e9d0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
1e9e0 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
1e9f0 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52  TRIBUTE_TEMPORAR
1ea00 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y.              
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   | FILE_ATTRIBUT
1ea30 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20  E_HIDDEN.       
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea50 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46          | FILE_F
1ea60 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c  LAG_DELETE_ON_CL
1ea70 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  OSE;.#endif.  }e
1ea80 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73  lse{.    dwFlags
1ea90 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
1eaa0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
1eab0 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ORMAL;.  }.  /* 
1eac0 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65  Reports from the
1ead0 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68   internet are th
1eae0 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69  at performance i
1eaf0 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65  s always.  ** be
1eb00 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41  tter if FILE_FLA
1eb10 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20  G_RANDOM_ACCESS 
1eb20 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74  is used.  Ticket
1eb30 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53   #2699. */.#if S
1eb40 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
1eb50 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
1eb60 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c  butes |= FILE_FL
1eb70 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
1eb80 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
1eb90 69 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  isNT() ){.#if SQ
1eba0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
1ebb0 20 20 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58    CREATEFILE2_EX
1ebc0 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52  TENDED_PARAMETER
1ebd0 53 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65  S extendedParame
1ebe0 74 65 72 73 3b 0a 20 20 20 20 65 78 74 65 6e 64  ters;.    extend
1ebf0 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53  edParameters.dwS
1ec00 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43 52 45  ize = sizeof(CRE
1ec10 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45  ATEFILE2_EXTENDE
1ec20 44 5f 50 41 52 41 4d 45 54 45 52 53 29 3b 0a 20  D_PARAMETERS);. 
1ec30 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
1ec40 65 74 65 72 73 2e 64 77 46 69 6c 65 41 74 74 72  eters.dwFileAttr
1ec50 69 62 75 74 65 73 20 3d 0a 20 20 20 20 20 20 20  ibutes =.       
1ec60 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
1ec70 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45  ttributes & FILE
1ec80 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b  _ATTRIBUTE_MASK;
1ec90 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
1eca0 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 46 6c  ameters.dwFileFl
1ecb0 61 67 73 20 3d 20 64 77 46 6c 61 67 73 41 6e 64  ags = dwFlagsAnd
1ecc0 41 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c  Attributes & FIL
1ecd0 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20  E_FLAG_MASK;.   
1ece0 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
1ecf0 65 72 73 2e 64 77 53 65 63 75 72 69 74 79 51 6f  ers.dwSecurityQo
1ed00 73 46 6c 61 67 73 20 3d 20 53 45 43 55 52 49 54  sFlags = SECURIT
1ed10 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20  Y_ANONYMOUS;.   
1ed20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
1ed30 65 72 73 2e 6c 70 53 65 63 75 72 69 74 79 41 74  ers.lpSecurityAt
1ed40 74 72 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b  tributes = NULL;
1ed50 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
1ed60 61 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c 61 74  ameters.hTemplat
1ed70 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  eFile = NULL;.  
1ed80 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73    while( (h = os
1ed90 43 72 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43  CreateFile2((LPC
1eda0 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
1edb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1edd0 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a  wDesiredAccess,.
1ede0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1edf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1ee00 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20  ShareMode,.     
1ee10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee20 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
1ee30 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 65                &e
1ee60 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
1ee70 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  s))==INVALID_HAN
1ee80 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20  DLE_VALUE &&.   
1ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eea0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 72 79             retry
1eeb0 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
1eec0 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
1eed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f            /* Noo
1eee0 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65  p */.    }.#else
1eef0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
1ef00 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57 28 28   osCreateFileW((
1ef10 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
1ef20 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
1ef30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef40 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
1ef50 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef70 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55   dwShareMode, NU
1ef80 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efa0 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
1efb0 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  osition,.       
1efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efd0 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
1efe0 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20  dAttributes,.   
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f000 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29             NULL)
1f010 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  )==INVALID_HANDL
1f020 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20  E_VALUE &&.     
1f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f040 20 20 20 20 20 20 20 20 20 72 65 74 72 79 49 6f           retryIo
1f050 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
1f060 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
1f070 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20          /* Noop 
1f080 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  */.    }.#endif.
1f090 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1f0a0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
1f0b0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69  .  else{.    whi
1f0c0 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74  le( (h = osCreat
1f0d0 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a  eFileA((LPCSTR)z
1f0e0 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
1f0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f100 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
1f110 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f130 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d          dwShareM
1f140 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  ode, NULL,.     
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f160 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
1f170 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
1f180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
1f1a0 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
1f1b0 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  es,.            
1f1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1d0 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49    NULL))==INVALI
1f1e0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
1f1f0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
1f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f210 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
1f220 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
1f230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f240 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
1f250 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 6c 6f 67    }.#endif.  log
1f260 49 6f 65 72 72 28 63 6e 74 29 3b 0a 0a 20 20 4f  Ioerr(cnt);..  O
1f270 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 64  STRACE(("OPEN %d
1f280 20 25 73 20 30 78 25 6c 78 20 25 73 5c 6e 22 2c   %s 0x%lx %s\n",
1f290 20 0a 20 20 20 20 20 20 20 20 20 20 20 68 2c 20   .           h, 
1f2a0 7a 4e 61 6d 65 2c 20 64 77 44 65 73 69 72 65 64  zName, dwDesired
1f2b0 41 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 20  Access, .       
1f2c0 20 20 20 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48      h==INVALID_H
1f2d0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 3f 20 22 66  ANDLE_VALUE ? "f
1f2e0 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b  ailed" : "ok"));
1f2f0 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c  ..  if( h==INVAL
1f300 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
1f310 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
1f320 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
1f330 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45  rno;.    winLogE
1f340 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
1f350 4f 50 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OPEN, pFile->las
1f360 74 45 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e  tErrno, "winOpen
1f370 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  ", zUtf8Name);. 
1f380 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f390 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
1f3a0 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
1f3b0 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
1f3c0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f3d0 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a   winOpen(pVfs, z
1f3e0 4e 61 6d 65 2c 20 69 64 2c 20 0a 20 20 20 20 20  Name, id, .     
1f3f0 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49      ((flags|SQLI
1f400 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1f410 29 20 26 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) &.            
1f420 20 20 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54           ~(SQLIT
1f430 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51  E_OPEN_CREATE|SQ
1f440 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1f450 49 54 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20  ITE)),.         
1f460 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20  pOutFlags);.    
1f470 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
1f480 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
1f490 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
1f4a0 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46    }..  if( pOutF
1f4b0 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20  lags ){.    if( 
1f4c0 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20  isReadWrite ){. 
1f4d0 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20       *pOutFlags 
1f4e0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
1f4f0 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  ADWRITE;.    }el
1f500 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46  se{.      *pOutF
1f510 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
1f520 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
1f530 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49   }.  }..#if SQLI
1f540 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66  TE_OS_WINCE.  if
1f550 28 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26  ( isReadWrite &&
1f560 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
1f570 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20  PEN_MAIN_DB.    
1f580 20 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e 63     && (rc = winc
1f590 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d  eCreateLock(zNam
1f5a0 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c 49  e, pFile))!=SQLI
1f5b0 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 6f  TE_OK.  ){.    o
1f5c0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b  sCloseHandle(h);
1f5d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1f5e0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
1f5f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f600 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29  }.  if( isTemp )
1f610 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65  {.    pFile->zDe
1f620 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43  leteOnClose = zC
1f630 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73  onverted;.  }els
1f640 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
1f650 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
1f660 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a  onverted);.  }..
1f670 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
1f680 20 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b   = &winIoMethod;
1f690 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d  .  pFile->pVfs =
1f6a0 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e   pVfs;.  pFile->
1f6b0 68 20 3d 20 68 3b 0a 20 20 69 66 28 20 69 73 52  h = h;.  if( isR
1f6c0 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 70  eadonly ){.    p
1f6d0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1f6e0 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c  |= WINFILE_RDONL
1f6f0 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  Y;.  }.  if( sql
1f700 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
1f710 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20  (zName, "psow", 
1f720 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
1f730 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
1f740 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1f750 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50  ags |= WINFILE_P
1f760 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65  SOW;.  }.  pFile
1f770 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  ->lastErrno = NO
1f780 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d  _ERROR;.  pFile-
1f790 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a  >zPath = zName;.
1f7a0 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20    pFile->hMap = 
1f7b0 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  NULL;.  pFile->p
1f7c0 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20  MapRegion = 0;. 
1f7d0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1f7e0 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d   = 0;.  pFile->m
1f7f0 6d 61 70 4f 72 69 67 73 69 7a 65 20 3d 20 30 3b  mapOrigsize = 0;
1f800 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 4c 69  .  pFile->mmapLi
1f810 6d 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  mit = SQLITE_DEF
1f820 41 55 4c 54 5f 4d 4d 41 50 5f 4c 49 4d 49 54 3b  AULT_MMAP_LIMIT;
1f830 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ..  OpenCounter(
1f840 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  +1);.  return rc
1f850 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
1f860 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65  e the named file
1f870 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1f880 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e  t Windows does n
1f890 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20  ot allow a file 
1f8a0 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 66  to be deleted if
1f8b0 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70   some other.** p
1f8c0 72 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f 70  rocess has it op
1f8d0 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61  en.  Sometimes a
1f8e0 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f   virus scanner o
1f8f0 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72  r indexing progr
1f900 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20  am.** will open 
1f910 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73  a journal file s
1f920 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74 20  hortly after it 
1f930 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72  is created in or
1f940 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61  der to do.** wha
1f950 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20 20  tever it does.  
1f960 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72  While this other
1f970 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
1f980 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ing the.** file 
1f990 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65  open, we will be
1f9a0 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74   unable to delet
1f9b0 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61  e it.  To work a
1f9c0 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72  round this.** pr
1f9d0 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20  oblem, we delay 
1f9e0 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  100 milliseconds
1f9f0 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65   and try to dele
1fa00 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a  te again.  Up.**
1fa10 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f   to MX_DELETION_
1fa20 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f  ATTEMPTs deletio
1fa30 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65 20 72  n attempts are r
1fa40 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67  un before giving
1fa50 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72  .** up and retur
1fa60 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
1fa70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1fa80 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
1fa90 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
1faa0 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
1fab0 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20  d on win32 */.  
1fac0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1fad0 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e  ename,      /* N
1fae0 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64  ame of file to d
1faf0 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73  elete */.  int s
1fb00 79 6e 63 44 69 72 20 20 20 20 20 20 20 20 20 20  yncDir          
1fb10 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
1fb20 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29  ed on win32 */.)
1fb30 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  {.  int cnt = 0;
1fb40 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f  .  int rc;.  DWO
1fb50 52 44 20 61 74 74 72 3b 0a 20 20 44 57 4f 52 44  RD attr;.  DWORD
1fb60 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 76 6f   lastErrno;.  vo
1fb70 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
1fb80 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1fb90 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53  ER(pVfs);.  UNUS
1fba0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e  ED_PARAMETER(syn
1fbb0 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61  cDir);..  Simula
1fbc0 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
1fbd0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
1fbe0 4c 45 54 45 29 3b 0a 20 20 7a 43 6f 6e 76 65 72  LETE);.  zConver
1fbf0 74 65 64 20 3d 20 63 6f 6e 76 65 72 74 55 74 66  ted = convertUtf
1fc00 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e  8Filename(zFilen
1fc10 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ame);.  if( zCon
1fc20 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
1fc30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1fc40 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
1fc50 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
1fc60 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c      do {.#if SQL
1fc70 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
1fc80 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
1fc90 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
1fca0 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65  trData;.      me
1fcb0 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
1fcc0 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
1fcd0 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66  Data));.      if
1fce0 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   ( osGetFileAttr
1fcf0 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65  ibutesExW(zConve
1fd00 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49  rted, GetFileExI
1fd10 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20  nfoStandard,.   
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
1fd40 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20  sAttrData) ){.  
1fd50 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
1fd60 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
1fd70 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
1fd80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 61  else{.        la
1fd90 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1fda0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1fdb0 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
1fdc0 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o==ERROR_FILE_NO
1fdd0 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20  T_FOUND.        
1fde0 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45   || lastErrno==E
1fdf0 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
1fe00 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UND ){.         
1fe10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1fe20 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
1fe30 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65   /* Already gone
1fe40 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  ? */.        }el
1fe50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
1fe60 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
1fe70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fe80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1fe90 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74  }.#else.      at
1fea0 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
1feb0 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65  tributesW(zConve
1fec0 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
1fed0 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49      if ( attr==I
1fee0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
1fef0 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20  IBUTES ){.      
1ff00 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
1ff10 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
1ff20 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
1ff30 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
1ff40 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20  E_NOT_FOUND.    
1ff50 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e       || lastErrn
1ff60 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o==ERROR_PATH_NO
1ff70 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
1ff80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1ff90 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
1ffa0 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  ENT; /* Already 
1ffb0 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
1ffc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ffd0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
1ffe0 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
1fff0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20000 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
20010 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49   attr&FILE_ATTRI
20020 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29  BUTE_DIRECTORY )
20030 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
20040 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
20050 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20  Files only. */. 
20060 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20070 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
20080 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a   osDeleteFileW(z
20090 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
200a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
200b0 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64  E_OK; /* Deleted
200c0 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   OK. */.        
200d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
200e0 20 20 20 20 20 69 66 20 28 20 21 72 65 74 72 79       if ( !retry
200f0 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
20100 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
20110 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
20120 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65  RROR; /* No more
20130 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20   retries. */.   
20140 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20150 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28    }.    } while(
20160 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  1);.  }.#ifdef S
20170 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
20180 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
20190 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74 74 72   do {.      attr
201a0 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
201b0 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65 72 74  ibutesA(zConvert
201c0 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  ed);.      if ( 
201d0 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49  attr==INVALID_FI
201e0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b  LE_ATTRIBUTES ){
201f0 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
20200 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
20210 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
20220 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
20230 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
20240 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
20250 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
20260 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
20270 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
20280 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
20290 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
202a0 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
202b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
202c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
202d0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
202e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
202f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
20300 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c     if ( attr&FIL
20310 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
20320 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  CTORY ){.       
20330 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
20340 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c  OR; /* Files onl
20350 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  y. */.        br
20360 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
20370 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65     if ( osDelete
20380 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74 65 64  FileA(zConverted
20390 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
203a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20  = SQLITE_OK; /* 
203b0 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20  Deleted OK. */. 
203c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
203d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
203e0 20 21 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e   !retryIoerr(&cn
203f0 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
20400 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
20410 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
20420 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e  No more retries.
20430 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
20440 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
20450 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23   while(1);.  }.#
20460 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20 26  endif.  if( rc &
20470 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
20480 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20  RR_DELETE_NOENT 
20490 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  ){.    rc = winL
204a0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
204b0 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73  OERR_DELETE, las
204c0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
204d0 20 20 20 20 20 22 77 69 6e 44 65 6c 65 74 65 22       "winDelete"
204e0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
204f0 7d 65 6c 73 65 7b 0a 20 20 20 20 6c 6f 67 49 6f  }else{.    logIo
20500 65 72 72 28 63 6e 74 29 3b 0a 20 20 7d 0a 20 20  err(cnt);.  }.  
20510 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
20520 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52  nverted);.  OSTR
20530 41 43 45 28 28 22 44 45 4c 45 54 45 20 5c 22 25  ACE(("DELETE \"%
20540 73 5c 22 20 25 73 5c 6e 22 2c 20 7a 46 69 6c 65  s\" %s\n", zFile
20550 6e 61 6d 65 2c 20 28 72 63 20 3f 20 22 66 61 69  name, (rc ? "fai
20560 6c 65 64 22 20 3a 20 22 6f 6b 22 20 29 29 29 3b  led" : "ok" )));
20570 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20580 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65  ./*.** Check the
20590 20 65 78 69 73 74 65 6e 63 65 20 61 6e 64 20 73   existence and s
205a0 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e  tatus of a file.
205b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
205c0 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  inAccess(.  sqli
205d0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
205e0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
205f0 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20  ed on win32 */. 
20600 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
20610 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e  lename,     /* N
20620 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63  ame of file to c
20630 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  heck */.  int fl
20640 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
20650 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
20660 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20  test to make on 
20670 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
20680 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
20690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
206a0 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20  : Result */.){. 
206b0 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69   DWORD attr;.  i
206c0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f  nt rc = 0;.  DWO
206d0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
206e0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
206f0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
20700 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53  ETER(pVfs);..  S
20710 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
20720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
20730 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20  ERR_ACCESS; );. 
20740 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f   zConverted = co
20750 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
20760 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
20770 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
20780 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
20790 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
207a0 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73  EM;.  }.  if( is
207b0 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  NT() ){.    int 
207c0 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e  cnt = 0;.    WIN
207d0 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  32_FILE_ATTRIBUT
207e0 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61  E_DATA sAttrData
207f0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41  ;.    memset(&sA
20800 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65  ttrData, 0, size
20810 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a  of(sAttrData));.
20820 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20      while( !(rc 
20830 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
20840 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54  butesExW((LPCWST
20850 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
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 47 65 74 46 69             GetFi
20880 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64  leExInfoStandard
20890 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20  &sAttrData)) && 
208c0 72 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  retryIoerr(&cnt,
208d0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
208e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
208f0 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53       /* For an S
20900 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
20910 53 54 53 20 71 75 65 72 79 2c 20 74 72 65 61 74  STS query, treat
20920 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66   a zero-length f
20930 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ile.      ** as 
20940 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  if it does not e
20950 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  xist..      */. 
20960 20 20 20 20 20 69 66 28 20 20 20 20 66 6c 61 67       if(    flag
20970 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53  s==SQLITE_ACCESS
20980 5f 45 58 49 53 54 53 0a 20 20 20 20 20 20 20 20  _EXISTS.        
20990 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e    && sAttrData.n
209a0 46 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 20  FileSizeHigh==0 
209b0 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41  .          && sA
209c0 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a  ttrData.nFileSiz
209d0 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  eLow==0 ){.     
209e0 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49     attr = INVALI
209f0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
20a00 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  S;.      }else{.
20a10 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73          attr = s
20a20 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41  AttrData.dwFileA
20a30 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20  ttributes;.     
20a40 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
20a50 20 20 20 20 6c 6f 67 49 6f 65 72 72 28 63 6e 74      logIoerr(cnt
20a60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73  );.      if( las
20a70 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49  tErrno!=ERROR_FI
20a80 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20  LE_NOT_FOUND && 
20a90 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52  lastErrno!=ERROR
20aa0 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
20ab0 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 4c 6f  ){.        winLo
20ac0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
20ad0 45 52 52 5f 41 43 43 45 53 53 2c 20 6c 61 73 74  ERR_ACCESS, last
20ae0 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73  Errno, "winAcces
20af0 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  s", zFilename);.
20b00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
20b10 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
20b20 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
20b30 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
20b40 43 45 53 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73  CESS;.      }els
20b50 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  e{.        attr 
20b60 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  = INVALID_FILE_A
20b70 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20  TTRIBUTES;.     
20b80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66   }.    }.  }.#if
20b90 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
20ba0 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
20bb0 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47  {.    attr = osG
20bc0 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
20bd0 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
20be0 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ted);.  }.#endif
20bf0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
20c00 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73  zConverted);.  s
20c10 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a  witch( flags ){.
20c20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20c30 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20  ACCESS_READ:.   
20c40 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
20c50 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20  ESS_EXISTS:.    
20c60 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56    rc = attr!=INV
20c70 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
20c80 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61  UTES;.      brea
20c90 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
20ca0 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
20cb0 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20  ITE:.      rc = 
20cc0 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
20cd0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26  LE_ATTRIBUTES &&
20ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61  .             (a
20cf0 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49  ttr & FILE_ATTRI
20d00 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d  BUTE_READONLY)==
20d10 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
20d20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
20d30 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61     assert(!"Inva
20d40 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65  lid flags argume
20d50 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  nt");.  }.  *pRe
20d60 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65 74  sOut = rc;.  ret
20d70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20d80 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  .../*.** Returns
20d90 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
20da0 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20   specified path 
20db0 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75  name should be u
20dc0 73 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49  sed verbatim.  I
20dd0 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  f.** non-zero is
20de0 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74   returned from t
20df0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
20e00 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
20e10 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a  on must simply.*
20e20 2a 20 75 73 65 20 74 68 65 20 70 72 6f 76 69 64  * use the provid
20e30 65 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72  ed path name ver
20e40 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c  batim -OR- resol
20e50 76 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c  ve it into a ful
20e60 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75  l path name.** u
20e70 73 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c  sing the GetFull
20e80 50 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41  PathName Win32 A
20e90 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20  PI function (if 
20ea0 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73  available)..*/.s
20eb0 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73  tatic BOOL winIs
20ec0 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
20ed0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
20ee0 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f  zPathname.){.  /
20ef0 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61  *.  ** If the pa
20f00 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
20f10 69 74 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c  ith a forward sl
20f20 61 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61  ash or a backsla
20f30 73 68 2c 20 69 74 20 69 73 20 65 69 74 68 65 72  sh, it is either
20f40 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e  .  ** a legal UN
20f50 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65  C name, a volume
20f60 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20   relative path, 
20f70 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70  or an absolute p
20f80 61 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a  ath name in the.
20f90 20 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d    ** "Unix" form
20fa0 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20  at on Windows.  
20fb0 54 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79  There is no easy
20fc0 20 77 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e   way to differen
20fd0 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20  tiate between.  
20fe0 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f  ** the final two
20ff0 20 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72   cases; therefor
21000 65 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68 65  e, we return the
21010 20 73 61 66 65 72 20 72 65 74 75 72 6e 20 76 61   safer return va
21020 6c 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a  lue of TRUE.  **
21030 20 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73   so that callers
21040 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
21050 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73  n will simply us
21060 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20  e it verbatim.. 
21070 20 2a 2f 0a 20 20 69 66 20 28 20 7a 50 61 74 68   */.  if ( zPath
21080 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 7c 7c 20  name[0]=='/' || 
21090 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 3d 3d 27 5c  zPathname[0]=='\
210a0 5c 27 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  \' ){.    return
210b0 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   TRUE;.  }..  /*
210c0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74  .  ** If the pat
210d0 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69  h name starts wi
210e0 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64 20  th a letter and 
210f0 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69  a colon it is ei
21100 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20  ther a volume.  
21110 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  ** relative path
21120 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   or an absolute 
21130 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f  path.  Callers o
21140 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
21150 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74  must not.  ** at
21160 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20 69  tempt to treat i
21170 74 20 61 73 20 61 20 72 65 6c 61 74 69 76 65 20  t as a relative 
21180 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20  path name (i.e. 
21190 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d 70  they should simp
211a0 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20 76  ly use.  ** it v
211b0 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20  erbatim)..  */. 
211c0 20 69 66 20 28 20 73 71 6c 69 74 65 33 49 73 61   if ( sqlite3Isa
211d0 6c 70 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30  lpha(zPathname[0
211e0 5d 29 20 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b  ]) && zPathname[
211f0 31 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 72  1]==':' ){.    r
21200 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a  eturn TRUE;.  }.
21210 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  /*.  ** If we
21220 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
21230 6e 74 2c 20 74 68 65 20 70 61 74 68 20 6e 61 6d  nt, the path nam
21240 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20  e should almost 
21250 63 65 72 74 61 69 6e 6c 79 20 62 65 20 61 20 70  certainly be a p
21260 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74  urely.  ** relat
21270 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f  ive one (i.e. no
21280 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f  t a UNC name, no
21290 74 20 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20  t absolute, and 
212a0 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74  not volume relat
212b0 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  ive)..  */.  ret
212c0 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a  urn FALSE;.}../*
212d0 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
212e0 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
212f0 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
21300 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 66 75  e.  Write the fu
21310 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69  ll.** pathname i
21320 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75  nto zOut[].  zOu
21330 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c  t[] will be at l
21340 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74  east pVfs->mxPat
21350 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69  hname.** bytes i
21360 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
21370 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74  c int winFullPat
21380 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33  hname(.  sqlite3
21390 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
213a0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
213b0 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
213c0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
213d0 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20  *zRelative,     
213e0 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72     /* Possibly r
213f0 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61  elative input pa
21400 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c  th */.  int nFul
21410 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
21420 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
21430 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
21440 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
21450 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20  r *zFull        
21460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
21470 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29  tput buffer */.)
21480 7b 0a 20 20 0a 23 69 66 20 64 65 66 69 6e 65 64  {.  .#if defined
21490 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53  (__CYGWIN__).  S
214a0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
214b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
214c0 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ROR );.  UNUSED_
214d0 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29  PARAMETER(nFull)
214e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
214f0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3e 3d 4d 41  ->mxPathname>=MA
21500 58 5f 50 41 54 48 20 29 3b 0a 20 20 61 73 73 65  X_PATH );.  asse
21510 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73 2d  rt( nFull>=pVfs-
21520 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20  >mxPathname );. 
21530 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
21540 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
21550 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
21560 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
21570 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
21580 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
21590 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
215a0 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
215b0 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
215c0 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
215d0 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
215e0 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
215f0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
21600 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
21610 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
21620 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
21630 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
21640 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
21650 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
21660 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
21670 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73 6c  rectory and a sl
21680 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
21690 63 68 61 72 20 7a 4f 75 74 5b 4d 41 58 5f 50 41  char zOut[MAX_PA
216a0 54 48 2b 31 5d 3b 0a 20 20 20 20 6d 65 6d 73 65  TH+1];.    memse
216b0 74 28 7a 4f 75 74 2c 20 30 2c 20 4d 41 58 5f 50  t(zOut, 0, MAX_P
216c0 41 54 48 2b 31 29 3b 0a 20 20 20 20 63 79 67 77  ATH+1);.    cygw
216d0 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 43 43 50  in_conv_path(CCP
216e0 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 7c  _POSIX_TO_WIN_A|
216f0 43 43 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52  CCP_RELATIVE, zR
21700 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 0a 20  elative, zOut,. 
21710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21720 20 20 20 20 4d 41 58 5f 50 41 54 48 2b 31 29 3b      MAX_PATH+1);
21730 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
21740 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
21750 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
21760 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c  e), zFull, "%s\\
21770 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
21780 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21790 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
217a0 2c 20 7a 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65  , zOut);.  }else
217b0 7b 0a 20 20 20 20 63 79 67 77 69 6e 5f 63 6f 6e  {.    cygwin_con
217c0 76 5f 70 61 74 68 28 43 43 50 5f 50 4f 53 49 58  v_path(CCP_POSIX
217d0 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 52 65 6c 61  _TO_WIN_A, zRela
217e0 74 69 76 65 2c 20 7a 46 75 6c 6c 2c 20 6e 46 75  tive, zFull, nFu
217f0 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ll);.  }.  retur
21800 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
21810 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49 54 45  dif..#if (SQLITE
21820 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c  _OS_WINCE || SQL
21830 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26  ITE_OS_WINRT) &&
21840 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57   !defined(__CYGW
21850 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65  IN__).  Simulate
21860 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
21870 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
21880 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e    /* WinCE has n
21890 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72  o concept of a r
218a0 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
218b0 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c  , or so I am tol
218c0 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e 52 54  d. */.  /* WinRT
218d0 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f 20 63   has no way to c
218e0 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74 69 76  onvert a relativ
218f0 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61 62 73  e path to an abs
21900 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20  olute one. */.  
21910 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74  if ( sqlite3_dat
21920 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20 21  a_directory && !
21930 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
21940 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29  hname(zRelative)
21950 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
21960 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64  * NOTE: We are d
21970 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65  ealing with a re
21980 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
21990 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20   and the data.  
219a0 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63    **       direc
219b0 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73 65  tory has been se
219c0 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75  t.  Therefore, u
219d0 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61 73  se it as the bas
219e0 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  is.    **       
219f0 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74  for converting t
21a00 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
21a10 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f   name to an abso
21a20 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20  lute.    **     
21a30 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64    one by prepend
21a40 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69 72  ing the data dir
21a50 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63  ectory and a bac
21a60 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20  kslash..    */. 
21a70 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
21a80 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
21a90 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
21aa0 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 5c 5c 25 73  , zFull, "%s\\%s
21ab0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
21ac0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
21ad0 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20  data_directory, 
21ae0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 65  zRelative);.  }e
21af0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
21b00 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46  _snprintf(MIN(nF
21b10 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ull, pVfs->mxPat
21b20 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22  hname), zFull, "
21b30 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  %s", zRelative);
21b40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
21b50 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
21b60 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
21b70 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
21b80 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65  _OS_WINRT && !de
21b90 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
21ba0 29 0a 20 20 44 57 4f 52 44 20 6e 42 79 74 65 3b  ).  DWORD nByte;
21bb0 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
21bc0 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75  ted;.  char *zOu
21bd0 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  t;..  /* If this
21be0 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e   path name begin
21bf0 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68  s with "/X:", wh
21c00 65 72 65 20 22 58 22 20 69 73 20 61 6e 79 20 61  ere "X" is any a
21c10 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63  lphabetic.  ** c
21c20 68 61 72 61 63 74 65 72 2c 20 64 69 73 63 61 72  haracter, discar
21c30 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f  d the initial "/
21c40 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e  " from the pathn
21c50 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
21c60 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f  zRelative[0]=='/
21c70 27 20 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c  ' && sqlite3Isal
21c80 70 68 61 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d  pha(zRelative[1]
21c90 29 20 26 26 20 7a 52 65 6c 61 74 69 76 65 5b 32  ) && zRelative[2
21ca0 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 7a 52  ]==':' ){.    zR
21cb0 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a  elative++;.  }..
21cc0 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
21cd0 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
21ce0 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
21cf0 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
21d00 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
21d10 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
21d20 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
21d30 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
21d40 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
21d50 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
21d60 67 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  g. This function
21d70 20 63 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20   could fail if, 
21d80 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  for example, the
21d90 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f  .  ** current wo
21da0 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20  rking directory 
21db0 68 61 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65  has been unlinke
21dc0 64 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  d..  */.  Simula
21dd0 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
21de0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
21df0 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  ;.  if ( sqlite3
21e00 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
21e10 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69  && !winIsVerbati
21e20 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74  mPathname(zRelat
21e30 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  ive) ){.    /*. 
21e40 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61     ** NOTE: We a
21e50 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
21e60 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
21e70 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
21e80 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64  a.    **       d
21e90 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
21ea0 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72  n set.  Therefor
21eb0 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65  e, use it as the
21ec0 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20   basis.    **   
21ed0 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69      for converti
21ee0 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ng the relative 
21ef0 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20  path name to an 
21f00 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20  absolute.    ** 
21f10 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65        one by pre
21f20 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61  pending the data
21f30 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61   directory and a
21f40 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20   backslash..    
21f50 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
21f60 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
21f70 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
21f80 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
21f90 5c 5c 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  \\%s",.         
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21fb0 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
21fc0 72 79 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  ry, zRelative);.
21fd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21fe0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e  E_OK;.  }.  zCon
21ff0 76 65 72 74 65 64 20 3d 20 63 6f 6e 76 65 72 74  verted = convert
22000 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65  Utf8Filename(zRe
22010 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a  lative);.  if( z
22020 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
22030 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
22040 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
22050 20 7d 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20   }.  if( isNT() 
22060 29 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54  ){.    LPWSTR zT
22070 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d  emp;.    nByte =
22080 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
22090 6d 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  meW((LPCWSTR)zCo
220a0 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30  nverted, 0, 0, 0
220b0 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
220c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  ==0 ){.      win
220d0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
220e0 45 52 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74  ERROR, osGetLast
220f0 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
22100 20 20 20 20 20 20 20 20 20 20 20 22 47 65 74 46             "GetF
22110 75 6c 6c 50 61 74 68 4e 61 6d 65 57 31 22 2c 20  ullPathNameW1", 
22120 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
22130 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22140 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
22150 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
22160 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
22170 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  TH;.    }.    nB
22180 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54  yte += 3;.    zT
22190 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  emp = sqlite3Mal
221a0 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
221b0 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20  izeof(zTemp[0]) 
221c0 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70  );.    if( zTemp
221d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
221e0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
221f0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
22200 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
22210 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
22220 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
22230 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50  ullPathNameW((LP
22240 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
22250 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20  , nByte, zTemp, 
22260 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
22270 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 69  e==0 ){.      wi
22280 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
22290 5f 45 52 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73  _ERROR, osGetLas
222a0 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
222b0 20 20 20 20 20 20 20 20 20 20 20 20 22 47 65 74              "Get
222c0 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 32 22 2c  FullPathNameW2",
222d0 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20   zConverted);.  
222e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
222f0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
22300 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22310 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72  (zTemp);.      r
22320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
22330 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a  TOPEN_FULLPATH;.
22340 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
22350 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
22360 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 75  d);.    zOut = u
22370 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
22380 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mp);.    sqlite3
22390 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
223a0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
223b0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
223c0 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
223d0 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74  *zTemp;.    nByt
223e0 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
223f0 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43  hNameA((char*)zC
22400 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20  onverted, 0, 0, 
22410 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
22420 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 69  e==0 ){.      wi
22430 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
22440 5f 45 52 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73  _ERROR, osGetLas
22450 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
22460 20 20 20 20 20 20 20 20 20 20 20 20 22 47 65 74              "Get
22470 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 31 22 2c  FullPathNameA1",
22480 20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20   zConverted);.  
22490 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
224a0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
224b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
224c0 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
224d0 41 54 48 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  ATH;.    }.    n
224e0 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a  Byte += 3;.    z
224f0 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  Temp = sqlite3Ma
22500 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a  llocZero( nByte*
22510 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29  sizeof(zTemp[0])
22520 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d   );.    if( zTem
22530 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  p==0 ){.      sq
22540 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
22550 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
22560 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
22570 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  R_NOMEM;.    }. 
22580 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
22590 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63  FullPathNameA((c
225a0 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c  har*)zConverted,
225b0 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30   nByte, zTemp, 0
225c0 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
225d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  ==0 ){.      win
225e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
225f0 45 52 52 4f 52 2c 20 6f 73 47 65 74 4c 61 73 74  ERROR, osGetLast
22600 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
22610 20 20 20 20 20 20 20 20 20 20 20 22 47 65 74 46             "GetF
22620 75 6c 6c 50 61 74 68 4e 61 6d 65 41 32 22 2c 20  ullPathNameA2", 
22630 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
22640 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22650 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
22660 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22670 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65  zTemp);.      re
22680 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
22690 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3b 0a 20  OPEN_FULLPATH;. 
226a0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
226b0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
226c0 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 73 71  );.    zOut = sq
226d0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
226e0 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b  _to_utf8(zTemp);
226f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
22700 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65  e(zTemp);.  }.#e
22710 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20  ndif.  if( zOut 
22720 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
22730 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
22740 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
22750 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
22760 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  ", zOut);.    sq
22770 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
22780 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
22790 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
227a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
227b0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
227c0 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69    }.#endif.}..#i
227d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
227e0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
227f0 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
22800 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20  s for opening a 
22810 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
22820 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f  finding entry po
22830 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ints.** within t
22840 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
22850 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74  y, and closing t
22860 68 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72  he shared librar
22870 79 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  y..*/./*.** Inte
22880 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
22890 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
228a0 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
228b0 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
228c0 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
228d0 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
228e0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
228f0 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ibrary..*/.stati
22900 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65  c void *winDlOpe
22910 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  n(sqlite3_vfs *p
22920 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
22930 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48  *zFilename){.  H
22940 41 4e 44 4c 45 20 68 3b 0a 20 20 76 6f 69 64 20  ANDLE h;.  void 
22950 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 63 6f  *zConverted = co
22960 6e 76 65 72 74 55 74 66 38 46 69 6c 65 6e 61 6d  nvertUtf8Filenam
22970 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
22980 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
22990 28 70 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 43  (pVfs);.  if( zC
229a0 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
229b0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
229c0 0a 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b  .  if( isNT() ){
229d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
229e0 49 4e 52 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c  INRT.    h = osL
229f0 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
22a00 72 79 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  ry((LPCWSTR)zCon
22a10 76 65 72 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73  verted, 0);.#els
22a20 65 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64  e.    h = osLoad
22a30 4c 69 62 72 61 72 79 57 28 28 4c 50 43 57 53 54  LibraryW((LPCWST
22a40 52 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  R)zConverted);.#
22a50 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66  endif.  }.#ifdef
22a60 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
22a70 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
22a80 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62     h = osLoadLib
22a90 72 61 72 79 41 28 28 63 68 61 72 2a 29 7a 43 6f  raryA((char*)zCo
22aa0 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65  nverted);.  }.#e
22ab0 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66  ndif.  sqlite3_f
22ac0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
22ad0 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a  .  return (void*
22ae0 29 68 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  )h;.}.static voi
22af0 64 20 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c  d winDlError(sql
22b00 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
22b10 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
22b20 7a 42 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53  zBufOut){.  UNUS
22b30 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
22b40 73 29 3b 0a 20 20 67 65 74 4c 61 73 74 45 72 72  s);.  getLastErr
22b50 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45  orMsg(osGetLastE
22b60 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42  rror(), nBuf, zB
22b70 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63  ufOut);.}.static
22b80 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d   void (*winDlSym
22b90 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
22ba0 66 73 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73  fs,void *pH,cons
22bb0 74 20 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76  t char *zSym))(v
22bc0 6f 69 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  oid){.  UNUSED_P
22bd0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
22be0 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a    return (void(*
22bf0 29 28 76 6f 69 64 29 29 6f 73 47 65 74 50 72 6f  )(void))osGetPro
22c00 63 41 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c  cAddressA((HANDL
22c10 45 29 70 48 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73  E)pH, zSym);.}.s
22c20 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c  tatic void winDl
22c30 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
22c40 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70  s *pVfs, void *p
22c50 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45  Handle){.  UNUSE
22c60 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
22c70 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61  );.  osFreeLibra
22c80 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64  ry((HANDLE)pHand
22c90 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  le);.}.#else /* 
22ca0 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  if SQLITE_OMIT_L
22cb0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73  OAD_EXTENSION is
22cc0 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23   defined: */.  #
22cd0 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e  define winDlOpen
22ce0 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
22cf0 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  nDlError 0.  #de
22d00 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20  fine winDlSym   
22d10 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
22d20 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
22d30 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70  ../*.** Write up
22d40 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f   to nBuf bytes o
22d50 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74  f randomness int
22d60 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  o zBuf..*/.stati
22d70 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e  c int winRandomn
22d80 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
22d90 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
22da0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
22db0 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55 4e 55  int n = 0;.  UNU
22dc0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
22dd0 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  fs);.#if defined
22de0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
22df0 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73  n = nBuf;.  mems
22e00 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66  et(zBuf, 0, nBuf
22e10 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73  );.#else.  if( s
22e20 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45  izeof(SYSTEMTIME
22e30 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20  )<=nBuf-n ){.   
22e40 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20   SYSTEMTIME x;. 
22e50 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69     osGetSystemTi
22e60 6d 65 28 26 78 29 3b 0a 20 20 20 20 6d 65 6d 63  me(&x);.    memc
22e70 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 78 2c  py(&zBuf[n], &x,
22e80 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20   sizeof(x));.   
22e90 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 78 29 3b   n += sizeof(x);
22ea0 0a 20 20 7d 0a 20 20 69 66 28 20 73 69 7a 65 6f  .  }.  if( sizeo
22eb0 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75 66 2d 6e  f(DWORD)<=nBuf-n
22ec0 20 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69   ){.    DWORD pi
22ed0 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74  d = osGetCurrent
22ee0 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20  ProcessId();.   
22ef0 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
22f00 2c 20 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 70  , &pid, sizeof(p
22f10 69 64 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73  id));.    n += s
22f20 69 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 7d 0a  izeof(pid);.  }.
22f30 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
22f40 4e 52 54 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  NRT.  if( sizeof
22f50 28 55 4c 4f 4e 47 4c 4f 4e 47 29 3c 3d 6e 42 75  (ULONGLONG)<=nBu
22f60 66 2d 6e 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47  f-n ){.    ULONG
22f70 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65 74  LONG cnt = osGet
22f80 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20  TickCount64();. 
22f90 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
22fa0 6e 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66  n], &cnt, sizeof
22fb0 28 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d  (cnt));.    n +=
22fc0 20 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20   sizeof(cnt);.  
22fd0 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 73 69  }.#else.  if( si
22fe0 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e 42 75  zeof(DWORD)<=nBu
22ff0 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  f-n ){.    DWORD
23000 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b   cnt = osGetTick
23010 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20 6d 65 6d  Count();.    mem
23020 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 63  cpy(&zBuf[n], &c
23030 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29 29  nt, sizeof(cnt))
23040 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
23050 66 28 63 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e 64  f(cnt);.  }.#end
23060 69 66 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  if.  if( sizeof(
23070 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29 3c 3d  LARGE_INTEGER)<=
23080 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 4c 41  nBuf-n ){.    LA
23090 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20  RGE_INTEGER i;. 
230a0 20 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72     osQueryPerfor
230b0 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29  manceCounter(&i)
230c0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
230d0 75 66 5b 6e 5d 2c 20 26 69 2c 20 73 69 7a 65 6f  uf[n], &i, sizeo
230e0 66 28 69 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  f(i));.    n += 
230f0 73 69 7a 65 6f 66 28 69 29 3b 0a 20 20 7d 0a 23  sizeof(i);.  }.#
23100 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e  endif.  return n
23110 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ;.}.../*.** Slee
23120 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
23130 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
23140 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
23150 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69   slept..*/.stati
23160 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73  c int winSleep(s
23170 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
23180 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b  , int microsec){
23190 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  .  sqlite3_win32
231a0 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63  _sleep((microsec
231b0 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55  +999)/1000);.  U
231c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
231d0 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVfs);.  return 
231e0 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f  ((microsec+999)/
231f0 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f  1000)*1000;.}../
23200 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
23210 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
23220 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
23230 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65  o value, is inte
23240 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68  rpreted as.** th
23250 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  e number of seco
23260 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61  nds since 1970 a
23270 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  nd is used to se
23280 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a  t the result of.
23290 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  ** sqlite3OsCurr
232a0 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67  entTime() during
232b0 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66   testing..*/.#if
232c0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
232d0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
232e0 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f  ent_time = 0;  /
232f0 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69  * Fake system ti
23300 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69  me in seconds si
23310 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e  nce 1970. */.#en
23320 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  dif../*.** Find 
23330 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
23340 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
23350 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
23360 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
23370 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72  iNow.** the curr
23380 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74  ent time and dat
23390 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
233a0 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38  y number times 8
233b0 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a  6_400_000.  In.*
233c0 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77  * other words, w
233d0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
233e0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d   the number of m
233f0 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63  illiseconds sinc
23400 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20  e the Julian.** 
23410 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e  epoch of noon in
23420 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f   Greenwich on No
23430 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20  vember 24, 4714 
23440 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  B.C according to
23450 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69   the.** prolepti
23460 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65  c Gregorian cale
23470 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  ndar..**.** On s
23480 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53  uccess, return S
23490 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72  QLITE_OK.  Retur
234a0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69  n SQLITE_ERROR i
234b0 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
234c0 61 74 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  ate .** cannot b
234d0 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
234e0 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e  ic int winCurren
234f0 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74  tTimeInt64(sqlit
23500 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71  e3_vfs *pVfs, sq
23510 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e  lite3_int64 *piN
23520 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49  ow){.  /* FILETI
23530 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ME structure is 
23540 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72  a 64-bit value r
23550 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20  epresenting the 
23560 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20 20 20  number of .     
23570 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69  100-nanosecond i
23580 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a  ntervals since J
23590 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28  anuary 1, 1601 (
235a0 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e  = JD 2305813.5).
235b0 20 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d   .  */.  FILETIM
235c0 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63  E ft;.  static c
235d0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
235e0 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70  64 winFiletimeEp
235f0 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28  och = 23058135*(
23600 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
23610 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51  40000;.#ifdef SQ
23620 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74  LITE_TEST.  stat
23630 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
23640 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68  _int64 unixEpoch
23650 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c   = 24405875*(sql
23660 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30  ite3_int64)86400
23670 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20  00;.#endif.  /* 
23680 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20  2^32 - to avoid 
23690 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61  use of LL and wa
236a0 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f  rnings in gcc */
236b0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
236c0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61  sqlite3_int64 ma
236d0 78 33 32 42 69 74 56 61 6c 75 65 20 3d 20 0a 20  x32BitValue = . 
236e0 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e       (sqlite3_in
236f0 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b  t64)2000000000 +
23700 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
23710 32 30 30 30 30 30 30 30 30 30 20 2b 0a 20 20 20  2000000000 +.   
23720 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
23730 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69  4)294967296;..#i
23740 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
23750 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74  E.  SYSTEMTIME t
23760 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74  ime;.  osGetSyst
23770 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20  emTime(&time);. 
23780 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d   /* if SystemTim
23790 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61  eToFileTime() fa
237a0 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20  ils, it returns 
237b0 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21  zero. */.  if (!
237c0 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  osSystemTimeToFi
237d0 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74  leTime(&time,&ft
237e0 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  )){.    return S
237f0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
23800 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79  .#else.  osGetSy
23810 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
23820 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69  me( &ft );.#endi
23830 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69  f..  *piNow = wi
23840 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b  nFiletimeEpoch +
23850 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28 28  .            (((
23860 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66  (sqlite3_int64)f
23870 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65  t.dwHighDateTime
23880 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29  )*max32BitValue)
23890 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   + .            
238a0 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
238b0 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69  4)ft.dwLowDateTi
238c0 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74  me)/(sqlite3_int
238d0 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65  64)10000;..#ifde
238e0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
238f0 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
23900 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
23910 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73  *piNow = 1000*(s
23920 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c  qlite3_int64)sql
23930 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
23940 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20  e + unixEpoch;. 
23950 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53   }.#endif.  UNUS
23960 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
23970 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  s);.  return SQL
23980 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
23990 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
239a0 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
239b0 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
239c0 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
239d0 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
239e0 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
239f0 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
23a00 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
23a10 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
23a20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
23a30 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
23a40 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
23a50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
23a60 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  nCurrentTime(sql
23a70 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
23a80 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
23a90 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
23aa0 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72  te3_int64 i;.  r
23ab0 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69  c = winCurrentTi
23ac0 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69  meInt64(pVfs, &i
23ad0 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a  );.  if( !rc ){.
23ae0 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38      *prNow = i/8
23af0 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20  6400000.0;.  }. 
23b00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23b10 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73  *.** The idea is
23b20 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
23b30 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61  ion works like a
23b40 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a   combination of.
23b50 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  ** GetLastError(
23b60 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73  ) and FormatMess
23b70 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73  age() on Windows
23b80 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a   (or errno and.*
23b90 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f  * strerror_r() o
23ba0 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61  n Unix). After a
23bb0 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
23bc0 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20  ned by an OS.** 
23bd0 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65  function, SQLite
23be0 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
23bf0 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70  tion with zBuf p
23c00 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20  ointing to.** a 
23c10 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62  buffer of nBuf b
23c20 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79  ytes. The OS lay
23c30 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61  er should popula
23c40 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72  te the.** buffer
23c50 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d   with a nul-term
23c60 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63  inated UTF-8 enc
23c70 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61  oded error messa
23c80 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67  ge.** describing
23c90 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72   the last IO err
23ca0 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72  or to have occur
23cb0 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  red within the c
23cc0 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64  alling.** thread
23cd0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
23ce0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
23cf0 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68  too large for th
23d00 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65  e supplied buffe
23d10 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20  r,.** it should 
23d20 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68  be truncated. Th
23d30 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
23d40 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a  f xGetLastError.
23d50 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
23d60 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
23d70 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
23d80 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
23d90 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
23da0 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
23db0 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20   truncated). If 
23dc0 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
23dd0 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74  rned,.** then it
23de0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
23df0 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  y to include the
23e00 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
23e10 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20  character.** in 
23e20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
23e30 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70  r..**.** Not sup
23e40 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  plying an error 
23e50 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76  message will hav
23e60 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66  e no adverse eff
23e70 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65  ect.** on SQLite
23e80 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20  . It is fine to 
23e90 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  have an implemen
23ea0 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65  tation that neve
23eb0 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20  r.** returns an 
23ec0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a  error message:.*
23ed0 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c  *.**   int xGetL
23ee0 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
23ef0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
23f00 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
23f10 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ){.**     assert
23f20 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b  (zBuf[0]=='\0');
23f30 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30  .**     return 0
23f40 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48  ;.**   }.**.** H
23f50 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72  owever if an err
23f60 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75  or message is su
23f70 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20  pplied, it will 
23f80 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a  be incorporated.
23f90 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74  ** by sqlite int
23fa0 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  o the error mess
23fb0 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  age available to
23fc0 20 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a   the user using.
23fd0 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ** sqlite3_errms
23fe0 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61  g(), possibly ma
23ff0 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65  king IO errors e
24000 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a  asier to debug..
24010 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
24020 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  nGetLastError(sq
24030 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
24040 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
24050 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
24060 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
24070 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 4c 61  ;.  return getLa
24080 73 74 45 72 72 6f 72 4d 73 67 28 6f 73 47 65 74  stErrorMsg(osGet
24090 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 6e 42 75  LastError(), nBu
240a0 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a  f, zBuf);.}../*.
240b0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  ** Initialize an
240c0 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74  d deinitialize t
240d0 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
240e0 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  tem interface..*
240f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  /.int sqlite3_os
24100 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73  _init(void){.  s
24110 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
24120 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20  s winVfs = {.   
24130 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
24140 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
24150 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28  n */.    sizeof(
24160 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a  winFile),     /*
24170 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20   szOsFile */.   
24180 20 4d 41 58 5f 50 41 54 48 2c 20 20 20 20 20 20   MAX_PATH,      
24190 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e        /* mxPathn
241a0 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
241b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241c0 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20  /* pNext */.    
241d0 22 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20  "win32",        
241e0 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f       /* zName */
241f0 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
24200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70            /* pAp
24210 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e  pData */.    win
24220 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
24230 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20    /* xOpen */.  
24240 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20    winDelete,    
24250 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
24260 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65  e */.    winAcce
24270 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ss,           /*
24280 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   xAccess */.    
24290 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  winFullPathname,
242a0 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74       /* xFullPat
242b0 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  hname */.    win
242c0 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  DlOpen,         
242d0 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a    /* xDlOpen */.
242e0 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20      winDlError, 
242f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
24300 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44  rror */.    winD
24310 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
24320 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20   /* xDlSym */.  
24330 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20    winDlClose,   
24340 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f         /* xDlClo
24350 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e  se */.    winRan
24360 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f  domness,       /
24370 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
24380 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20  .    winSleep,  
24390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
243a0 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  eep */.    winCu
243b0 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
243c0 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
243d0 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73  */.    winGetLas
243e0 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78  tError,     /* x
243f0 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a  GetLastError */.
24400 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
24410 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72  meInt64, /* xCur
24420 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f  rentTimeInt64 */
24430 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65  .    winSetSyste
24440 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65  mCall,    /* xSe
24450 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
24460 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43     winGetSystemC
24470 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53  all,    /* xGetS
24480 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
24490 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61   winNextSystemCa
244a0 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79  ll,   /* xNextSy
244b0 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b  stemCall */.  };
244c0 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68  ..  /* Double-ch
244d0 65 63 6b 20 74 68 61 74 20 74 68 65 20 61 53 79  eck that the aSy
244e0 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61  scall[] array ha
244f0 73 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  s been construct
24500 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c  ed.  ** correctl
24510 79 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b  y.  See ticket [
24520 62 62 33 61 38 36 65 38 39 30 63 38 65 39 36 61  bb3a86e890c8e96a
24530 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  b] */.  assert( 
24540 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
24550 6c 6c 29 3d 3d 37 34 20 29 3b 0a 0a 20 20 2f 2a  ll)==74 );..  /*
24560 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20   get memory map 
24570 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75  allocation granu
24580 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73  larity */.  mems
24590 65 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20  et(&winSysInfo, 
245a0 30 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d  0, sizeof(SYSTEM
245b0 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c  _INFO));.#if SQL
245c0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f  ITE_OS_WINRT.  o
245d0 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d  sGetNativeSystem
245e0 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f  Info(&winSysInfo
245f0 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74  );.#else.  osGet
24600 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53  SystemInfo(&winS
24610 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a  ysInfo);.#endif.
24620 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73    assert( winSys
24630 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f  Info.dwAllocatio
24640 6e 47 72 61 6e 75 6c 61 72 69 74 79 3e 30 20 29  nGranularity>0 )
24650 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  ;.  assert( winS
24660 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a  ysInfo.dwPageSiz
24670 65 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  e>0 );..  sqlite
24680 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
24690 77 69 6e 56 66 73 2c 20 31 29 3b 0a 20 20 72 65  winVfs, 1);.  re
246a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
246b0 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .}..int sqlite3_
246c0 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a 23  os_end(void){ .#
246d0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
246e0 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62  RT.  if( sleepOb
246f0 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f  j!=NULL ){.    o
24700 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65  sCloseHandle(sle
24710 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65  epObj);.    slee
24720 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  pObj = NULL;.  }
24730 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
24740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
24750 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
24760 4f 53 5f 57 49 4e 20 2a 2f 0a                    OS_WIN */.